南宋历法中的交食算法及其计算精度
2018-04-18滕艳辉王鹏云刘娅娅
滕艳辉,王鹏云,刘娅娅
(1.咸阳师范学院 数学与信息科学学院,陕西 咸阳 712000;2.西安财经学院 统计学院,陕西 西安 710100)
在天文历法方面,南宋在北宋的基础上取得了一定的发展。那么,南宋时期的历法推算方法和推算精度相比过去有着怎样的提升或变化呢?本文将对南宋历法中的交食推步和计算精度问题展开讨论。
1 南宋历法中的交食计算方法
南宋自1135年至1279年共行用11部历法。其中《纪元历》是北宋制定的历法,《本天》、《淳祐》和《会天》三历目前已经失传,这样,《宋史》在南宋部分只记载了其余7部历法的内容。《宋史·律历志》将《统元》、《乾道》、《淳熙》和《会元》四历记载在一起,将《统天》、《开禧》和《会天》三历记载在一起。然而,正史仅是记载了这些历法的常数、表格和推算的步骤名称,对推算步骤的具体术文则略去不记,仅是在每一部分的结尾注明“法同前历,此不载”[1]。这样,我们现在是不知道这些历法的推算算法的。
1.1 南宋历法中交食算法的推算术文
一般认为,南宋的历法多是根据北宋历法修订而来。虽然正史未载其术文,但根据“法同前历,此不载”,可知这些历法的推算方法与前面某部历法是一样的。它们仅是基本天文常数存在差异,修史者为避免重复,略去不记。问题是,这里的“前历”指的是哪部历法呢?一些学者认为“前历”当指北宋最后一部历法《纪元历》,因这在时间上是贴合实际的[2-4]。
然而,就交食计算而言,当我们详查《统元历》等4部历法的推算步骤时,发现它们的某些步骤与《纪元历》不一致。《统元历》在“求入交常日”后有“求朔望加时入交定日”而《纪元历》则无此项;《纪元历》在求气、刻差之后有“求朔入交定日”和“求望入交定日”而《统元历》则无。根据《纪元历》算法,“入交定日”一定是在视差修正之后求得,因此,两者的“入交定日”所指有异[5]。在比较《统天历》等3部历法的推算步骤时,我们发现它们在视差修正前有“求入交数、常、望定日”,而在视差修正后只有求“朔入交定日”,它们的步骤与《纪元历》的相近。由于交食计算要用到每日的太阳视赤纬,我们查看南宋历法晷影漏刻部分的常数和推算过程时,发现《统元》四历是利用消息定数来计算,这与《崇天历》的过程相同;而《统天》三历直接根据每日午中的限度去计算,这与《纪元历》的相同[6]。
《宋史·律历志》记载“《统元历》颁行虽久,有司不善用之,暗用《纪元》法推步,而以《统元》为名。乾道二年,日官以《纪元历》推三年丁亥岁十一月甲子朔,将颁行,裴伯寿诣礼部陈《统元历》法当进作乙丑朔,于是依《统元历》法正之。”(文献[1],2870页)那么,《统元》和《纪元》的常数及计算的复杂性差不多,如果两者的方法一致,有司为什么还要暗用《纪元》呢。
以上这些,都说明,《统元历》等4部历法与《纪元历》的算法是不同的,而《统天历》等3部历法与《纪元历》可能相同。北宋影响最大,且算法最成熟的是《崇天历》和《纪元历》。《崇天历》前后行用40多年,其后《观天历》的交食算法也完全与它相同。比较《统元历》,我们发现其交食推算步骤也与《崇天历》一致。这样,我们猜测《统元历》记载中的“前历”应该是《崇天历》*宋初三历无论行文描述还是推算过程都不成熟,加之时间相隔太久,南宋的历家们不可能依其为模板;虽然周琮自认为《明天历》的推步和数据都很优秀,但其精度却没有想象的高,而其后的《观天历》大部分算法是延用《崇天历》的算法;《奉元历》和《占天历》南宋时已经失传,《观天历》与《崇天历》几乎相同。这样,南宋历法可能采用的算法只有《崇天历》和《纪元历》的。。
1.2 《宋史》中交食推算结果的分析
为了进一步证实猜测,我们将南宋历法的常数分别代入《崇天历》和《纪元历》的交食算法中,分析它们推算结果的异同。《宋史》记载,在历法改革或评议时,历算家为了说明某部历法的优劣,有用其推算交食的情况。如果这些结果与我们使用《崇天历》算法所得结果相一致,则可以进一步证明这部历法使用了《崇天历》的交食推算方法,对于《纪元历》,情况一样。下面,我们将对每一条记录进行分析。
a. 《统元历》编制时,《宋史》记载“绍兴五年,日官言,正月朔旦日食九分半,亏在辰正。常州布衣陈得一言:当食八分半,亏在巳初。其言卒验”(文献[1],2869页)。陈得一当是用他所编制的《统元历》推算这次日食,初亏在巳初,按现在时间大约上午9∶00至9∶14。我们将《统元历》的常数代入《崇天历》重新计算的结果是食分8.50分,初亏时刻是9∶01;而代入《纪元历》的结果是食分8.87分,初亏时刻是8∶45[7-9]*因古代日月食的过程计算相当复杂,限于篇幅,本文不可能将计算过程和中间结果列出,相关计算可参考文献[7-9]。。史料结果显然与用《崇天历》推算的结果一致,而与《纪元历》的有一定差异。
b. 在《乾道历》制定中,史载“(孝荣)又定去年(乾道三年)二月望夜二更五点月食九分以上,出地复满。臣尝言于宰相,是月之食当食既出地,《纪元历》亦食既出地,生光在戌初三刻,复满在戌正三刻。是夕,月出地时有微云,至昏时见月已食既,至戌初三刻果生光,即食既出地可知;复满在戌正三刻,时二更二点:臣所言卒验。孝荣言见行历交食先天六刻,今所定月食复满,乃后天四刻,新历谬误为甚。” (文献[1],2879页)刘孝荣应当使用他所制定的《乾道历》推算,月食食分9分以上,复满时刻比真实晚了4刻(大约1小时),实际月食复满在戌正三刻(大约20∶43),《乾道历》计算结果大约是21∶43。我们回推的结果是:使用《崇天历》算法复满21∶39,使用《纪元历》算法复满是20∶05。由此可见,《乾道历》应该使用了《崇天历》的月食算法。
c. 史载《乾道历》推算日食“……而太史局丞、同判太史局荆大声言《乾道历》加时系不及进限四十二分,定今年(乾道九年)五月朔日食亏初在午时一刻。今测验日食亏初在午时五刻半,《乾道历》加时弱四百五十分……”(文献[1],2882页)以《乾道历》推算乾道九年的日食亏初时刻午时一刻,约11∶14分。用《崇天历》算法推算得11∶12分,《纪元历》推算得11∶08,两者都很接近,但以《崇天历》算法更接近史载记录值。
d. 关于《乾道历》,还有“且定是年(乾道四年)四月戊辰朔日食一分,日官言食二分,伯寿并非之,既而精明不食。”(文献[1],2871页)以《乾道历》推算乾道三年的日食是一分,用《崇天历》算法推算得2.67分,《纪元历》法算得3.48分,虽然都与记录不很吻合,但《崇天历》推算的更接近些。
e. 淳熙历的推算,史载“以《淳熙历》推之,九月望夜,月食大分五、小分二十六,带入渐进大分三、小分四十七;亏初在东北,卯初三刻,系攒点九刻后;食甚在正北,卯正三刻后;复满在西北,辰正初刻后,并在昼。”(文献[1],2886页)表明使用《淳熙历》推算淳熙十二年九月的月食,最大食分5.26分,日出带食分数是3.47分,初亏时刻是5∶43,食甚时刻在6∶43以后,复满在8∶00以后。我们复原的结果是食分5.25分,日出带食分数4.79分,这个值略大;用《崇天历》算法推算得,初亏时刻是5∶30,食甚是6∶35,复满是7∶39,《纪元历》法算得初亏时刻是5∶14,食甚是6∶23,复满是7∶31,虽然都与记录不很吻合,但《崇天历》推算的更接近些。
f. 史载“五年,降算造成永祥一官,以元算日食未初三刻,今未正四刻,元算亏八分,今止六分故也。”(文献[1],2896页)记载使用《开禧历》推算淳祐五年日食食分8分,食甚未初三刻,约13∶43分。我们使用《纪元历》算法推得食分7.94分,食甚13∶59,与史载记录基本吻合;使用《崇天历》算法推算食分9.35分,食甚14∶01,食甚差不多,而食分差了很多。
我们将各条记录重新计算的结果、史料记载的结果及它们之间的对比情况列于表1中。
以上的分析我们不难得到,《统元》四历的交食推算应该使用了《崇天历》的计算方法,而《开禧历》则使用了《纪元历》的方法。当我们考察《宋史·天文志》时,特别留意那些“当食不食”或“阴云不见”的情形,因为这很有可能是用历法推算了某日有交食,但当时并没有发生日食。如果当天正好有阴雨,无论真实情况是否发生交食,都会记录“阴云不见”字样。《宋史·天文志》载有这样的日食记录二十余次,根据历法行用年代,我们分别依照《纪元历》和《崇天历》的算法进行推算,结果除去一次记录外,两者的推算并没有差异。但唯一的不同是嘉定四年十一月(1211年12月7日)的那次日食,《天文志》载“日当食,太史言不见亏分”[10]。当时行用《开禧历》,使用《纪元历》算法推算当食1.36分,而《崇天历》算法则不能推算出日食。这也是《开禧历》使用了《纪元历》算法的又一个佐证。
2 南宋历法的交食计算精度
已经知道了南宋现存的七部历法的交食计算过程,接下来,我们考察各部历法的交食计算精度。为了计算方便,我们将这些历法的交食算法编写成计算机程序,利用程序快速计算某年月的交食情况。本文的所有计算结果都是依Visual Basic 9.0语言所编写的程序计算的。我们选择以某部历法行用初年为准,向前和向后各推100年,计算这200年间的所有可见日食,得到每次日食的食甚时刻和食分大小。将所得结果与现代天文学所计算的当时真实日食结果做比较,并选取比较结果差值的绝对值平均值、最大值等几个指标来评价南宋历法日食精度*中国古代历法中,月食的食甚和食分计算相对简单,但中国古代月食计算中不区分半影月食,这使得在与现代结果的比较上存在困难,本文暂不讨论月食的精度。。由于食甚结果受经度影响,食分结果与纬度有关,为了使计算结果更为客观,现代结果的选取上,《统元》等4历选择宋岳台(开封)的可见日食,《统天》等3历选择宋临安(杭州)的可见日食*《统元》等4历常数来源于《纪元历》在岳台的观测数据,《统天》等3历重新在临安测得了常数。。我们将比较的精度结果列于表2中。
表1 《宋史》中所载历法推算记录与复原计算结果比较表Tab.1 Comparison of Recovered Results and Calendar Records in Song History
附注1:①“历推值”表示某部历法用计算机程序计算的结果值;“记录值”指《宋史》中记载的历法推算记录换算成的现代时间表示,其中一刻按14.4分钟计算;“现代值”指现代天文学回推的当时真时的天象结果值;②“统元历C”的历推值指按照《统元历》的天文常数和《崇天历》的算法推算得到的结果,“统元历J”的历推值指按照《统元历》的天文常数和《纪元历》的算法推算得到的结果;其他历法与此同;③“食分”的历法推算结果按古代的传统取作以10分为限(月全食以15为准),现代值是现代计算的食分乘以10所得的结果。
比较结果表明,南宋历法推算日食的客观精度平均值是食甚0.5759小时,大约35分钟,食分1.54分。按照周琮给出的“校日月交食,若一分二刻以下为亲,二分四刻以下为近,三分五刻以上为远”(文献[1],2688页)的交食标准,南宋交食计算整体上满足当时的要求。当然,这个结果是依照历法计算出来的可以对比的数据得到的,也就是只有当客观上有交食发生而历法也能计算出来的情况下得到的。然而,有些结果是历法计算出来有日食而实际上并未发生或是在观测地点并不可见,我们称为“当食不食”;还有些是真实发生了日食,历法却计算不出来,我们称“不当食而食”。显然,能否确定有无交食发生才是历法交食计算优劣的首要标准,这直接关系到是否要进行有关祭祀等活动的安排。无论食分大小,只要有交食,都是极其重要的事情[11]。七部历法平均可比较的次数是65次,而“当食不食”就有28次,还有4次“不当食而食”,这样的结果意味着,历法将有三分之一的推算都不准确。此外,食甚误差大于1小时的个数10次,食分误差大于2分的16次,此时依照周琮的标准看,南宋历法的推算可能有一半都是不合标准的。
表2 宋代历法日食计算精度比较表Tab.2 Comparison of Computational Accuracy of Solar Eclipse in Song History
注:表中“日食个数”是指历法能推算出并且真实存在的日食,是可以比较的日食。“食甚均值”和“食甚最值”的单位是小时,“食分均值”和“食分最值”的单位是分。
这些失误推算中,“当食不食”的占绝大多数,而“不当食而食”的基本都是食分小于2的小食分日食,这可能是由于中国传统历法所使用的必偏食限略大。在当时的统治者和造历者看来,“当食不食”提前准备总比突然出现日食而事先并没有计算出来更能接受些[12-13]。这也可能是《天文志》中有很多记录是“当食不食”,而未记载有“不当食而食”的原因吧。
就具体每一步历法而言,推算失误比例最大的是《统元历》,36次,最好的是《成天历》,27次,但相差不是很大。而推算精度方面,食甚误差最大的《会元历》超过0.8小时,最小的《开禧历》仅有0.4小时,差距明显;食分误差最大的《统元历》超过2分,最小的《淳熙历》仅有1.3分。各部历法的精度变化趋势如图1所示。无论食分还是食甚,《统天》等三历的推算明显好于《统元》等四历,尤其是《开禧历》,在8项指标中有6项都是所有历法中最好的,几乎达到了《纪元历》的日食推算水平。虽然《统天历》之后的历法使用了更为精确的基本天文常数,但《统天》等历法使用了较《崇天历》更优秀的《纪元历》交食算法,对计算精度的提高起到了更重要的作用。
图1 南宋历法日食计算精度图Fig.1 Computational Accuracy of Solar Eclipse in Calendars of Southern Song Dynasty
《崇天历》已经给出了日食食甚算法的完整模型,几乎被后来的所有历法所采用。但是《崇天历》的食分和食限算法还有一定缺陷,由于其日食的判断采用“内外道”法,使得某些日食推算不准。而《纪元历》采用“入交定日”来判断交食,食分算法更为合理[14]。这样,食分计算上《崇天历》算法的效果不如《纪元历》好就是很容易解释的了。《崇天历》的时差算法直接以定朔时刻的时角而不是视食甚时刻的时角入算,使得其食甚时刻的计算精度仍是不如《纪元历》的算法优越[15]。由此看来,《纪元历》算法下的历法就要比《崇天历》的能更好的满足当时人们的需要[11]。
3 结 语
中国传统历法完整或接近完整地保存至今的不足30部,对那些残缺的历法进行修补和修复就是很有价值的了。南宋的这七部历法保存有大量常数和表格,保存少量或没有术文。相对那些仅记载若干常数或是仅出现了名字的历法,它们的修补是比较容易实现的。我们通过文献对比,分析《纪元历》、《崇天历》以及这七部历法的交食算法术文,发现《统元》四历与《崇天历》的相似之处和《统天》三历与《纪元历》的相似之处。我们根据史载的历法推算结果,通过六条史载记录的回推计算,证明了《统元》等四历使用了《崇天历》的交食推算方法,而《统天》等三历使用了《纪元历》的交食推算方法。当然,发掘史料中的文字性证据可以更好地为我们的结论提供佐证,这将是今后的一个工作方向。
我们将《统元》四历按照《崇天历》的算法编写计算机程序,而将《统天》三历按照《纪元历》的算法编写程序,计算出来各部历法行用前后各100年间的所有可见日食,并与真实的天象作比较,得到这些历法的推算精度。得到的结果是,南宋历法推算日食食甚的平均误差0.5759小时,食分误差1.54分。然而,这些历法,尤其是《统元》四历,经常出现推算失误,有将近一半的推算达不到当时的标准,又以无可见日食而历法却推出日食的情况居多。以《纪元历》算法为基础的《统天》三历的推算水平明显高于以《崇天历》算法为基础的《统元》四历。
南宋前期,历法改革频繁,历法的讨论和争议也很多,到了后期,这种现象缓和了很多,如《开禧历》就行用了长达45年之久,这些也可能和历法的精度有密切联系。《崇天历》算法精度确实不如《纪元历》算法,南宋前期的历法家也懂得《纪元历》的推算过程,但陈得一和刘孝荣他们为什么还是使用了《崇天历》的算法?使用《纪元历》算法的《开禧历》推算水平是南宋最优的,但它还是达不到《纪元历》的精度,这又是为什么呢?这些问题也是值得思考和讨论的。
参考文献:
[1]脱脱,帖睦尔达世,贺惟一,等. 宋史·律历志[M]∥历代天文等志汇编(8) . 北京:中华书局,1976:2931,2998.
[2]唐泉. 日食与视差[M]. 北京:科学出版社,2011:253.
[3]唐泉. 中国古代日食食分算法[J]. 自然科学史研究,2005,24(1):29-44.
[4]曲安京,唐泉. 中国古代的月食时差算法[J]. 自然科学史研究,2008,27(3):301-308.
[5]曲安京. 中国数理天文学[M]. 北京:科学出版社,2008:394-396.
[6]曲安京,王辉,袁敏. “消息定数”探析[J]. 自然科学史研究,2001,20(4):302-311.
[7]滕艳辉, 唐泉. 《纪元历》日食算法及精度分析[J]. 自然科学史研究,2013,32(2):140-155.
[8]滕艳辉, 王鹏云. 《纪元历》定朔算法模型及分析[J]. 西北大学学报(自然科学版),2008,38(5):855-858.
[9]薄树人. 《纪元历》解[M]∥薄树人文集. 合肥:中国科学技术大学出版社, 2003.
[10] 脱脱,帖睦尔达世,贺惟一等. 宋史·天文志[M]∥历代天文等志汇编(3). 北京:中华书局,1976:931.
[11] 滕艳辉. 宋代朔润与交食研究[D]. 西安:西北大学,2012:168.
[12] 陈美东, 中国古代的月食食限及食分计算法[J]. 自然科学史研究,1991,10(4): 297-314.
[13] 曲安京. 中国古代日食食限与食分算法[J]. 中国科技史杂志,2008,29(4):347-357.
[14] 滕艳辉. 宋代的日食食限算法[J]. 科学技术哲学研究,2014,31(5):78-83.
[15] 曲安京,唐泉.中国古代的日食时差算法[J].石河子大学学报(自然科学版),2005,23(4):416-421.