一次完整的日食推算包括計算日食食甚時刻、食分大小和食延情況。中國古代的日食理論是一種較為完整的數值算法系統,在宋代已經趨于完善。
某次合朔時,能發生日食的月亮到黃白交點的最大距離稱為日食的食限。20 世紀 80 年代以來,天文學史家在中國傳統日食理論的研究取得了大量成果,其中就包括對日食食限的專門研究。他們集中討論 了 歷 法 中 各 種 食 限 的 數 值 大 小 及 精度[1]470 -483,[2 -4]。而接下來重點研究的則是,在特定的歷法中討論某種食限是怎樣定義的及其算法是否合理,有無明確的天文意義。日食算法的難點和核心問題是如何處理月亮視差對日食食限、食分和食甚的影響。那么,宋代歷法家是怎樣做的呢,他們的處理方法是否合理和有效呢? 本文將在已有研究的基礎上,對此進行更深入的討論。這里所論及的食限算法,不但包括食限的數值,還包括與之相關的判斷依據和算法,如食分算法、交前后分算法等。我們首先給出食限相關算法的重建模型①,[5]然后對照重建模型梳理古代歷法,以解釋歷法中算法的構造原理和天文學意義,旨在闡明中國古人是如何定出日食食限的,以及陰陽歷食限為何不相等的原因。
一 交食的判斷與食限的定義
現代天文學通過合朔時月亮黃經和黃緯是否在某個范圍內來判斷日食。例如: 當黃經大于 18. 6°\\( 或黃緯大于 94'50″\\) 時,則不可能發生日偏食; 當黃經小于9. 7°\\( 或黃緯小于53'58″\\) 時,則一定會有中心食發生。中國古代歷法不計算月亮黃經和黃緯,因為中國傳統天文學中沒有黃極的概念。宋代歷法有兩種食限定義標準,一種是合朔時能發生日食的月亮距離黃道的最大高度,即月亮的極黃緯,歷法中稱之為月去黃道度; 第二種是月亮距離黃白交點的最大長度,即月去交點的白道距,歷法中稱之為去交日\\( 度\\) 或入交日\\( 度\\) 。
現存的宋代歷法中,除《應天歷》、《乾元歷》、《儀天歷》及《明天歷》外,都有“求月去黃道度”算法①。
但是,它們并沒有使用月亮的極黃緯來判斷交食的發生。對于第二種食限,所有歷法都給出了食限的數值及判斷方法,入交日\\( 度\\) 是歷法進行交食判斷的唯一標準。由于宋代歷法中并沒有給出月亮極黃緯算法所對應食限的數值,那么,極黃緯算法也不可能是輔助和補充入交日算法進行交食判斷的,它在交食判斷上就顯得毫無意義了。
二 視差修正與食差算法重建模型
由于月亮視差,判斷合朔時有無日食要計算視月亮距離視黃白交點的長度。中國古代歷法的算法思路是,先求得到合朔時真月亮到真黃白交點的距離; 然后進行視差修正,即求得合朔時真月亮到真黃白交點與視月亮到視黃白交點的距離增量 p,最后在入交泛日上加增量 p,就得到視月亮到視黃白交點的距離。
藪內清、曲安京等人把距離增量 p 的重建模型表示為p =H0sinIsinzsinF \\( 1\\)其中 H0為地平視差的最大值,I 為黃白交角,z 為月亮的天頂距,F 則表示黃道與過月亮的地平經圈的交角。與式\\( 1\\) 相對應,中國古代歷法中視差算法的模型是p = k0+ Δe\\( 2\\)式中,Δe稱為食差,它包括氣差 Δq和刻差 Δk,k0是一常數。對于 k0,除《紀元歷》外,其余史載宋代歷法均取 0。
若設當地的地理緯度為 φ,定朔時太陽的時角和黃經分別為 h 和 λ,則食差 Δe的重建模型由下式表示。[1]434 -435,[7]Δe= Δq+ Δk≈ k\\( sinhcosλ - coshsinλ\\)k0=H0sinIsinφcos{ε\\( 3\\)式中,ε 為黃赤大距,k = H0cosφsinε / sinI 是一常數。
中國古代歷法中的日食食差算法模型與重建模型是一致的,并且有著明確的天文意義。而若將視差算法放在整個日食推算中去討論,應該怎樣解釋具體的推算術文,歷法家又是怎樣認識和處理視差對食限和食分的影響呢?
在重建模型中,若取 φ = 34. 43°,ε = 23. 60°,②H0= 0. 95°,I 取平均值 5. 1453°,則可得 k0= 5. 48°= 5. 56 古度,k = 3. 50° = 3. 55 古度③。夏至所在日正午時刻,F =90°,z = φ - ε =10. 83°,根據式\\( 1\\) 可得 p 值為1. 9904°,為視差導致的真月亮到真交點與視月亮到視交點的距離在白道上增量的最小值。二分日日出時刻,z = 90°,F = 180° - ε - φ = 121. 97°,可得 p 值為8. 9863°,為此增量的最大值。春分日正午時刻,F =66. 40°,z = φ = 34. 43°,則 p = 5. 4884°,近似認為是此增量的平均值。
在歷法模型中,若按《紀元歷》食差算法計算得到,夏至日正午時刻食差為 4. 4563 古度,春秋分日日出時刻的食差為 - 4. 4563 古度,因此距離增量 p與食差 Δe不是一回事,它不但包含食差 Δe,還包含k0。而春秋分日正午時刻,《紀元歷》氣刻差均為 0,這是食差最特殊的零點,視差造成的白道位移 p 即為常數 k0?!都o元歷》的 k0取 5. 68 古度\\( 升交點\\)和 -5. 50 古度\\( 降交點\\) 。而重建模型中春分日正午時刻的 p = 5. 4884°與這兩個值十分接近。通過以上的比較和分析,我們能夠做出以下推測,在長期的觀測和推算中,古代歷算家有可能得到了某個特殊時刻的月亮視差,并求得此時真月亮到真黃白交點與視月亮到視黃白交點的距離增量 p0,進而對 p0進行修正,得到任意時刻的距離增量 p 和視差值。
這個特殊時刻的視差應該是最容易觀測和計算的,一般應該是一年中視差取平均值的時刻。而春分日正午時刻就是這個特殊時刻最理想的選擇。此時,那個距離增量 p 就等于 p0,其他任意時刻的 p 值可以通過 p0加入食差修正而得到。同時,歷法中食差算法模型中的 k0①就是春分日正午時刻黃白交點在白道的位移量 p0,而食差 Δe則是任意時刻視差造成的交點在白道上的位移與春分日正午該位移的差值。日食食差算法有可能是在這樣的思路下設計出來的。宋代周琮在討論日食視差時稱:四正食差: ……茍非地中,皆隨所在而漸異??v交分正等同在南方,冬食則多,夏食乃少。假均冬夏,早晚又殊,處南北則高,居東西則下。視有斜正,理不可均。
明代朱載癱也對視差的成因和變化進行了解釋:春分已后,日行赤道北畔,交外偏多,交內偏少。秋分已后,日行赤道南畔,交外偏少,交內偏多。是幫有南北差。冬至已后,日行黃道東畔,午前偏多,午后偏少,夏至已后,日行黃道西畔,午前偏少,午后偏多。是故有東西差。
設立南北差是由于食差在二分前后有正負的變化; 設立東西差則是由于在二至點前后食差的最值發生變化。他們的解釋與我們的分析是相同的。
三 宋代歷法中的日食食限算法
北宋初期行用的《應天歷》、《乾元歷》、《儀天歷》分兩步來判斷交食。第一步是根據入交泛日\\( 黃道內外分\\) 來判斷是否發生日食。我們以《應天歷》為例分析其交食的判斷,《乾元歷》、《儀天歷》二歷的判斷方法與之類似?!稇鞖v》術文稱:置黃道內、外分,如初準已上、末準已下為入食限?!略邳S道內則日食,在外則不食。
按照術文,如果真月亮到真交點距離在或偏食限以內,并且月亮位于黃道北\\( 內\\) ,則會有日食發生; 否則不會發生日食。在修正了月亮視差之后,歷法給出第二步,即以入交定日來判斷交食?!稇鞖v》求“距交分”算法稱:
置交前后分,以黃、赤二差加減之,為距交分。如月在內道不足減者,返減入外道,不食; 如月在外道不足減,返減食差,為返減入內道即有食。
由此可知,食差修正后的月亮在黃道的內外依然是判斷有無日食的標準。即使是在第一步中已經推得月亮的位置在內道,但如果加入食差修正后,月亮的位置在外道,日食仍不會發生?!稇鞖v》日食判斷的第一步實際上并沒有起到真正的作用。其后的宋代歷法都直接以入交定日來判斷。例如,《觀天歷》“求日入食限交前后分”術文稱: ②置朔入交定日及余秒,以氣、刻、時三差各加減之,如交中日已下為不食,已上去之,如后限已下為交后分; 前限已上覆減交中日,余為交前分。
《觀天歷》判斷有無日食的標準仍是月亮在黃道的內外位置。加入時差和食差修正后,視月亮到視交點的距離會在一個交點月內,這個距離減去交中就很容易判斷視月亮在黃道的內外情況。但是,《觀天歷》此時使用的日食食限是或偏食限,而必偏食限在食分算法中才出現,其食分算法稱:求日食分: 置交前后分,如陽歷食限已下為陽歷食定分; 已上,用減一萬二千八百,余為陰歷食定分。如不足減者,日不食。
歷法陰陽歷食限分別取 7900 和 4900,據此可知,先前求得的交前后分如果大于 12800 就不會有日食發生。由此看來,《觀天歷》的或偏食限在其日食判斷中并沒有發揮作用。
《明天歷》的日食食限算法以小字形式給出:其去交定分不足減、乃覆減食差總數、若陽歷覆減入陰歷,為入食限; 若陰歷覆減入陽歷,為不入食限。凡加之滿食限以上者,亦不入食限。
根據術文,視差修正后,只有月亮位于黃道北且到交點距離小于必偏食限 1464 時才有日食發生,其他任何情形都不會有日食。在視差修正前,《明在歷》不對有無日食做出任何判斷; 視差修正后,它直接使用必偏食限判定日食,根本不使用或偏食限; 這些都是其進步之處?!睹魈鞖v》的食限算法是《紀元歷》之前歷法中最為簡潔的。
北宋行用的最后一部歷法是姚舜輔的《紀元歷》。這部歷法不再使用月在內外道的標準來判斷日食,而以視黃白交點為標準來判斷?!都o元歷》首先求“朔入交定日”,其算法稱:置朔入交常日及余秒,以氣、刻差定數各加減之,交初加三千一百,交中減三千,為朔入交定日及余秒。
接下來,《紀元歷》將入交定日分為陰歷和陽歷,使其限制在半個交點月之內。推算術文稱:
求月行入陰陽歷: 視其朔、望入交定日及余秒,如在中日及余秒已下為月在陽歷;如中日及余秒已上,減去中日,為月在陰歷。
最后《紀元歷》將視月亮的位置限定在四分之一交點月內,并判斷視月亮依視白道在黃道的南北哪一側,直接使用必偏食限定出有無日食,稱為“求入食限交前后分”。算法術文為:視其朔、望月行入陰陽歷,不滿日者為交后分; 在十三日上下者覆減交中日,為交前分; 視交前、后分各在食限已下者為入食限[9]2830。
《紀元歷》的食限算法不再混入食分中的討論,使食分與食限算法完全分開?!都o元歷》判斷交食的標準是視黃白交點,直接使用必偏食限一次就可以判斷出月亮是否入食限。其食限算法無論在形式上還是思路上都與重建模型是相同的。中國古代歷法中的日食食限算法在這個時候完全定型。
四 月亮在黃道內外與日食的判斷
中國早期天文學家根據經驗知道,月亮在黃道外側時日食的發生機率要比月亮在內側時小。周琮就曾提到: “月在陽歷,校驗古今交食,所虧不過其半?!彼宕郧暗臍v法,推交食術中就有判斷月亮在黃道內外的算法。如《景初歷》中有“推合朔交會月蝕月在日道表裹術”,正光歷中有“推月在日道表裹術。
然而到了后來,特別是發現月亮視差影響日食之后,人們發現即使月亮在黃道內側,也可能不會有日食,而有些日食卻也可能發生在黃道外側。針對這些特殊情況,隋代和唐代早期歷法就設計了詳細的算法來處理。如《皇極歷》中也設立了“推不應食而食術”和“推應食不食術”。但這些算法僅能調整一些特殊情況,精度也不高。
這個時期,判斷日食的基本思路是,首先判斷合朔時真月亮的位置\\( 黃道內還是黃道外\\) ,根據“內道食外道不食”大致判斷出日食的有無,然后再使用食差算法修正月亮與交點的距離,判斷特殊情形下的日食,即得出是否外道有食或內道不食。我們暫時稱這種日食判斷的方法為“內外道法”。
《紀元歷》以前的唐宋歷法中,每部歷法的日食視差算法細節雖有差別,但它們的推算思路大致相同,其入交定日算法模型是入交定日 = 入交泛日 + Δe。 \\( 4\\)然而,對比重建模型式\\( 2\\) ,\\( 4\\) 中缺少常數 k0,即這些歷法中求得的入交定日不是視月亮到視交點的距離。而歷法模型中的食差與重建模型中的食差原理上卻是一致的,而且精度也很高。
那么,只能是這些歷法的食差算法與重建模型相同,但視差算法和食限算法可能與重建模型不同。因為重建模型中,日食的判斷是以視交點為準的,而歷法模型卻依照“內外道法”判斷,即以真交點為標準。那么,這兩種模型又有著怎樣的聯系呢?
如圖 1 所示,OO'1表示黃道,M1O 表示白道; 按推測,月亮視差實際上是以春分正午時刻為基礎進行修正的,則圖中直線 O0O'0表示春分日正午時刻由月亮視差造成的視白道的位置。若設視月亮到視交點與真月亮到真交點的距離增量在春分日正午時刻為 p0,任意時刻這個增量為 p,那么兩者的差值就是任意時刻的食差 Δe,即 Δe= p - p0。
圖 1 月亮視差與日食食限如果圖 1 中 O 表示降交點,那么月亮運動的方向為 OM1的方向。假設月亮行至 M1點,此時視月亮位置在 M″1點,M'1點則為它在春分日正午時刻那條視白道上的投影。通過月亮 M1做直線 M1N,使其平行于黃道,并與視白道交于點 G。于是有 p =GM″1,p0= NM'1= O'0O0,此時入交泛\\( 常\\) 日即為OM1。如果有日食,月亮在外道,也就是“食差”與“入交泛\\( 常\\) 日”之和“入交定日”一定為負值,即入交定日 = 入交泛日 + Δe=入交泛日 + p - p0≤ 0。 \\( 5\\)又 O0表示春分日正午時刻黃白交點的視白道投影位置,O'0則表示此時視交點的位置; p0= O'0O0就是兩者之間的距離。于是以內外道判斷交食的方法就能夠轉化成依黃白交點在春分日正午視白道上的投影點為標準來判斷。據此也能判斷內道應食而不食與外道不應食而食的情況。如圖 1,M1雖在外道,但經過視差修正,得到 M1O + O1O'1- O0O'0=QO0< 0,會有日食發生; M2雖在內道,但 OM2+ M2”O'2- O0O'0> 0,不會發生日食。更特殊地,如果在春分日正午時刻,則不用視差修正,就有月亮在黃道外側一定不會發生日食,而在黃道內側一定會發生日食,這正與“內道食外道不食”的判斷相符合。
據式\\( 5\\) 可得入交泛日 + p ≤ p0, \\( 6\\)這樣,入交泛日與 P 之和小于 p0,月在黃道內,就有日食,大于 p0,月在黃道外則無日食。中國古代的必偏食限一般取 14 度。圖 1 中,過 O0作黃道的平行線,可以看到只要合朔時視月亮在這條線以上\\( p0上側\\) ,并且沿著視白道不超過 14 度,就會發生日食,p0就成為在黃道外側判定日食的食限。唐宋歷法中的入交定日的天文學意義是合朔時視月亮到食限下限 p0的距離,而不是視月亮到視交點的距離。只需加上一個常數,入交定日就可以轉化為視月亮到視交點的距離。很明顯,這個常數就是 p0,于是 k0= p0。這些歷法的視差算法同樣可寫成 p =Δe+ p0= Δe+ k0。這樣,以內外道判斷日食的歷法中的食限算法與重建模型在形式上也是一致的。
五 日食的陰陽歷食限
視差修正后,依視黃白交點,食限在視白道上被平均分為兩部分,黃道上下側各有一部分。食分可以根據食限在視白道上計算。但以“內外道法”進行日食判斷的歷法,由于入交定日沒有加入 p0,則它們的食限就相當于以真黃白交點起算,而在真白道上進行定義,必偏食限就會完全落在黃道的內側。
那么,這就要求交點處的食分一定為零而不是食分的最大值①,導致食分算法不能用統一的表達式來描述。于是,食限分為陽歷食限和陰歷食限,陽歷食限是靠近交點的那段,陰歷食限則是必偏食限減去陽歷食限的那段。根據重建模型容易得到,視交點在真白道上的投影點就應該是陰陽歷食限的分界點,這也是食分取最大值的點。圖 1 中的 p0實際上就是陽歷食限,它的理論值是 5. 4884°\\( 5. 5683 古度\\) 。如果取必偏食限為 14 古度,那么理論上,陰歷食限的取值是 8 到 9 古度。如《崇天歷》的陽歷食限為 5. 30 古度,陰歷食限為 8. 84 古度; 《明天歷》的陰陽歷食限分別為 9. 76 古度和 4. 88 古度; 北宋初期三歷的陰陽歷食限分別為 9. 6 古度和 4. 2 古度。各部歷法陰歷食限和陽歷食限數值上的差異是由于各歷對 p0的測算不同所導致的。
《紀元歷》之前的歷法,陽歷食限是春分日正午時刻真黃白交點與視交點在白道上的位置差 p0,也就是 k0,這個值是預先測定的。那就意味著這些歷法只能先定義了陽歷食限\\( 4 至 6 古度\\) ,然后才能得到陰歷食限\\( 8 至 10 古度\\) ,在這種情形下,陰歷食限一定會大于陽歷食限。古代歷法中陰陽歷食限為什么不相等的原因也正在于此。
使用“內外道法”依真交點判斷交食,始終要考慮月亮是在內道還是外道,食分算法也會因此變得繁瑣。而陽歷食限取成 k0,相當于認為如果春分日正午時刻月亮在黃道外側的話,則不可能有交食。
但是,陰陽歷食限理論上應該相等\\( 約為 7 古度\\) ,它們比 k0要大,那么此時月亮如果在黃道外側 1 度以內,仍可能有交食出現。
《紀元歷》的視差算法中,不再考慮真交點,直接根據視月亮到視交點的距離來判斷日食的發生,簡化了算法。歷法中的入交定日是視月亮到降交點的視交點的距離,那么在降交點處,由于視差使得視月亮沿著月行方向遠離視交點,降交點的入交定日就是入交泛\\( 常\\) 日加上食差后,再加上春分日正午時刻視月亮在白道上的位移量 k0; 而在升交點處,就要減去位移量 k0。
《紀元歷》陽歷食限取作 3400,而其 k0的值則取 3100\\( 交初\\) 和 3000\\( 交中\\) ②,兩者是不一樣的。由于《紀元歷》的入交定日中沒有加入時差修正,它的陰歷食限和陽歷食限仍然是不相等的。
六 結果與討論
早期的中國傳統歷法直接以合朔時月亮在黃道的內外來判斷有無日食,在內道則食,外道則不食。
隋代以后,歷算家開始將月亮視差引入到日食計算。
他們選擇春分日正午時刻的視差作為標準,通過修正得到任意時刻的視差,依此得到食差; 將這個距離差加在合朔時月亮的位置上,然后判斷修正后的月亮位置是在黃道的哪一側,仍然是在內道食外道不食。他們在設計食分算法時,又不得不將食限分成兩部分,取陽歷食限為春分日正午時刻黃白交點在白道上的位移量 k0,而陰歷食限則用必偏食限減去陽歷食限得到。這樣處理就造成了陰陽歷食限的不相等?!都o元歷》以前的所有唐宋歷法都是這樣判斷日食的發生與否和計算日食的食分的。
《紀元歷》放棄使用“內外道法”判斷日食,首次明確提出了食限中的常數 k0,并賦予其獨立的意義,陽歷食限的定義不再與之相聯系。這不僅表現在數值和精度的變化,更重要的是它創造性地給出了一種更為合理的判斷日食的思路。這里,我們可以考慮一個問題,如果已經知道計算食差是為了計算視月亮到視交點的距離,那么想到依照視交點來判斷日食就是很自然的事。然而,《紀元歷》之前的歷法根本沒有這樣做。這就意味著它們可能根本沒有認識到視月亮、視白道以及視交點等概念,它們設計食差算法的目的并不是修正視月亮,而是修正真月亮,用以判斷修正后的真月亮在黃道的內外。由于春分日正午時刻視月亮到視交點的位移量與陽歷食限十分接近,于是按這種思路建立的食差和視差算法在形式上可以與《紀元歷》的相同,這是一種巧合。雖然通過變換,這些歷法的食限算法與重建模型在形式上能夠達到一致,并可認為這些歷法中也隱含著表達出了常數 k0,但是它們判斷日食始終是以真黃白交點為標準的,這與重建模型的思路是完全不一樣的。只有《紀元歷》依照視交點判斷日食,它的食限算法與重建模型基本一致。