有了恒星位置的计算方法,就可以反求恒星在某位置时的时间。
star模块即恒星位置计算,参见https://blog.csdn.net/weixin_42763614/article/details/83388789
反求时间即利用插值法逆求。
from star import *
def interpolation(star, angle, t2): # 插值计算,t为儒略世纪数
if angle == 0: angle = 360
t1 = t2 - 5
t3 = t2 + 5
n0 = 0 # 初值
appPlace(star, t1)
ra1 = star.ra % 360 * 3600 # 改为角秒计算以获得较精确结果
appPlace(star, t2)
ra2 = star.ra % 360 * 3600
appPlace(star, t3)
ra3 = star.ra % 360 * 3600
a = ra2 - ra1
b = ra3 - ra2
c = ra1 + ra3 - 2*ra2
while True:
n = -2 * (ra2 - angle*3600) / (a + b + c * n0)
if abs(n - n0) < 0.000001: break
n0 = n
i += 1
return t2date(t2+n*(t2-t1))
以下举例史料中典型的天象时间问题,即《尧典》四仲中星和《汉书·律历志》二十八宿位置 。
《尧典》四仲中星时间
for star in szzx:
# 插值估值
t2 = -35 # 约公元前1500年
i = szzx.index(star) + 1
date = iteration(star, 90*i%360, t2)
JD = ephem.julian_date(date)
t = (JD - 2451545) / 36525
appPlace(star, t)
d = ephem.Date(date)
year = d.tuple() # 获得年份,由于目视误差,具体时刻不具有参考价值
print(star.name, year[0], appPlace(star, t))
插值计算的精度不高,寻找好的差值表范围可以提高精度,但也可以使用迭代法重复计算,获得较高精度。
计算结果:
星宿一 -2155年 (赤经:90.00042309673259)
心宿二 -2931年 (赤经:179.90138264459966)
虚宿一 -1859年 (赤经:270.0102335767864)
昴宿一 -2173年 (赤经:359.99930754645504)
该值对比《中国古代天体测量学及天文仪器》的结果(见19页),发现书中以心宿二赤经为180度时在公元前2125年,与计算值相差甚大,根据其所提供的赤经表(与本程序计算结果误差在0.1°以内),宜在[前2500,前3000]年间,应为排印错误。
这是以固定太阳时角90°计算的《尧典》四仲中星时间,未考虑不同日期的黄昏时间不同,误差可达上前年,上古黄昏时间不定,此计算值为《尧典》天象记录的上限。
《汉书》二十八宿时间
《律历志》给出的二十四节气的入宿度,只有冬至点是实测得到的,其他是根据简单内插法求算的。因此计算《汉志》所载的二十八宿位置测定的时间,也只需计算冬至点在牛初度时的时间。
此时即是求牛宿距星在赤经为270度的时间。估值在殷周到公元元年(约《世经》成书时间),仅需使用iteration()函数。
print(iteration(niu, 270,-25))
求得结果约在公元前451年左右,此时牛宿距星的赤经为270.00度。则冬至在牛宿初度,即为牛宿0-1度间,应在公元前521年至公元前451年之间。考虑到测量误差,可能更晚。
另可利用ephem模块求算冬至与天正朔在同一天的时间(参见:https://blog.csdn.net/weixin_42763614/article/details/83189459),即公元前427年年前朔旦冬至。二者时间相近,此即殷历己酉蔀蔀首,或即四分历创制时的真实时间和天象记录。