明 朝 《大 統 曆》 的 定 朔 計 算 及 曆 表 朔 日 訂 正

初稿: 2019年8月


摘 要


本文根據《大統曆》的推步方法計算明朝合朔和二十四節氣時刻,發現與現存若干明代《大統曆》曆書給出的時刻完全吻合。比較算出的明朝二百七十六年間朔日和節氣日期,發現節氣日期完全符合張培瑜《三千五百年历日天象》的資料,但有十一個朔日不合,其中有七例證實是《三千五百年历日天象》的錯誤,這七個錯誤也見於薛仲三、歐陽頤的《兩千年中西曆對照表》、陳垣的《二十史朔閏表》及汪曰楨的《歷代長術輯要》


內容

  1. 引 言
  2. 《大 統 曆》 的 定 朔 計 算
  3. 合 朔 時 刻 檢 驗
  4. 曆 表 朔 日 訂 正
   參 考 文 獻

引 言

本網站的古代中曆資料幾乎全部採用張培瑜《三千五百年历日天象》的資料,除了該書外,還有其他中國史曆表供史學家參考,例如薛仲三、歐陽頤的《兩千年中西曆對照表》、陳垣的《二十史朔閏表》及汪曰楨的《歷代長術輯要》等。臺灣中央研究院的兩千年中西曆轉換的古代中曆資料就是取自薛仲三、歐陽頤的《兩千年中西曆對照表》。翻查這幾本中國史曆表,有時會發現曆日有差異,筆者不是史學專家,難以考證孰是孰非,但認為最妥當的方法是考察當時政府頒行的曆書。

中國歷朝都視頒行曆書為皇權的象征,歷代都禁止民間藏用私曆,藩屬國也以中國頒行的曆書紀日。在分裂時代,各政權都各自頒曆,而不同曆書所載的朔日和二十四節氣日期不盡相同。因此中國史歷表的資料應盡量用當時曆書的資料,但是古代的曆譜太部份已散失,明朝中葉以來的曆譜卻有很多現在還可以找到,對於辨明曆表的正誤很有用,本文集中研究明朝《大統曆》曆書。臺灣的中央圖書館收藏了不少明朝《大統曆》曆書,曆書首頁圖片可在臺灣中央研究院數位文化中心的典藏臺灣找到,世界數字圖書館有整本《大明嘉靖三年大統曆》,北京圖書館出版的《國家圖書館藏明代大統曆日彙編》(全六冊)(以下簡稱《彙編》)更收集了從明正統十一年(1446年)至崇禎十四年(1641年)之間99種曆書,此網頁列出了六冊書收集的曆書目錄。但是由於年代久遠,《彙編》裡很多曆書受到不同程度的破損,或有蟲蛀、或頁面缺損、或字跡模糊、或內頁缺失,但也有一些保留得很好的。《彙編》及上述網站收集的大統曆書對於研究明朝《大統曆》很有價值。

《大統曆》各年曆書的結構相同,封面印有曆書的年份。封面或內頁有偽造曆書警句:

欽天監湊淮印造大統曆日頒行天下

偽造者依律處斬,有能告捕者官給賞銀五十兩,如無本監曆日印信即同私曆。

曆書的正文是首兩頁載有每月朔日和二十四節氣時刻,後兩頁是「年神方位之圖」(或稱「九宮圖」),應是用於風水,接著數十頁是當年的日曆:每日一欄載有宜與不宜之事(今天視之為迷信的東西),最後數頁列出前六十年的紀年。本文要探討的問題基本上只會用到曆書首兩頁載的合朔資料。

細看這些存世的大統曆譜(例如萬曆三年大統曆首頁),發現不但有朔日和二十四節氣日期,還列出二十四節氣的時刻,有少數曆譜(例如崇禎二年大統曆)也列出合朔時刻,這些資料對研究大統曆的定朔及節氣計算很有價值。筆者看到這些資料後馬上檢查我的《大統曆》推步結果,發現果然完全符合曆譜所列的時刻。其實李勇在「明嘉靖六年《大统历》历书的气朔推步精度」 一文已指出《嘉靖六年大統曆》曆書的節氣時刻和推步結果完全一致,但是該文並沒有比較明朝曆書的合朔時刻。筆者發現曆書給出的合朔和節氣時刻和《大統曆》推步結果完全一致,除了感到高興外也使我想起一事。

兩個月前筆者編寫了大統曆的合朔和節氣推步程式後,曾將結果與《三千五百年历日天象》的資料比對,發現在明朝洪武二年(1369年)到崇禎十七年(1644年)二百七十六年間,二十四節氣的日期完全符合《三千五百年历日天象》,但是朔日卻有十一處不合。當時我不以為意,因為古代的日曆不一定按術文計算的,有時曆官可能會稍為調整計算方法,或短暫採用其他曆法,或因忌諱而修改曆日(詳見黃一農「中國史曆表朔閏訂正舉隅」),而這些改動不一定全都記載於史書中。現在發現推步結果不但日期符合大統曆書,連時刻也都吻合,顯示筆者的推步方法確是與當時曆官採用的方法一致,既然有不少明朝曆書仍存世,何不找出當年的大統曆譜看看那十一處不合究竟是誰對誰錯?結果發現竟然有七個是《三千五百年历日天象》錯了,餘下的四個不合因為找不到資料而無從判斷,這考察結果會在本文最後一節敘述。奇怪的是這七個錯誤也見於汪曰楨的《歷代長術輯要》、陳垣的《二十史朔閏表》及薛仲三、歐陽頤的《兩千年中西曆對照表》,三書列出的那十一個朔日都與《三千五百年历日天象》完全一樣,說明了即使各曆表的曆日一致也不能保證一定符合實曆。

由於李勇在已比較了《大統曆》的節氣推步和曆書給出的時刻,本文不再重複比較節氣時刻,而集中比較《大統曆》的定朔推步和曆書給出的時刻。李勇在文中指出《大統曆》的定朔有兩種不同計算方法,究竟《大統曆》採用哪個方法計算定朔,或許可考察大統曆書載的合朔時刻斷定,這是下面兩節要探討的問題。


《大 統 曆》 的 定 朔 計 算

明朝《大統曆》基本上沿襲元朝《授時曆》的法數和推步方法。《授時曆》的推步方法在李勇和張培瑜於1996年和李勇及張承志於1998年發表的兩篇文章()有介紹,這裡就不敘述了,但會簡略介紹定朔的一般計算,以便說明《授時曆》和《大統曆》在計算定朔時可能有一些差異。

合朔的定義是月亮視黃經和太陽視黃經相等的時刻。用λM表示月亮視黃經、λs表示太陽視黃經,則合朔時刻t滿足方程
f(t)=λM(t)-λs(t)=0    (1)
現代天文的其中一個計算方法是用牛頓-拉弗森(Newton-Raphson)求根法,這是一個迭代算法。設若tn為第n次迭代的數值,則下一輪迭代的數值用以下公式計算:
tn+1=tn - f(tn)/f'(tn)   (2)
其中f'是f對時間的導數。如果選擇起始值t0為平朔時刻,則第一輪迭代的結果是
近似定朔時刻=平朔時刻 - f(平朔時刻)/f'(平朔時刻)   (3)   
函數-f可以寫成
-f(t)=(λM(t)-λM(t)) + (λs(t)-λs(t)) + λs(t)-λM(t)
其中λMλs是月亮和太陽的平黃經,即只考慮日月平均運動得出的黃經。式中第一項λM-λM稱為「遲疾差」,第二項λs-λs稱為「盈縮差」。在平朔時刻,λM=λs,所以
-f(平朔時刻) = 遲疾差 + 盈縮差
f的導數是
f'(t)=λ'M(t)-λ's(t)=月實行速-日實行速
定朔的一次近似時刻可寫成
定朔(近似)時刻 = 平朔時刻 + (遲疾差 + 盈縮差)/(月實行速 - 日實行速)  (4)

中國古代的定朔計算公式與(4)式類似但不完全相同。《授時曆》的定朔計算公式是
定朔時刻 = 平朔時刻 + 0.082×(遲疾差 + 盈縮差)/遲疾限行度   (5)
= 平朔時刻 + (遲疾差 + 盈縮差)/月實行速
《授時曆》取近點月(轉終)為27.5546日,把近點月時間分為336限,所以一限=27.5546日/336=0.082日。古代一度定義為太陽一天在天空運行的平均角度,《授時曆》行用其間取回歸年為365.2425日,所以一圓週有365.2425度,換成今天採用的360°制,《授時曆》的一度相當於360°/365.2425=0.9856°。「遲疾限行度」是月亮在一限時間的實行度,因此遲疾限行度/0.082日就是以(度/日)為單位的月實行速。用月實行速代替(月實行速-日實行速),理論上並不準確,卻比以前的很多曆法用月平行速代替(月實行速-日實行速)有些進步。

南宋楊忠輔發現回歸年長度不是常量,《授時曆》接受這觀點,其回歸年長度規定每一百年減萬分之一日,稱為「歲實消長」。但是《授時曆》只用了88年就被後繼的《大統曆》取代,《大統曆》雖然沿襲《授時曆》法數和算法,但是取消了歲實消長法,回歸年取常數365.2425日。《大統曆》術文的定朔算法也和《授時曆》稍有不同:
定朔時刻 = 平朔時刻 + 0.082×(遲疾差 + 盈縮差)/定限度   (6)
= 平朔時刻 + (遲疾差 + 盈縮差)/(月實行速 - 日平行速)
其中定限度=遲疾限行度-0.082度=月亮在一限的實行度 - 太陽在一限的平行度,所以定限度/0.082就是以(度/日)為單位的(月實行速 - 日平行速)。以(月實行速-日平行速)代替月實行速,理論上雖然是進步了,但是據李勇的計算,這改動得出的合朔時刻精度反而不及《授時曆》的計算精度,也不及宋代的平均水準。原因很可能是《授時曆》制定的盈縮差和遲疾差計算公式以實測數據配合公式(5)的模型,如果要把公式(5)改為公式(6),盈縮差和遲疾差計算公式也得修改才能符合實測數據。

李勇在其文章認為《大統曆》的合朔計算仍然採用公式(5),即和《授時曆》一樣,他指出邢雲路《古今律曆考》給出的《大統曆》推算朔望和日月食的計算法都依照《授時曆》的公式,所以《大統曆》的術文可能刊誤。既然有存世《大統曆》曆書載有合朔時刻,只要將那些時刻比較公式(5)和公式(6)算出的時刻,或可判別《大統曆》採用的算法。下一節會敘述計算結果。


合 朔 時 刻 檢 驗

筆者找到的存世《大統曆》曆書,有六部載有合朔時刻,其中有三部在典藏臺灣找到:《大明萬曆三十二年歲次甲辰大統曆》《大明崇禎二年歲次己巳大統曆》《大明崇禎十二年歲次己卯大統曆》;其餘三部在《國家圖書館藏明代大統曆日彙編》第二冊和第五冊找到:《大明嘉靖十年歲次辛卯大統曆》(《彙編(二)》157-158頁)、《大明嘉靖十一年歲次壬辰大統曆》(《彙編(二)》247-248頁)及《大明萬曆四十四年歲次丙辰大統曆》(《彙編(五)》281-282頁)。《彙編(四)》也有萬曆三十二年的曆書、《彙編(六)》也有崇禎十二年的曆書,但是那兩部曆書沒有合朔時刻。另外,《彙編(二)》有兩部嘉靖十一年曆書、《彙編(五)》有兩部萬曆四十四年曆書,也是一部有合朔時刻而另一部沒有。可見在嘉靖十一年、萬曆三十二年、萬曆四十四年和崇禎十二年,大統曆書至少有兩個不同版本,其他年份可能也是如此。典藏臺灣只有曆書的首頁六(或七)個合朔,三部曆書共19個合朔資料。《彙編》所載的那三部曆書有全年的合朔資料,三部曆書共有37合朔,所以這六部曆書合計有56個合朔。

曆書中合朔的時刻以辰刻制給出,計算方法是1天=100刻=12辰,故一辰=100/12刻=8.3333刻,一刻=0.01日=14.4分鐘。辰以十二地支子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥表示,用現在的24小時制來說,子是晚上23時到下一天的1時,丑是1時到3時等等。一辰又分為初和正兩部分,例如寅初指3時到4時、寅正指4時至5時,子初指23時到0時、子正指0時到1時等。刻的計量取「落地算法」,即0-1刻間稱為「初刻」,1-2刻間稱為「一刻」,2-3刻稱為「二刻」等。所以「亥初二刻」指21時28.8分到21時43.2分,寫成日的小數就是0.895到0.905,或0.900±0.005。同理,「未正三刻」指14:43.2到14:57.6,寫成日的小數是0.613到0.623,或0.618±0.005。因為半個時辰只比四刻多出1/6刻,所以「巳正四刻」較為特別,指10:57.6到11:00這2.4分鐘時間,寫成日的分數是0.4567到0.4583,或0.4575±0.0008。把合朔時間寫成日的小數,就是古代所稱的朔小餘。朔日的日干支可以用整數表示,這裡以甲子為0、乙丑為1等,即干支網頁表二所載的干支次序減去一。這樣合朔的干支日和時刻可以用數字表示,整數部份表示日干支(大餘),小數部份是朔小餘。例如「辛巳未正三刻」是17.618±0.005、「戊申亥初二刻 」是44.900±0.005等,下表就是採用這方法把曆書中的合朔時刻化成數字方便比較推步的結果。

筆者用「遲疾限行度」[公式(5)]和「定限度」[公式(6)]計算了明朝二百七十六年間所有合朔時刻,這裡採用李勇標記,稱「遲疾限行度」的算法為D1、稱「定限度」的算法為D2。平朔時刻、遲疾差、盈縮差及遲疾限行度的計算方法依照文章提供的公式,由於《大統曆》廢除了《授時曆》的歲實消長法,那些公式裡所有的A'都要改為A。下表列出上述56個合朔的計算結果及大統曆書給出的數據。


表一:合朔時刻比較。合朔時刻的數字整數部份表示日干支(0=甲子、1=乙丑等),小數部份是朔小餘,即合朔離夜半零時的時間(以日為單位)。D1是依「遲疾限行度」算法得出的合朔時刻,D2是依「定限度」算法得出的時刻。棕色數字表示與《大統曆》曆書數據不合,紅色數字表示朔日干支錯了。

年 份 月 份 合 朔 時 刻
《大統曆》曆書 D1 D2
嘉靖十年(1531年) 丙戌亥正一刻 (22.932±0.005) 22.931 22.968
丙辰未正二刻 (52.608±0.005) 52.605 52.653
丙戌寅初二刻 (22.150±0.005) 22.154 22.201
乙卯未正初刻 (51.588±0.005) 51.590 51.628
甲申亥正二刻 (20.942±0.005) 20.937 20.960
甲寅卯初一刻 (50.223±0.005) 50.220 50.224
閏六 癸未午初三刻 (19.493±0.005) 19.491 19.476
壬子戌初二刻 (48.817±0.005) 48.814 48.783
壬午卯初初刻 (18.213±0.005) 18.211 18.169
辛亥酉初初刻 (47.713±0.005) 47.714 47.668
辛巳辰初三刻 (17.327±0.005) 17.330 17.289
十一 辛亥丑初三刻 (47.077±0.005) 47.076 47.052
十二 庚辰亥初二刻 (16.900±0.005) 16.902 16.904
嘉靖十一年(1532年) 庚戌酉初初刻 (46.713±0.005) 46.716 46.743
庚辰巳正一刻 (16.432±0.005) 16.435 16.478
庚戌子正三刻 (46.035±0.005) 46.034 46.081
己卯午正一刻 (15.515±0.005) 15.517 15.559
戊申亥初二刻 (44.900±0.005) 44.899 44.927
戊寅卯初初刻 (14.213±0.005) 14.213 14.225
丁未午正一刻 (43.515±0.005) 43.519 43.513
丙子戌正初刻 (12.838±0.005) 12.839 12.818
丙午卯初一刻 (42.223±0.005) 42.218 42.186
乙亥申正一刻 (11.682±0.005) 11.681 11.642
十一 乙巳卯正初刻 (41.255±0.005) 41.253 41.216
十二 甲戌亥正一刻 (10.932±0.005) 10.931 10.904
萬曆三十二年(1604年) 壬子巳正三刻 (48.452±0.005) 48.447 48.431
壬午寅正二刻 (18.192±0.005) 18.190 18.192
辛亥亥正二刻 (47.942±0.005) 47.939 47.961
辛巳未正三刻 (17.618±0.005) 17.622 17.656
辛亥寅正?刻 (47.187±0.021) 47.204 47.242
庚辰申正?刻 (16.687±0.021) 16.677 16.709
萬曆四十四年(1616年) 壬申申正三刻 (8.702±0.005) 8.699 8.700
壬寅丑正二刻 (38.108±0.005) 38.111 38.102
辛未午正三刻 (7.535±0.005) 7.533 7.516
庚子夜子初三刻 (36.993±0.005) 36.988 36.964
庚午午初二刻 (6.483±0.005) 6.481 6.452
庚子子正三刻 (36.035±0.005) 36.035 36.007
己巳申正一刻 (5.682±0.005) 5.680 5.662
己亥巳初初刻 (35.380±0.005) 35.384 35.381
己巳丑初三刻 (5.077±0.005) 5.078 5.090
戊戌酉初三刻 (34.743±0.005) 34.740 34.762
十一 戊辰辰正二刻 (4.358±0.005) 4.354 4.382
十二 丁酉亥初三刻 (33.910±0.005) 33.911 33.940
崇禎二年(1629年) 丁巳戌初初刻 (53.797±0.005) 53.801 53.820
丁亥未初二刻 (23.567±0.005) 23.567 23.606
丁巳卯初初刻 (53.213±0.005) 53.217 53.265
丙戌酉初三刻 (22.743±0.005) 22.741 22.786
閏四 丙辰寅初三刻 (52.160±0.005) 52.163 52.198
乙酉午初三刻 (21.493±0.005) 21.494 21.513
甲寅酉正三刻 (50.785±0.005) 50.785 50.786
崇禎十二年(1639年) 己未辰初一刻 (55.307±0.005) 55.310 55.303
己丑丑正初刻 (25.088±0.005) 25.089 25.105
戊午戌初三刻 (54.827±0.005) 54.823 54.857
戊子巳正四刻 (24.4575±0.0008) 24.4572 24.4988
丁巳夜子初二刻 (53.983±0.005) 53.979 54.019
丁亥巳初二刻 (23.400±0.005) 23.400 23.429

這計算結果十分漂亮,用D1算出的56個合朔時刻完全符合大統曆書,D2的時刻雖然相差不遠,但是大部份不符合曆書的數據,其中崇禎十二年五月朔接近零時,D2的時刻偏差使朔日落在下一天。萬曆三十二年的曆書有破損,五月朔和六月朔只知合朔的時辰而無法得知幾刻,使合朔時刻只可確定在半個時辰內,但D2的時刻還是超出了這個時間範圍。崇禎十二年曆書載四月朔為巳正四刻,如上述,這資料使這合朔時刻範圍縮小到2.4分鐘內,而D1的計算結果就在這2.4分鐘內,說明《大統曆》確是按D1的算法計算定朔。

雖然D2的合朔時刻和D1相差不遠,但是如果合朔很接近夜半零時可能會使朔日日期有一日之差,這情況在上述崇禎十二年五月朔出現。筆者用D2算出的明朝朔日與《三千五百年历日天象》的朔日比較,發現有88處不合,其中有21例找到了當年明朝的大統曆書,發現D2算出的這21個朔日全錯。用D1算出的朔日與《三千五百年历日天象》比較發現有11處不合,這11處不合改用D2來算仍然不合,也就是說上述那88處D2不合包括了這11個。上面的計算基本上證實了D1的推步方法就是那幾部大統曆書的推步方法,所以這11處不合很值得深入研究,下一節就探討這個問題。


曆 表 朔 日 訂 正

上一節的計算證實了《大統曆》的定朔計算基本上沿用《授時曆》的公式,只是除消了《授時曆》的歲實消長法,結尾提到用此法算出的朔日在明朝二百七十六年間有11個朔日與《三千五百年历日天象》的數據不合。翻查薛仲三、歐陽頤的《兩千年中西曆對照表》、陳垣的《二十史朔閏表》及汪曰楨的《歷代長術輯要》,發現三書所載的那十一個朔日也和《三千五百年历日天象》完全相同。筆者嘗試尋找現存的大統曆書核對,找到了其中七個朔日資料。令筆者驚訝的是,這七個朔日全都符合推步結果,也就是說那四本書的七個數據錯了,餘下的四個朔日因為找不到資料而無從判斷,現把這十一個朔日列於下表。


表二:曆表、推步和大統曆書的十一個朔日比較。《三千五百年历日天象》、《兩千年中西曆對照表》、《二十史朔閏表》和《歷代長術輯要》四曆表所列的這十一個朔日日期完全相同,紅色字體表示朔日干支和《大統曆》曆書不合。推步方法用上一節的所說的D1(「遲疾限行度」)算法,數字整數部分表示日干支(0=甲子、1=乙丑等),小數部份是朔小餘。《大統曆》曆書欄裡括號內註有該大統曆書的來源。

年 份 月 份 朔 日
曆表 推步結果 《大統曆》曆書
洪武三年 (1370年) 庚申 57.0024 (辛酉, 子正初刻)
洪武十一年 (1378年) 辛丑 36.9827 (庚子, 夜子初二刻)
天順六年 (1462年) 十一 壬辰 27.8143 (辛卯, 戌初二刻) 辛卯 (黃一農 )
弘治八年 (1495年) 辛巳 18.1775 (壬午, 寅正一刻)
弘治十年 (1497年) 己巳 4.9997 (戊辰, 夜子初四刻)
萬曆九年 (1581年) 壬辰 27.9349 (辛卯, 亥正一刻) 辛卯 (《彙編(三)》606頁)
萬曆十六年 (1588年) 癸未 20.4341 (甲申, 巳正一刻) 甲申 (典藏臺灣、《彙編(四)》135頁)
癸丑 50.0406 (甲寅, 子正四刻) 甲寅 (典藏臺灣、《彙編(四)》139頁)
十二 庚辰 15.9425 (己卯, 亥正二刻) 己卯 (《彙編(四)》175頁)
萬曆二十八年 (1600年) 乙巳 42.0834 (丙午, 丑正初刻) 丙午 (《彙編(四)》445頁)
萬曆三十七年 (1609年) 癸未 20.0211 (甲申, 子正二刻) 甲申 (《彙編(五)》67頁)

不知為何各曆書在萬曆十六年竟然有三個朔日錯誤。汪曰楨《歷代長術輯要》在萬曆十六年註有「國榷十二己卯朔不合」,萬曆二十八年註有「國榷正丙午朔不合」,萬曆三十七年註有「國榷正甲申朔不合」。「國榷」是指談遷(1594年-1658年)撰的明朝編年體史書,汪曰楨說的該書那三個朔日資料其實是正確的。但是《國榷》的資料也不可盡信,例如《歷代長術輯要》在萬曆三十年註有「國榷九庚申朔不合」,在萬曆三十二年註有「國榷十二丁未朔不合」,這兩個朔日確實和存世的大統曆書不合。《歷代長術輯要》在洪武三年註有「國榷二辛酉朔不合」,這朔日是表二所列的第一個朔日,《國榷》的資料雖然符合推步結果,但只能作為旁證。

從表中可見除了洪武三年二月朔和弘治十年十月朔非常接近午夜零時外,其餘九個合朔都不是很接近日界,鑒於推步的結果至今還未發現與大統曆書不符,筆者懷疑餘下的四個朔日裡,各曆表的日期至少有兩個有錯。但是在找到可靠資料前,本網站的中曆對這四個朔日日期仍以各曆表為準。



參 考 文 獻