《崇祯历书·交食表》研究

2022-01-05 08:35褚龙飞
中国科技史杂志 2021年4期
关键词:交角历书崇祯

纪 辰 褚龙飞

(中国科学技术大学科技史与科技考古系,合肥 230026)

由于中国古代历法推算日趋复杂,天文计算逐渐走向“程式化”,至明代直接使用“立成”推算已成为主流[1]。而这种做法的弊端也很明显,就是容易使天文学者难以知晓编算历表的方法,即所谓“历理”。为了避免这种情况再次出现,崇祯年间采用西法的改历活动开始时,作为“总设计师”的徐光启(1562—1633)强调:“每遇一差,必寻其所以差之故;每用一法,必论其所以不差之故。”([2],页1561)因此,《崇祯历书》不仅包含用于实际推算的历表,同时还有卷帙浩繁的原理解释与模型介绍。交食部分也不例外,《交食历指》主要介绍理论知识,《交食表》则是推算交食的直接工具。按照徐光启的设想,每个交食算表的计算方法都应该交代清楚;不仅如此,这些算表还应该与历指部分的几何模型相吻合。然而,事实上这个目标并未实现,虽然大部分交食算表前都有相应的“算法”介绍,但仍存在一些不够清楚的地方。尤其“视半径表”,传教士不仅没有交代日月视半径的算法是否符合几何模型,给出的地影半径算法也不够完整,且该表还隐藏了一处错误。另外,《交食表》是否与《崇祯历书》其他部分存在不一致之处,它们是否会影响到交食推算的结果,这些都只有对《交食表》进行系统深入的研究才能得知。

虽然《崇祯历书》中的交食问题早已受到学界关注,但前人研究大多集中于西法交食预报[3—5],另有少数涉及交食理论或从比较、传播与交流等角度进行的讨论[6—7],目前尚未出现关于《交食表》本身的系统研究,其中各表的算法更无人论及。事实上,历表在明清历法推算中发挥着至关重要的作用,而表的算法也同样重要;如黄宗羲(1610—1695)所言,“盖作者之精神尽在于表”,若能“使推者不必见表,而自能成表,则尤为尽善也”[8]。鉴于交食理论在《崇祯历书》中的重要地位,以及研究历表算法在明清天文学史研究中的必要性,本文拟对《交食表》进行系统研究并探讨相关问题。

1 《崇祯历书·交食表》概述

《崇祯历书·交食表》共九卷,总计22种算表,根据各表计算原理大致可分为三类,如表1所示:第一类以日月周期运动规律为基础,用于计算交食推步过程中的日月平均运动,因此也可称为“平行表”;第二类以日月运动的几何模型为基础,主要用于计算交食推步过程中的日月实际位置或速度,以及与日月地三者之间距离相关的参数;第三类与日月的运动无关,其内容为单纯的数学变换,主要以球面或欧式几何为基础。

表1 《交食表》算表分类情况(1)《交食表》中的“十二宫距宿钤”和“升度表”与推算交食相关性不强,亦非计算交食专用。“时气差简表”介绍的是“时气差表”的另一种计算方法,在日食的推步过程中实际上根本不会用到。因此,本文不拟对上述三表进行讨论。

第一类算表中,“历元后二百恒年五行表”(下文简称“二百恒年表”)、“历元前总甲子表”与“六十零年散用五行表”都是推算某一特定时间点(如某年、某甲子等)的相应初始值,而“十三月表”与“四行时表”则用来计算两个时间点之间的相应差数。下文以“二百恒年表”和“十三月表”为例,来说明这两种平行表的用途。“二百恒年表”中的某年“首朔”为该年前一年天正冬至次日子正后的第一个平朔(2)“历元前总甲子表”情况稍有不同,其中首朔“用以冬至最近者”,“不拘在先与后也”。,查表(图1左)可得戊辰年(即崇祯元年,1628年)首朔为一四日一六时二六分四六秒,表示崇祯元年首朔为该年年前天正冬至次日子正后14日16时26分46秒。其他参数情况类似,太阳引数为该年首朔时刻的太阳平近点角,太阴引数为太阴平远点角,交周度为太阴白道平经度与白道升交点的白道平经度之差,太阳经度为太阳平黄经,宿、纪日则为天正冬至后第一日所在宿及干支([2],页747—748)。“十三月表”根据月数列出各项参数的相应数据,如太阳引数三个朔望月(即八八日一四时一二分〇九秒)的运行为二宫二七度一九分〇二秒(图1右);此外,该表最末还列出了“望策”(即半个朔望月)对应的数据([2],页761)。在求得某年首朔后,可由“十三月表”进一步求出该年任一平朔或平望时刻,以及相应的太阳与太阴引数等行度。

图1 《交食表》平行表图例(左为“二百恒年表”,右为“十三月表”)

第二类算表中的“加减度表”和“太阴实行表”用于计算日月的实际位置或速度,“太阳太阴视差表”和“视半径表”则与日月地三者之间的距离有关。显然,这类算表的推算都要用到日月运动的几何模型。譬如,由于地半径与日月距地心的距离相比并非可以忽略不计,而在地面上不同位置观测日月会存在视差,因此计算“太阳太阴视差表”中的数据就需要用到日月地三者之间的距离(3)月距地数的求解详见本文第3节,日距地数的计算与之类似。。再如,“太阴实行表”所算为月亮一小时之实行,即月亮的实际运动速度,所以必然也会用到月亮运动的几何模型。

第三类算表主要是数学变换问题,尤其以球面三角形变换居多,典型者如“黄道九十度表”。该表数据基本上都是在相应的球面三角形中求得,其中“加时”的本质是将太阳黄经转换赤经,“黄道九十度限”为过黄极和天顶的大圈与黄道交点的黄经度,“九十度距子午”为子午圈和黄道的交点与黄道九十度限的黄经差,“九十度距天顶”为黄道九十度限与天顶的黄纬差,三者主要在由天顶、黄道九十度限、子午圈与黄道交点所构成的球面直角三角形中求解。再如,“时气差表”是根据视差求“时差”和“气差”,由于“三差并以三小弧”构成的球面直角三角形可近似为平面直角三角形,所以直接根据正弦定理便可求得“时差”与“气差”([2],页915)。

此外,上述所有算表前都有一段说明文字,其内容分为“算法”和“用法”两部分(4)“十三月表”“四行时表”“升度表”和“太阴距度表”四者前只有“用法”而无“算法”。其中,“升度表”用法中提到“推算表法具在《测量全义》中”。“太阴距度表”的情况与之类似,其算法应见于《崇祯历书》月离部分。由于平行表所求参数基本相同,且“二百恒年表”前的“算法”已对这些参数的计算进行了详细介绍,“十三月表”和“四行时表”的计算方法与之类似,也比较简单,故似无必要再专门进行解释。同样地,“太阳距赤道表”和“日食月行表”前并未注明“用法”和“算法”,只有一段简单的说明,这应该是由于二者分别与之前“太阴距度表”和“月食时分表”的算法与用法基本相同,故无必要再详细说明。:“算法”部分先对算表及表中各项进行介绍,随后再说明如何计算各项;“用法”部分则主要说明如何查表的具体事项,比如以何参数入表查得某项,怎样确定所查参数的加减号,等等。虽然有些算表的“算法”部分没有直接给出计算方法,但明确指出详细算法见于《崇祯历书》其他部分(如《交食历指》)。通过这些“算法”的介绍或其中提示,基本可以厘清《交食表》各表的计算原理及方法。在所有算表中,“视半径表”的情况较为特殊,一方面该表所含参数非常重要,另一方面其表前“算法”介绍既不完整又不清晰,必须通过详细论述才能将其状况交代清楚。因此,下文拟先说明三类算表各自的特点及计算方法,然后再专门对“视半径表”进行深入讨论,分析该表的算法及其合理性。

2 《交食表》算法研究

如前所述,《交食表》中的算表大致可以分为三类,而每一类算表的计算方法其实是存在共性的,因此,为节省篇幅,本节将选取每类算表中最具代表性者进行解析,即“二百恒年表”“加减度表”和“交角表”。

2.1 “二百恒年表”算法分析

“二百恒年表”在“平行表”中最为重要,而该表的“算法”部分也较为详尽,基本包含了计算该表数值的相应算法。表中各项参数以“首朔”最为关键,其他各项的计算均以其为基础。由于相邻两年冬至后第一子正之差为一太阳平岁,十二朔实为一太阴年,所以首朔N+1=首朔N+12×朔实-太阳平岁(5)当N=1时,也就是崇祯元年,首朔为14日16时26分46秒。,其中一朔实为29日12时44分3秒;太阳平岁在平年时为365日,闰年时为366日。因为太阴年小于太阳平岁,故随着N的增加,必会出现所求首朔为负,针对这种情况表前“算法”明确指出“加一十三朔实而总数乃能减之”([2],页747),即首朔N+1=首朔N+13×朔实-太阳平岁。另外,还要注意闰年的情况,不过“二百恒年表”在其“算法”与“用法”部分并未给出判断某年是否为闰年的方法。实际上,具体的判断方法详载于《日躔表》卷一“历元后二百恒年表说”。按其所述,判断某年是否为闰年首先需要知道上一年的太阳平行“根数”gN-1,即其平冬至所在日次日子正时的太阳平行经度,若gN-1+d×365≥360°(6)其中d为太阳每日平行度分。,则该年为平年,当年根数gN=gN-1+d×365-360°;反之,该年则为闰年,当年根数gN=gN-1+d×366-360°。

显然,首朔的算法本质就是等差数列,而“二百恒年表”中的太阳引数、太阴引数、交周度和太阳经度等参数的算法也都类似,均为等差数列:IN+1=IN+D。结合算表,我们可以得到上述四项参数的首项I(即崇祯元年的相应数值)及公差D(7)各项参数的公差均有两种取值,分别与首朔公式的两个公差(“太阴年-太阳平岁”与“13朔实-太阳平岁”)相对应。“二百恒年表”中各项参数的首项及两公差如下,太阳引数:9°21′22″,-10°43′52″,-343°37′31′′;太阴引数:37°34′34″,-50°11′59′′,-24°22′59″;交周度:165°50′49″,8°2′47′′,38°43′1′′;太阳经度:15°21′21″,-10°43′8′′,18°23′16′′。。另外,“算法”部分还指出闰年“虽首朔多减一日”,但对该四项的影响“不须论也”([2],页748)。最后的纪日和宿则分别按照满六十去之和满二十八去之的原则进行计算即可。

尽管“二百恒年表”的表值与其“算法”部分并无矛盾,但结合《崇祯历书》日躔与月离的部分来看,则会发现一定的偏差。例如,用《日躔表》中的数据计算崇祯元年首朔,所得结果为14日16时27分21秒,较“二百恒年表”中的表值大了35秒;如果用后期版本修改后的太阳平行历元根数(8)关于《日躔表》的比较,见参考文献[10]和[11]。,即《西洋新法历书》所用数值,则计算结果为14日16时29分11秒,较表值偏差更多,大了2分25秒。尽管如此,“二百恒年表”使用的应该还是修改后的太阳平行历元根数,因为如果按照修改前的数值计算会出现闰年年份与表值不符(9)如前所述,判定闰年的算法与当年根数g和太阳每日平行d有关。其中,历元根数修改前为52′39″50‴,修改后为53′35″39‴,两者差异较为明显;而《日躔表》不同算表所用d的差别极小,对计算结果影响可以忽略不计。。另外,根据《日躔表》计算崇祯元年首朔的太阳引数也与“二百恒年表”不符,使用修改前后的太阳平行历元根数分别小11″和大42″;而根据《月离表》算得的太阴引数则比“二百恒年表”小了10′33″,所幸这些引数的偏差对交食推算的影响比较小。

2.2 “加减度表”算法分析

相比于“二百恒年表”,“加减度表”的情况较为复杂,因为该表的计算要涉及日月运动的几何模型。该表所求的太阳均度为实黄经与平黄经之差,太阴均度为白道实经度与平经度之差,分别以日月引数查表得到日月均度,加减于平行便可得到日月实经度。该表“算法”部分指出:“欲算表,先求自行为引数,则太阳以本圈半径及两心之差,夫本圈心与地中心。太阴以两轮小轮及次轮。及本轮之半径,皆依三角形可得。”显然,这里只是对算法的简单描述,而详细的算法则需要“查本《历指》,乃得其详法而算之”([2],页762)。

图2 《交食历指》中的太阳运动模型

图3 《交食历指》中的月亮运动模型

2.3 “交角表”算法分析

如前所述,“交角表”与日月的运动无关,其算法本质是一个球面几何问题。不过,该表存在一些极易引起误解的问题,下文将对其展开讨论。首先,该表虽然名为“天顶黄道两圈交角表”,顾名思义其所求应为经过天顶和太阳的大圆与黄道的交角,但表中实际数据却是此交角的余角。该表“用法”部分明确指出“查本表,横直两数所值之数,即得所求交角余角”([2],页894),“算法”部分给出的算法也是先求交角,再以90°减之得其余角。然而,“交角表”求得的角度本来是用于查“时气差表”的,但查“时气差表”使用的参数却并非交角余角,实际上是交角。由此可见,“交角表”先求交角再求其余角的做法不仅多余,而且还影响了其他算表的使用。

图4 天顶黄道两圈交角示意图

总的来看,尽管存在一些细节上的偏差,上述三表中的数据大体仍与各表“算法”部分相符。不仅如此,三表算法皆有理可依、有据可凭,符合日月的运动模型或球面几何学。虽然也有与《崇祯历书》其他部分(如《日躔表》)不一致的情况,但基本都不太影响交食的推算结果(或者影响甚微)。

3 “视半径表”算法探析

在《交食表》中,“视半径表”的算法情况最为特殊。该表所求参数共五项:太阳视半径、太阴视半径、月距地数、地影半径及地影差数,这些参数在计算交食的过程中都非常重要,直接关系到食分以及初亏、复圆的推算。但是,《崇祯历书》在该表“算法”部分只简单交代了日月视半径的算法,而该算法是否合理却未曾论及。至于其他参数,“算法”部分几乎只字未提,笔者不得不通过查阅《交食历指》相关章节,才得以厘清这些参数的计算方法。由于太阳和太阴视半径的算法基本相同,而地影半径、月距地数以及地影差数的算法又相互关联,因此下文将分别对其进行讨论。

3.1 太阳与太阴视半径

图5 《崇祯历书》日月视半径推算值与表值的比较

图6 日月视半径求解示意图

3.2 地影半径、月距地数与地影差数

虽然“视半径表”的算法部分没有介绍地影半径、月距地数与地影差数的计算方法,但在《交食历指》卷三的“地景视差”中介绍了这些参数的算法。实际上,传教士在“视半径表”中采用了一种类似于控制变量法的方式来编算“地影半径”和“地影差数”。表中所列“地影半径”是太阳固定在最高时,随着月亮位置的变化而得到的数据;“地影差数”则是月亮的位置固定时,太阳在不同位置与其在最高位置时的地影半径之差。为方便叙述,下文以“地影半径m”表示“视半径表”中的“地影半径”表值,以“地影半径s”表示月亮固定而太阳位置不固定时的地影半径。

图7 《交食历指》中 地影差数示意图

图8 修正前后的地影半径m计算值与表值的比较

虽然“视半径表”对地影半径m进行的修正看似与几何模型不符,但传教士这样做也并非没有依据。事实上,《崇祯历书》中的“地影半径”表值与隆格蒙塔努斯(Christen Sørensen Longomontanus,1562—1647)的《丹麦天文学》(AstronomiaDanica,1622)完全相同,而两者的算法其实也一致([13], p295)。隆格蒙塔努斯在书中对为何要修正地影半径进行了解释,如图9a,B为太阳,A为地球,H和L分别是在朔望时的月亮位置,DF、CE是由于蒙气等原因造成的日光大于其本体之光的部分,很明显日光E、F在L所在截面形成的地影要小于C、D所形成者,故而地影半径的观测值会偏小([13], pp293—294)。其实,在《崇祯历书》中也可以找到类似的内容,《交食历指》卷六“清蒙径差”篇曾对此专门进行讨论(图9b)([2],页311)。由此可见,传教士对地影半径m的修正是对欧洲新近研究成果的吸收,是完全合理的。

图9 地影半径观测值偏小示意图(a取自《丹麦天文学》,b取自《崇祯历书·交食历指》)

总而言之,“视半径表”是《交食表》中非常重要的一个算表,其算法基本也都可以在《崇祯历书》中找到。不过,传教士对这些算法的合理性未多作交代,本文对比分析后发现它们不仅是合理的,而且都可以找到对应的欧洲来源。

4 结语

本文对《交食表》进行了系统考察,按计算原理将其中算表分成三类,并选取每一类中的典型代表对其算法进行了分析。对各种算表的深入研究表明,传教士给出的算法均有其合理性。尽管有些参数的“算法”介绍看似缺乏理论依据,如“视半径表”中的日月视半径,但通过查阅第谷及隆格蒙塔努斯的著作等相关材料皆可验证其合理性。就《交食表》本身而言,尽管存在一些细微误差(如太阴视半径),但算法与算表数值之间基本可以互相符合。如果结合《崇祯历书》其他部分来看,虽然会出现前后理论不一致的情况,如前后参数存在偏差、模型不同等,但它们对于交食的推算影响都很小。

虽然整体来看《交食表》并无太大问题,但其中还是埋藏了一个可能影响交食推算结果的隐患。在“视半径表”中,传教士沿用西方天文学的传统,太阳引数表示的是太阳平远点角。事实上,第谷及隆格蒙塔努斯著作中使用的太阳引数一直都是平远点角,且《崇祯历书》其他天体(即月、五星)的引数也都是平远点角。但在《日躔表》中,太阳引数表示的其实是太阳平近点角。或许传教士在是为了兼顾中国传统历法以冬至为起点的习惯,才把太阳引数设定为平近点角(16)由于当时太阳近地点刚好在冬至点附近,因此将太阳引数设定为平近点角可以表面看起来符合以冬至为起算点的传统。。值得注意的是,《交食表》其他算表中的太阳引数也是平近点角,也就是说,传教士唯独在“视半径表”中忘记了他们对太阳引数的不同设定,而其原因目前尚不可知。根据计算太阳视半径以及地影差数的几何模型,只有用太阳平远点角去查“视半径表”才符合计算原理,而非平近点角。可见,《崇祯历书》此处确实存在错误,尽管全书对此丝毫没有解释。

那么,历局后来有没有发现这个错误呢?事实上应该是发现了的,这一点可以在张寀臣编撰的《交食经》中窥见端倪[14]。张寀臣是历局成员,曾参与《崇祯历书》的编纂工作,后授职五官司辰,因此《交食经》中的内容可以在一定程度上反映历局的情况。《交食经》虽然也写明以太阳引数入“视半径表”查太阳视半径,但其所给算例中的太阳视半径值实际上却是将太阳引数加减六宫转换为平远点角后入表才能查得的数据(17)《交食经》的算例中太阳引数为七宫四度五分二秒,只有将其减去六宫后入“视半径表”才能得到书中所给的太阳视半径值一十五分三秒。。如此看来,历局当时很可能已经知道了“视半径表”太阳引数的错误。不仅如此,清初康熙年间钦天监编撰的《算七政交食凌犯法》在“推日食法”中也指出,以太阳引数查“视半径表”时需先加六宫[15],可见此时钦天监非常清楚这项错误应当纠正。此外,梅文鼎在《交食蒙求》中也提到了这项修正,并明确指出这样做是由于“视半径表”太阳引数起于最高,“而加减表太阳引数起最卑”([16],页4—5、22)。显然,到了康熙后期无论钦天监还是民间天文学者,都已经完全知悉了这一问题,且他们都采用了相同的办法对其进行纠正。不过,直到《历象考成》对“视半径表”进行调整,将其改成直接用太阳平近点角去查“太阳视半径”,这一错误才从根本上得以消除。

另外,如本文2.3节所述,查“时气差表”所用参数应为“天顶黄道两圈交角”,而“交角表”所求者却为交角之余角,这一矛盾情况后来其实也被发现并纠正。《算七政交食凌犯法》采用的方法是,将用“交角表”算得的结果入“时气差表”查到的时差与气差互换数据,从而得到正确的结果[15](18)按“时气差表”算法,由交角之余角入表查得的时差恰好是交角入表查得的气差,反之亦然。。而梅文鼎在《交食蒙求》中则直接用90°减去“交角表”得到的数值,即真正的交角,然后再用其入“时气差表”([16],页6)。与“太阳引数”情况类似,直至《历象考成》将“交角表”所求数据改为交角,而非其余角,这一问题才从根本上得以解决。

虽然作为推算交食基础的《交食表》出现上述问题可能会影响到最终的推算结果,但考虑到当时改历工作的难度,而交食理论难度尤其大,加之崇祯年间时局动荡,《崇祯历书》编纂比较仓促,且改历初期历局官生尚未完全掌握算法,计算也不熟练,因此出现一些错误和矛盾也并非不可理解[11]。尽管如此,传教士最终提交的改历成果在实用层面基本还是“合格”的,而且为了实现徐光启“一义一法,必深言所以然之故”的目标([2],页1559),他们尽可能为所有交食算表都撰写了“算法”介绍,即便这项工作有可能超出了他们的能力范围。

猜你喜欢
交角历书崇祯
跨断层埋地连续管道最佳管线-断层交角研究
父亲的历书
浙江图书馆藏崇祯刻本《萍社诗选》述介
轴交角误差对内齿轮刮齿加工精度的影响分析
俄藏黑水城出土西夏历书研究——以инв.№8085夏天庆十二年(1205年)乙丑残历为例
曲面上的一般变换与交角*
“有君无臣”论:明清之际崇祯君臣的历史评价与君臣观流变
三维斜交角联锁织物结构的快速设计
利用HPOP轨道仿真模型实现接收机自主历书外推
崇祯朝“钦定逆案”三题