ytliu0 / ChineseCalendar

Conversion between the Western calendar and Chinese calendar
GNU General Public License v3.0
141 stars 44 forks source link

請教天文演算的方法 #3

Closed kanasimi closed 4 years ago

kanasimi commented 5 years ago

這邊比較好奇的是 天文演算的部分 這邊主要按照 Jean Meeus, Astronomical Algorithms, 2nd Edition. 《天文算法》2版 操作

天文演算採用完整的 VSOP87 (VSOP87D.ear) 來計算行星的日心座標位置,以 LEA-406 來計算月亮位置。LEA-406 基於 LE406,據 Sergey M. Kudryavtsev,較 ELP/MPP02 更貼近 LE406。 但是算出的數據大都會差到幾分鐘

猜測可能是大氣折射 或者是多個演算來源配合方面出了問題

但是當然不好意思麻煩您幫我檢查... https://github.com/kanasimi/CeJS/blob/master/application/astronomy.js

想要請問一下 不曉得現在有沒有比VSOP87更方便單機使用的數據

另外若是這邊想要進行整套的天文演算 不曉得您有沒有什麼可以參考的資料?

謝謝您

ytliu0 commented 5 years ago

我也聽說大部份天文軼件是用Meeus的書提供的算法。您說算出的數據大都會差到幾分鐘,那是跟什麼比較呢? 會不會是因為 Delta T 的算法不同?

我是在去年六月才開始編寫天文演算程序。當時是為了在我的星圖網頁中加上日月和八大行星的數據。由於我的星圖resoltion小,繪圖時只用JPL的低精度公式,在 popup box 的顯示中才用到VSOP87的公式,而VSOP87的程式代碼從此處獲得。

但是兩個網站都沒有月球的位置計算,經過搜尋後,找到了 ELP/MPP02 的 FORTRAN 代碼: ftp://cyrano-se.obspm.fr/pub/2_lunar_solutions/2_elpmpp02/,但是那裡有35901個Poisson級數項,對我繪製星圖來說是沒有必要的。由於我的星圖要有animation的功能,所以用低精度的公式效率比較好。於是我製了個 ELP/MPP02的 C++程式工具,可以用來刪剪ELP/Mpp02的公式而創造低精度的月球位置公式,並自動產生JavaScript程序。我的星圖網頁也只是在 popup box 的顯示時才用上不刪剪的ELP/MPP02公式。

對於我星圖網頁中的天文計算,可參考我的pdf說明,其中很多算法是參考了 Urban 和 Seidelmann 的Explanatory Supplement to the Astronomical Almanac第三版。關於我對ELP/MPP02 的刪剪方法,可參考這個pdf說明。我在這裡的天文計算可參考拙文月相和二十四節氣的計算

(未完,待續)

ytliu0 commented 5 years ago

我在編寫ELP/MPP02 的刪剪程序時,需要知道刪剪公式精度,這有兩種方法。其一是比較刪剪公式和不刪剪公式的差異,其二是比較刪剪公式和JPL高精度的DE/LE曆表的差異。於是我下載了JPL曆表,並用Project Pluto提供的C程式讀取JPL曆表,我成功驗證了ELP/MPP02 的不刪剪公式(用擬合LE406的參數)在(-3000年, 3000年)的精度和DE/LE406比較確是他們所說3"或2公里。他們的曆表在2000年左右製成,DE/LE406在當時是最先進的,但是十幾年後,DE/LE406的長時間曆表被DE431取代,所以我的pdf說明也比較了ELP/MPP02和DE431的差異,發現是12"或2.5公里。

撐握了JPL曆表的計算後,我才想起可以用來算農曆,很快就算出了1900年到3500年的農曆,只是當時只有1900年到2100年左右的數據核對。我在去年十月把計算結果放到這裡,當時只有1900年到2200年的農曆,本來也只打算到此為止,後來發現了古代的日曆數據,並開始學習古曆的推步。這樣才逐步增加內容,結果是JavaScript的程式變得越來越亂,遠不如您的工具那麼有系統。

不曉得現在有沒有比VSOP87更方便單機使用的數據

這就要視乎您的精度要求,上面所說的JPL低精度公式對精度不高的應用來說就很好。高精度的計算用JPL曆表比VSOP87更準更快,只是JPL曆表需要用很大的data file,不適宜用於網頁,這裡的天文數據是先用JPL曆表計算,製成JSON數據,然後以查表的方法用於網頁(其實編算農曆是不需要用高精度曆表的)。如果需要中精度的曆表,恐怕要自己刪剪VSOP87的公式了。我粗略看了一下您的astronomy.js,如果我的估計不錯的話,那裡的VSOP87已經用了刪剪公式。

另外若是這邊想要進行整套的天文演算,不曉得您有沒有什麼可以參考的資料?

您說的Meeus的那本書不好嗎? 您想要增加什麼功能呢? 我的算法是參考Urban 和 Seidelmann 的Explanatory Supplement to the Astronomical Almanac第三版,但是如果沒有學過大學程度的天文課,那本書也許不容易看懂。

kanasimi commented 5 years ago

這邊同樣是採用 http://www.neoprogrammics.com/vsop87/source_code_generator_tool/ 這個網站

並且計算所有的 VSOP87D.ear terms https://github.com/kanasimi/CeJS/tree/master/application/astronomy

計算順序採用 https://github.com/kanasimi/IAU-SOFA/blob/master/doc/sofa_ast_c.pdf 這邊的方法

 :: VSOP87 進入點→
 日心黃道: D日心瞬時黃道 by VSOP87
 (太陽: 日心黃道: FK5) (FK5 2選1)
 (天體/行星: S日心視黃道:修正光行時及光行差) (修正光行時及光行差 2選1)
 地心直角黃道座標 = 天體S日心視黃道 - 地球S日心視黃道
 G地心視黃道: 球座標

 :: LEA406 進入點: 計算月亮位置(地心瞬時黃道坐標)
 (天體/行星: G地心視黃道: FK5? why here?) (FK5 2選1)
 (G地心視黃道: 修正月亮光行時及太陽光行差) (修正光行時及光行差 2選1)
 G地心視黃道: 修正地球章動 nutation。

 E地心赤道座標:
 topocentric(本地站心)(T站心赤道): 修正恆星時/經緯度/時角, 行星視差
 H站心地平座標: 修正大氣折射

在和其他看到的數據對比時 卻往往發現算出來的朔閏和交節時刻存在誤差

有時發現 许剑伟 寿星天文历 還會更精確點 可惜因為這邊已經重寫程式碼 因此沒有精力再研究寿星天文历的計算架構

只能猜測試我在組合各種(座標)轉換時 有些該注意到的細節沒有處理好 甚至於中間漏掉了什麼或者多了什麼 畢竟不是天文專業出身的

想找其他天文演算的來源 主要是發現 Jean Meeus 的演算有很多都是擬合產生 只說用某些數據這樣算就能夠得到一個大概的值 沒有描述數據的來源 也就不好判斷到底是自己的哪邊出了問題

ytliu0 commented 5 years ago

合朔和節氣是用地心視黃經來定義的,不要算topocentric座標。