有了恆星位置的計算方法,就可以反求恆星在某位置時的時間。
star模組即恆星位置計算,參見
反求時間即利用插值法逆求。
以下舉例史料中典型的天象時間問題,即《堯典》四仲中星和《漢書·律曆志》二十八宿位置 。from star import *
def interpolation(star, angle, t2): # 插值計算,t為儒略世紀數
if angle == 0: angle = 360
t1 = t2 - 5
t3 = t2 + 5
n0 = 0 # 初值
ra1 = star.ra % 360 * 3600 # 改為角秒計算以獲得較精確結果
ra2 = star.ra % 360 * 3600
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 # 約西元前2023年
i = szzx.index(star) + 1
date = iteration(star, 90*i%360, t2)
jd = ephem.julian_date(date)
t = (jd - 2451545) / 36525
d = ephem.date(date)
year = d.tuple() # 獲得年份,由於目視誤差,具體時刻不具有參考價值
插值計算的精度不高,尋找好的差值表範圍可以提高精度,但也可以使用迭代法重複計算,獲得較高精度。
計算結果:
星宿一 -2023年 (赤經:90.00042309673259)
心宿二 -2023年 (赤經:179.90138264459966)
虛宿一 -2023年 (赤經:270.0102335767864)
昴宿一 -2023年 (赤經:359.99930754645504)
該值對比《中國古代天體測量學及天文儀器》的結果(見19頁),發現書中以心宿二赤經為180度時在西元前2023年,與計算值相差甚大,根據其所提供的赤經表(與本程式計算結果誤差在0.1°以內),宜在[前2500,前3000]年間,應為排印錯誤。
這是以固定太陽時角90°計算的《堯典》四仲中星時間,未考慮不同日期的黃昏時間不同,誤差可達上前年,上古黃昏時間不定,此計算值為《堯典》天象記錄的上限。
《律曆志》給出的二十四節氣的入宿度,只有冬至點是實測得到的,其他是根據簡單內插法求算的。因此計算《漢志》所載的二十八宿位置測定的時間,也只需計算冬至點在牛初度時的時間。
此時即是求牛宿距星在赤經為270度的時間。估值在殷周到公元元年(約《世經》成書時間),僅需使用iteration()函式。
print(iteration(niu, 270,-25))
求得結果約在西元前451年左右,此時牛宿距星的赤經為270.00度。則冬至在牛宿初度,即為牛宿0-1度間,應在西元前521年至西元前451年之間。考慮到測量誤差,可能更晚。
另可利用ephem模組求算冬至與天正朔在同一天的時間(參見:即西元前427年年前朔旦冬至。二者時間相近,此即殷歷己酉蔀蔀首,或即四分歷創制時的真實時間和天象記錄。
根據前序中序求後序
如前序 為 abdecgf 中序 為 bdacgef 先 根據前序第乙個節點 把中序分為bd和cgef兩部分,a為根節點,a左邊為左子樹,右邊為右子樹。再把左右子樹分別做上述步驟。以此類推 根據第二,第三.個節點構成二叉樹 a b e d c f g b 再根據後序的性質得到dbgcbfea 知道後...
根據函式閉包,求候選碼
首先來看候選碼的定義 若關係中的某一屬性組的值能唯一地標識乙個元組,則稱該屬性組為候選碼。若w是候選鍵,則必須滿足兩個條件 w的閉包是u w沒有冗餘。設關係模式r中u abc.等n個屬性,u中的屬性在fd中有四種範圍 求候選碼的簡單方法方法 1 如果有屬性不在函式依賴集 現,那麼它必須包含在候選碼中...
根據赫夫曼樹求赫夫曼編碼
可能編譯時會有些語法小錯誤 比如分號,等 很容易就自己糾正了哦,思路絕對是完全正確的,所以用的話就自己試著改改吧,直接複製貼上,就正確,豈不是太沒寫 體驗了,自己改改才印象更加深刻的呢 根據赫夫曼樹求赫夫曼編碼 includeusing namespace std typedef structhtn...