明 朝 《大 统 历》 的 定 朔 计 算 及 历 表 朔 日 订 正

初稿: 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是依「定限度」算法得出的时刻。棕色数字表示与《大统历》历书数据不合,红色数字表示朔日干支错了。

年 份月 份合 朔 时 刻
《大统历》历书D1D2
嘉靖十年(1531年)丙戌亥正一刻 (22.932±0.005)22.93122.968
丙辰未正二刻 (52.608±0.005)52.60552.653
丙戌寅初二刻 (22.150±0.005)22.15422.201
乙卯未正初刻 (51.588±0.005)51.59051.628
甲申亥正二刻 (20.942±0.005)20.93720.960
甲寅卯初一刻 (50.223±0.005)50.22050.224
闰六癸未午初三刻 (19.493±0.005)19.49119.476
壬子戌初二刻 (48.817±0.005)48.81448.783
壬午卯初初刻 (18.213±0.005)18.21118.169
辛亥酉初初刻 (47.713±0.005)47.71447.668
辛巳辰初三刻 (17.327±0.005)17.33017.289
十一辛亥丑初三刻 (47.077±0.005)47.07647.052
十二庚辰亥初二刻 (16.900±0.005)16.90216.904
嘉靖十一年(1532年)庚戌酉初初刻 (46.713±0.005)46.71646.743
庚辰巳正一刻 (16.432±0.005)16.43516.478
庚戌子正三刻 (46.035±0.005)46.03446.081
己卯午正一刻 (15.515±0.005)15.51715.559
戊申亥初二刻 (44.900±0.005)44.89944.927
戊寅卯初初刻 (14.213±0.005)14.21314.225
丁未午正一刻 (43.515±0.005)43.51943.513
丙子戌正初刻 (12.838±0.005)12.83912.818
丙午卯初一刻 (42.223±0.005)42.21842.186
乙亥申正一刻 (11.682±0.005)11.68111.642
十一乙巳卯正初刻 (41.255±0.005)41.25341.216
十二甲戌亥正一刻 (10.932±0.005)10.93110.904
万历三十二年(1604年)壬子巳正三刻 (48.452±0.005)48.44748.431
壬午寅正二刻 (18.192±0.005)18.19018.192
辛亥亥正二刻 (47.942±0.005)47.93947.961
辛巳未正三刻 (17.618±0.005)17.62217.656
辛亥寅正?刻 (47.187±0.021)47.20447.242
庚辰申正?刻 (16.687±0.021)16.67716.709
万历四十四年(1616年)壬申申正三刻 (8.702±0.005)8.6998.700
壬寅丑正二刻 (38.108±0.005)38.11138.102
辛未午正三刻 (7.535±0.005)7.5337.516
庚子夜子初三刻 (36.993±0.005)36.98836.964
庚午午初二刻 (6.483±0.005)6.4816.452
庚子子正三刻 (36.035±0.005)36.03536.007
己巳申正一刻 (5.682±0.005)5.6805.662
己亥巳初初刻 (35.380±0.005)35.38435.381
己巳丑初三刻 (5.077±0.005)5.0785.090
戊戌酉初三刻 (34.743±0.005)34.74034.762
十一戊辰辰正二刻 (4.358±0.005)4.3544.382
十二丁酉亥初三刻 (33.910±0.005)33.91133.940
崇祯二年(1629年)丁巳戌初初刻 (53.797±0.005)53.80153.820
丁亥未初二刻 (23.567±0.005)23.56723.606
丁巳卯初初刻 (53.213±0.005)53.21753.265
丙戌酉初三刻 (22.743±0.005)22.74122.786
闰四丙辰寅初三刻 (52.160±0.005)52.16352.198
乙酉午初三刻 (21.493±0.005)21.49421.513
甲寅酉正三刻 (50.785±0.005)50.78550.786
崇祯十二年(1639年)己未辰初一刻 (55.307±0.005)55.31055.303
己丑丑正初刻 (25.088±0.005)25.08925.105
戊午戌初三刻 (54.827±0.005)54.82354.857
戊子巳正四刻 (24.4575±0.0008)24.457224.4988
丁巳夜子初二刻 (53.983±0.005)53.97954.019
丁亥巳初二刻 (23.400±0.005)23.40023.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年)撰的明朝编年体史书,汪曰桢说的该书那三个朔日资料其实是正确的。但是《国榷》的资料也不可尽信,例如《历代长术辑要》在万历三十年注有「国榷九庚申朔不合」,在万历三十二年注有「国榷十二丁未朔不合」,这两个朔日确实和存世的大统历书不合。《历代长术辑要》在洪武三年注有「国榷二辛酉朔不合」,这朔日是表二所列的第一个朔日,《国榷》的资料虽然符合推步结果,但只能作为旁证。

从表中可见除了洪武三年二月朔和弘治十年十月朔非常接近午夜零时外,其余九个合朔都不是很接近日界,鉴于推步的结果至今还未发现与大统历书不符,笔者怀疑余下的四个朔日里,各历表的日期至少有两个有错。但是在找到可靠资料前,本网站的中历对这四个朔日日期仍以各历表为准。



参 考 文 献