我国古代历法中应用的内插法

已知函数 f(x)在自变量是 x1,x2,⋯⋯xn 时的对应值是 f(x1),f

(x2),⋯⋯f(xn),求 xi 和 xi+1 之间的函数值的方法,称作内插法。如果 xn 是按等距离变化的,称自变数等间距内插法;如果 xn 是按不等距离变化的,称自变数不等间距内插法。例如 f(x)=x3,当 x=1,2,3,4,5,⋯⋯时,x3=1,8,27,64,125,⋯⋯求 x=4.26 时 x3=(4.26)3 的值,就可以应用等间距内插公式。等间距内插法的一般公式是:

f(x + nh) = f(x) + n ,Δf (x) + n( n − 1) Δ 2f (x)

1! 2!

+ + Δnf(x) (h>0),

其中

Δf(x)=f(x2)-f(x1) 叫一级差分,

Δ2f(x)=Δf(x2)-Δf(x1)

叫二级差分,⋯⋯

Δnf(x)=Δn-1f(x2)-Δn-1f(x1)

叫 n 级差分。从 n 级差分的定义容易得到,当 f(x)是一次函数时,二级差分是 0;f(x)是二次函数时,三级差分是 0;f(x)是 n 次函数时,n+1 级差分是 0。

我国古代历法工作者,为了制定一个好的历法,很早就应用内插法的公式。

朔、望跟制定历法和计算日、月食有密切关系。怎样确定合朔的准确时刻,一直是历法中一个重要的项目。根据一个朔望月的平均日数来确定合朔时刻,叫做“平朔”。例如《古四分历》、西汉《太初历》和《三统历》就是用平朔来确定合朔时刻的。这种方法所取的分数不是过大,就是过小, 年长日久,合朔发生的时刻不是提前就是推后。最初历法工作者以为这种提前和推后是分数部分不精密造成的,他们曾经企图调整分数部分以求得准确的平均朔望月日数来解决这个问题。但是由于月球运动的速度是随时间不同而变化的,因此平朔的方法不可能得到真正的合朔时刻。东汉初年,公元一世纪初,天文学家发现了月球绕地球运行的变速运动。东汉建安十一年(公元 206 年),刘洪在《乾象历》中首次提出用一次内插的方法来确定合朔的时刻。确定合朔发生的真正时刻叫做“定朔”。要根据月球运行的速度来计算合朔,不仅需要知道每日月球的运行度数,还必须知道小于一日的月球运

行度数。刘洪测出月球在一个近点月(月球从近地点出发绕地球运行一周又回到近地点的时间间隔)里每日运行的度数。设日数是 n,n 日共行的度数是 f(n),对 n+s(s<1)日月球运行的度数,刘洪应用下列一次内插公式

f(n+s)=f(n)+sΔ

进行计算,其中Δ是一级差分 f(n+1)-f(n)。刘洪以后,三国时期的杨伟,南北朝时期的何承天、祖冲之都是用这个公式计算月行度数的。因为月球运动速度一日之内就变化很大,f(n)不是一次函数,Δ2f(x)不等于0,因此上述公式只能得到不很精密的近似值。

随着天文观测技术的发展,天文学家认识到太阳运行速度的变化也影响到合朔时刻,因此提出测量日、月、五星视行度数的更加精密的内插公式。隋文帝开皇二十年(公元 600 年),天文学家刘焯在《皇极历》中提出一个推算日、月、五星视行度数的等间距二次内插公式:

s Δ1 + Δ 2 s s2

f (nl + s) = f (nl) + l ( 2 ) + l ( Δ1 − Δ2 ) − 2l 2 (Δ1 − Δ 2 )

(0<s<l,Δ1=f(nl+l)-f(nl),Δ2=f(nl+2l)-f(nl+l))。

求太阳的视行度数时,ι是一节气的日数;求月行度数时,ι=1 日。刘焯的公式虽比以前精密得多,但是由于节气日数ι实际上不是按等间距变化, 日、月、五星也不是作等加速运动(就是说三级差分不等于 0),因此仍然存在缺点。这两个问题分别由唐代一行和元代郭守敬等解决了。

唐玄宗开元十五年(公元 727 年),一行在他的《大衍历》中提出了不等间距的二次内插公式:

f(t + s) = f(t) + s Δ1 + Δ 2 + s( Δ1 − Δ 2 )

l1 + l 2 l 1 l

− s ( Δ1 − Δ 2 ) (l ≠l ,s<1) 。

l + l l l 1 2

1 2 1 2

当ι1=ι2 时,和刘焯的等间距二次内插公式相同。

元世祖至元十八年(公元 1281 年),郭守敬等的《授时历》在计算日、月、五星视行度数中考虑了日、月、五星运行的不等速运动情况,认为距离是时间的三次函数。不过《授时历》没有求出三次内插公式,而是用差分表来解决这个问题的。例如计算太阳每日的运行度数:《授时历》把冬至到春分(共 88.91 日)这一象限分成六段,测出每段太阳的实际运行度数,就可以算出以段为等间距的差分表。从表中知道,三级差分都相等而四级差分等于 0,因此考虑

f(t)=d+at+bt2+ct3。

实际上,f(0)=0(第 0 段的运行度数是 0),可见 d=0。所以

f(t)=at+bt2+ct3。这样就可以变三次函数为二次函数

F( t) = f (t) = a + bt + ct 2

t

应用二次内插公式便可以算出 F(t)的具体表达式,从而得到f(t)=tF(t)=513.32t-2.46t2-0.0031t3。

令 t=0,1,2,3,按差分的定义便可以求出 f(0),Δ1,Δ2,Δ3(Δ4

=0),继续按差分定义,用加减法就可以得出以日为等间距的差分表②。从公元三世纪到公元十三世纪一千多年中,内插法在天文学家和数学家

中得到广泛的应用,除上面提到的以外,如唐代傅仁均的《戊寅历》(公元619 年)、李淳风的《麟德历》(公元 664 年)、徐昂的《宣明历》(公元

822 年)、宋代秦九韶《数书九章》(公元 1247 年)的“缀术推星”、元代

朱世杰《四元玉鉴》(公元 1303 年)的“如象招数”等等。特别需要提出的是朱世杰的工作。

朱世杰“如象招数”①的问题是已知一级差分Δf(x)=(2+x)3(x=1,2⋯⋯15),

求 f(n)(n=15),他得到的公式是:

f (n) = nΔ +

1 n(n − 1)Δ 2 +

2!

1 n(n − 1)(n − 2)Δ 3

3!

+ 1 n(n − 1)( n − 2)Δ 4 , 4!

这里Δ、Δ2、Δ3、Δ4 分别代表各级差分的第一个差分。朱世杰知道,公式的系数恰恰就是“古法七乘方图”(见后面第 133 页)从左边开始的斜线的数字的和,因此他把这一公式推广到一般情况是毫无问趣的。注意到 f(0)

=0,就可以看出朱世杰的公式和我们一开头介绍的等间距内插法的一般公式基本上是一样的,比欧洲最早得到这个公式的格雷果里(公元 1670 年) 早三百六十七年。

恩格斯在论述“科学的发生和发展一开始就是由生产决定的”②的时候,首先提到天文学的需要而展开的数学。从上所述可以看出,我国的内插法是从天文学的需要中发展起来的,是在修改历法中逐渐完善的,它的应用比欧洲早一千年。

② 古代开平方法和开立方法,用几何图形来证明。初商 a 的乘方(a2,a3)表示成一个大的正方形或立方体,称为“积”或“方”;次商 b 的乘方(b2,b3)表示成一个小正方形或小立方体,占据图形中的一个小角落,所以称为隅,初商和次商的乘积分别是长方形(ab)或长方体(a2b,ab2),占据图形的侧边, 所以称为廉(廉是侧边的意思)。开平方有二廉,就是贾宪三角中第三行的“二”,开立方有三方廉,三长廉,就是贾宪三角中的第四行的“三、三”。

① 关于《授时历》中怎样求差分,以及这里 f(t)的具体表达式中各项系数是怎样算出来的,这里都从略, 可以参看钱宝琮主编:《中国数学史》,科学出版社 1964 年版,第 191—197 页。

② 关于“如象招数”的问题,可以参看钱宝琮著:《中国数学史话》,中国青年出版社 1957 年版,第 136—137

页。