知行编程网知行编程网  2022-03-27 04:00 知行编程网 隐藏边栏 |   抢沙发  6 
文章评分 0 次,平均分 0.0

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


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


01


常识科普


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

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

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


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

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


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


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


02


计算思路


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

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

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

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

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

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

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

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



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日,也就是词中“天上宫阙”的年月了


近期热门:

3个月还没入门Python,看这100名小伙伴3周学Python的杰作

想不想有一张明星脸,来看看用Python玩人脸合成

90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来


本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享