内插法和垛积术
自然科学史研究所 梅荣照我国古代历法中应用的内插法
已知函数 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(x ) − ∆f(x )
∆n f (x) = ∆n−1f (x ) − ∆n−1f (x )
叫 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 (n!+ s) = f (n!) + 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))。
求太阳的视行度数时,l 是一节气的日数;求月行度数时,l=1 日。刘焯的公式虽比以前精密得多,但是由于节气日数 l 实际上不是按等间距变化, 日、月、五星也不是作等加速运动(就是说三级差分不等于 0),因此仍然存在缺点。这两个问题分别由唐代一行和元代郭守敬等解决了。
唐玄宗开元十五年(公元 727 年),一行在他的《大衍历》中提出了不等间距的二次内插公式:
∆1 + ∆ 2
∆1 ∆ 2
s2 ∆1 ∆ 2
f (t + s) = f (t) + s l
1 + l 2
- s(
1
- l ) − l
(
1 + l2 l1
− )(l1 ≠ l 2 ,s < 1) 。
2
当 l1=l2 时,和刘焯的等间距二次内插公式相同。
元世祖至元十八年(公元 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 年)、徐昂的《宣明历》(公元
① 萨顿(1884-1956)是美国科学史家,代表作是《科学史引论》(公元 1927-1947 年)。力勃雷希这里所引的话就出自那部书。
822 年)、宋代秦九韶《数书九章》(公元 1247 年)的“缀术推星”、元代
朱世杰《四元玉鉴》(公元 1303 年)的“如象招数”等等。特别需要提出的是朱世杰的工作。
朱世杰“如象招数”①的问题是已知一级差分
△f(x)=(2+x)3(x=1,2⋯⋯15), 求 f(n)(n=15),他得到的公式是:
f(n) = n△ + 1 n(n-1)△ 2 + 1 n(n-1)(n-2)△ 3
2! 3!
+ 1 n(n-1)(n-2)(n-3)△ 4,
4!
这里△、△2、△3、△4 分别代表各级差分的第一个差分。朱世杰知道,公式的系数恰恰就是“古法七乘方图”(见后面第 133 页)从左边开始的斜线的数字的和,因此他把这一公式推广到一般情况是毫无问题的。注意到f(0)=0,就可以看出朱世杰的公式和我们一开头介绍的等间距内插法的一般公式基本上是一样的,比欧洲最早得到这个公式的格雷果里(公元 1670 年)早三百六十七年。
恩格斯在论述“科学的发生和发展一开始就是由生产决定的”①的时候,首先提到天文学的需要而展开的数学。从上所述可以看出,我国的内插法是从天文学的需要中发展起来的,是在修改历法中逐渐完善的,它的应用比欧洲早一千年。
垛积术——高阶等差级数问题
所谓垛积术,就是高阶等差级数求和问题。这个问题和内插法一样,在我国古代是自成系统的。
公元前一世纪《九章算术》“均输章”曾经提出等差积数的问题,公元五世纪《张丘建算经》给出等差级数求和的公式:
n r = 1 n(n + 1) 。
∑
1
高阶等差级数的研究开始于北宋沈括,元代朱世杰把它推到十分完备的境界。
沈括在《梦溪笔谈》卷十八“隙积术”中提到,上底宽是 a 个物体、长是 b 个物体、下底宽是 c 个物体、长是 d 个物体、高是 n 层的垛积(物体个数)s,比上底宽是 a、长是 b、下底宽是 c、长是 d,高是 n 的长方棱
台的体积多 n (c-a),即6
s = ab + (a + 1)(b + 1) + + cd
n n
= 6 〔(2b + d)a + (2d + b)c〕+ 6 (c-a) 。
沈括怎样得到这个公式,没有说明,大概是先用具体数字进行试验,然后
① 我国古代,开方术不仅指求解形如 xn=N 的二项方程的根,也指求解任意数字方程的正根,涵义比现代广泛得多。而“方程”却不是指一元方程,而是指现今的线性方程组,和现今方程的概念不同。
① “衺”,《永乐大典》作“衺”,据钱宝琮考证是“衺”之误,古代“衺”“斜”相通。
用归纳的方法得到的。
南宋理宗景定二年(公元 1261 年),杨辉在《详解九章算法》中继续对这个问题进行研究,他得到三个高阶等差级数公式:
s = 12 + 22 + 32 + + n 2 = n (n + 1)(n + 1 ),
(1)
3 2
s = a 2 + (a + 1)2 + (a + 2)2 + + d 2 = n (a 2 + d 2 + ad + d − a),(2)
3 2
s = 1 + 3 + 6 + 10 + + n(n + 1) = 1 n(n + 1)(n + 2)。
(3)
2 6
(1)式是四隅垛,(2)式是方垛,(3)式是三角垛。他把这三式分别和《九章算术》的方锥、方亭、鳖臑相比类,可能是仿照《九章算术》的棋验法推得的。
元成宗大德七年(公元 1303 年),朱世杰在《四元玉鉴》中,利用了当时丰富的数学知识,对这个问题作了系统而详细的研究,并得到普遍的解法。
n n
朱世杰研究了以等差级数∑ r的和、二阶等差级数∑ r 2的和分别是两
1 1
个新级数的一般项的两种情形。在第一种情形中,
n r(r + 1) = n(n + 1)(n + 2) ,
∑ 2! 3!
他连续以新级数的和作为一般项,就得到这一类高阶等差级数的一般公式:
n 1 r( r + 1)(r + 2) (r + p − 1) = 1 n(n + 1)(n + 2) (n + p)
∑ p!
(p + 1)!
(p = 1,2,3,
6)。 (1)
在第二种情形中,从沈括或杨辉的公式知道,
n
∑ r 2 =
1
1 n(n + 1)(2n + 1),
3!
朱世杰继续以新级数的和作为一般项,
n 1 r(r + 1)(2r + 1) = 2 n
1 r(r + 1) ·r + 1 n
1 r( r + 1),
∑ 3!
3 ∑ 2!
3 ∑ 2!
n 1
从而引出形如 r(r + 1)·r的高阶等差级数,他得到这类级数的一般形
∑ 2!
式的求和公式:
n
∑ r( r + 1)(r + 2) (r + p − 1) ·r
1 p!