千年前的古诗,苏轼的不知月亮上是何年何月|现在我用Python来计算出来了

来自:菜鸟学Python(微信号:cainiao_xueyuan),作者:奔跑的鳄鱼

“明月几时有?把酒问青天。不知天上宫阙,今夕是何年。”苏轼的这首《水调歌头·明月几时有》想必大家都不陌生,其中的“天上宫阙”意为月亮上的宫殿、特指月亮。只不过,苏轼不知道当年的月亮上是何年何月,我们却能计算出来。



01


常识科普


地球上的早晨和傍晚,我们可以看到日出前和日落后的光芒,这种现象叫做“晨昏蒙影”、又叫作“曙暮光”。

但是月球上由于没有大气,光线不能散射,因此看不到这种美丽的景象,月球上的昼夜交替是非常突然的。


同时,月球的昼夜交替是自转和公转共同作用的结果,其昼夜交替要比地球慢地多。一般来说,月球上太阳“升起”后要经过160多小时才能到达月球的正当空,从正当空落到“月平线”以下又需要160多小时,这是月球上的白昼;


再经过320多小时的黑夜,才是月球上完整的一天。准确来说,地球上的一天是23小时56分04秒,而月球上的一天则是655.71984个小时,也就是说,月球上的一天大约相当于地球上的27.32天。



02


计算思路


仅仅知道了时间长度还不足以计算日期,我们还需要设置一个基准点,本文中,我们将公元1年1月1日的0时为月球和地球共同的时间基准点,这样一来,计算月球上的日期就变得可行了。

  • 第一步,对于某个特定的地球历,可以计算出它距离基准时间点过了多少天,例如公元0年1月2日18时距离基准时间点过了1.75天;

  • 第二步,根据地球和月球一天时间长度的对应关系,计算出月球日期距离基准时间点的天数,例如上一步中的地球日期在月球上相对基准时间点经过的天数为0.064天;

  • 第三步,根据月球上相对基准时间点经过的天数,计算月球上的日期。

当然,这样计算得出的月球日期会有些许误差,事实上,威斯康星大学麦迪逊分校地球科学教授斯蒂芬·梅尔斯团队的最新研究表明,月球正以约3.82厘米/年的速度缓慢离开地球,导致地球自转变慢,地球上的每一天也在慢慢变长。

在14亿年前,月地之间的距离更近,地球自转得更快,当时地球上的一天仅为18小时。

这样看来,我们对月球日期的计算误差也就在可接受范围之内了。



03


Python实现


计算思路清晰了,用python实现起来也就非常简单了。具体代码实现如下:

其中,我们依次构建了几个函数:

  • get_standard用来计算基准时间点

  • get_earth_days计算指定地球日期距离基准时间点的地球天数

  • get_moon_days计算指定日期距离基准时间点的月球天数

  • get_moon_date用来计算指定地球日期相对应的月球日期。

下面我们就来测试一下程序运行情况,苏轼的《水调歌头·明月几时有》写于“丙辰中秋”,根据推算应该是公元1076年9月21日,假设当时时间为20时,那么我们的地球日期输入就是“1076-09-21 20”,把它放到程序中跑一跑,就得到了当时的月球日期40年5月17日,也就是词中“天上宫阙”的年月了

推荐↓↓↓
Python编程
上一篇:90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来 下一篇:不到20行代码,用Python做一个智能聊天机器人