∫π每天一道数学题
← 返回数书九章
数书九章 · 第 30 讲 · 2026-11-15 · 约 13 分钟

重差术——刘徽测岛的两次观测

两表高三丈、前后相去千步,一次前退一百二十三步、一次后退一百二十七步——刘徽用两次观测、四个数字,算出岛高四里五十五步、距前表一百零二里一百五十步。这是中国古代测量学最漂亮的一击。

原典

今有望海岛,立两表,齐高三丈,前后相去千步,令后表与前表参相直。从前表却行一百二十三步,人目著地取望岛峰,与表末参合。从后表却行一百二十七步,人目著地取望岛峰,亦与表末参合。问岛高及去表各几何?

答曰:岛高四里五十五步,去表一百二里一百五十步。

术曰:以表高乘表间为实;相多为法,除之。所得加表高,即得岛高。求前表去岛远近者,以前表却行乘表间为实,相多为法,除之,得岛去表数。

这道题说的是什么

一座海岛,不知道它多高、离岸多远。古人的办法是在岸上竖两根一样高的表(标杆),前后相距一千步,让后表、前表、海岛三点在一条直线上。

然后人做两件事:

第一次:从前表向外(远离海岛的方向)退一百二十三步,伏在地上望岛峰,让眼睛、前表顶端、岛峰三点成一直线。

第二次:从后表向外退一百二十七步,同样伏地望岛峰,让眼睛、后表顶端、岛峰三点成一直线。

只凭这两条视线,就能同时求出岛高和它的水平距离。

这道题是中国古代数学最有名的一道。 唐朝人把刘徽《九章算术注》的第十卷单独抽出来成书,就用第一题的「今有望海岛」命名,叫作《海岛算经》。全书九题,全是重差术。

示意图

重差术:两表两次观测求岛高与岛距

两表齐高三丈、前后相去千步;前表却行 123 步与后表却行 127 步分别构成两对相似三角形,「相多」4 步是整个算法的枢纽。

古人的算法

先把四个数字摆清楚

量数值说明
表高三丈 = 5 步「齐高」,两表一样高
表间1000 步后表在前表外侧(远离海岛一侧)一千步
前表却行123 步第一次观测,人到前表的水平距离
后表却行127 步第二次观测,人到后表的水平距离

注意「三丈 = 5 步」。 古代度量衡里 6 尺为 1 步,1 丈 = 10 尺,所以 1 丈 = 10/6 步,三丈正好是 5 步。题目选三丈而不是五尺,就是为了让表高恰好是整数步——这不是巧合,是出题人在迁就算筹。

为什么是「相多」四步

术文里最要紧的两个字是相多,意思是「相减所得的差」。减谁?减两次的后退距离:

127−123=4127 - 123 = 4

整个算法都由这 4 步驱动。 表间有 1000 步,后退只差 4 步,所以两条视线相差极微,而测量的恰恰是这个极微的差——差得越小,放大的倍数越高。

这正是「重差」二字的含义:重(两次)之差。

岛去前表的距离

术文说:「以求前表去岛远近者,以前表却行乘表间为实,相多为法,除之,得岛去表数。」

写成现代式子:

x=123×1000127−123=1230004=30750 步x = \frac{123 \times 1000}{127 - 123} = \frac{123000}{4} = 30750 \text{ 步}

折成里(1 里 = 300 步):

30750=102×300+15030750 = 102 \times 300 + 150

得 102 里 150 步,与答曰合。

岛高

术文说:「以表高乘表间为实,相多为法,除之,所得加表高,即得岛高。」

注意这里用的是前一条术文里的商——也就是已经求出的岛去前表的距离 30750 步,而不仅仅是表高乘表间。完整地写:

5×10004=1250 步\frac{5 \times 1000}{4} = 1250 \text{ 步}

再加表高 5 步:

H=1250+5=1255 步H = 1250 + 5 = 1255 \text{ 步}

折里:

1255=4×300+551255 = 4 \times 300 + 55

得 4 里 55 步,与答曰合。

四个数字怎么对上的

所求算式结果答曰
岛去前表123×1000÷4123 \times 1000 \div 430750 步 = 102 里 150 步✅
岛高5×1000÷4+55 \times 1000 \div 4 + 51255 步 = 4 里 55 步✅

这里有个容易被忽略的细节:求岛高时为什么要加表高?因为第一次观测时人伏在地上、眼高为 0,视线从地面出发经过前表顶端。岛高是从海面算起的,而公式算出的 1250 步是「岛峰高出前表顶端的那部分」,所以要把表高补回去。

为什么公式是对的

用相似三角形说清楚。设岛峰距前表水平距离为 xx,岛高为 HH,表高 h=5h = 5。

第一次观测,人距前表 a1=123a_1 = 123 步,眼高 0,视线过人眼、前表顶、岛峰:

Hx+a1=ha1\frac{H}{x + a_1} = \frac{h}{a_1}

第二次观测,人距后表 a2=127a_2 = 127 步,而後表在前表外侧 d=1000d = 1000 步处,所以人眼到岛峰的水平距离是 x+d+a2x + d + a_2:

Hx+d+a2=ha2\frac{H}{x + d + a_2} = \frac{h}{a_2}

两式相除消去 HH:

x+a1a1=x+d+a2a2\frac{x + a_1}{a_1} = \frac{x + d + a_2}{a_2}

交叉相乘:

a2x+a2a1=a1x+a1d+a1a2a_2 x + a_2 a_1 = a_1 x + a_1 d + a_1 a_2

两边消去 a1a2a_1 a_2,得:

x(a2−a1)=a1dx(a_2 - a_1) = a_1 d

于是:

x=a1da2−a1=123×10004=30750x = \frac{a_1 d}{a_2 - a_1} = \frac{123 \times 1000}{4} = 30750

正是术文的公式。 代回第一式求 HH:

H=h(x+a1)a1=5×(30750+123)123=5×30873123=1255H = \frac{h(x + a_1)}{a_1} = \frac{5 \times (30750 + 123)}{123} = \frac{5 \times 30873}{123} = 1255

也合。

现代数学视角

这就是「两次交会」

现代测量学要测一个不可直达点的三维位置,靠的是交会——从两个已知点各测一个角度或距离,两条直线/双曲线的交点就是目标。

重差术做的正是这件事,只不过它测的不是角度,而是距离:

  • 已知点:两根表的位置和高度
  • 观测量:人伏地处到表的水平距离
  • 约束:视线三点共线(等价于测了一个角度,但古人用相似三角形把这个角度条件转成了距离关系)

所以刘徽不需要任何角度概念,只用相似三角形就完成了三角测量的全部工作。

表高和表间为什么这么选

表高三丈 = 5 步、表间 1000 步、后退差只有 4 步。这组数字的放大倍数是:

da2−a1=10004=250\frac{d}{a_2 - a_1} = \frac{1000}{4} = 250

也就是说,测量 123 步和 127 步这种几十上百步量级的距离,误差哪怕有半步,算出的岛距就会偏 0.5×250=1250.5 \times 250 = 125 步。古人选 4 步而不是 40 步,是把灵敏度拉满了。

代价是脆。后来李淳风注《海岛算经》时就讨论过这类问题的精度取舍,这正是实验设计的思想。

GPS 的祖先

GPS 定位靠四颗卫星,每颗给出一个距离(通过时间差换算),四个球面的交点就是接收机位置。

重差术是两次观测、两个约束,解两个未知量(岛高和岛距)——数学结构和 GPS 同源,只是古人手里只有算筹和相似三角形。

和秦九韶的关系

刘徽《海岛算经》成书于魏景元四年(263 年)。秦九韶《数书九章》成书于淳祐七年(1247 年),比它晚了近一千年。秦九韶在《数书九章》卷四设「测望类」,取九题,用的全是重差术,并在刘徽基础上推广到更复杂的场景。

四库馆臣为《数书九章》所作的提要里说得很清楚:

按测望之法见于晋刘徽海岛算经,原名重差,其书一卷九题,法简数密。此卷本其法而扩充之。

所以这一讲是《数书九章》测望类的源头。 刘徽先立起两根表,一千年后秦九韶接着往下走。

高中课本关联

知识点定位:

  • 相似三角形:本题的全部代数都建立在相似三角形对应边成比例上
  • 解三角形:若改用角度描述,就是正弦定理/正切的应用
  • 方程思想:两个观测给出两个方程,消元解出两个未知量

高考考法:

「测量不可达目标」是高考应用题的经典母题。现代版本通常给仰角:

在山脚 AA 处测得山顶仰角为 α\alpha,前进 dd 米到 BB 处再测得仰角为 β\beta,求山高。

设山高 hh、山脚到 BB 的距离 xx:

hx+d=tan⁡α,hx=tan⁡β\frac{h}{x + d} = \tan\alpha, \qquad \frac{h}{x} = \tan\beta

消去 xx 得 h=dtan⁡αtan⁡βtan⁡α−tan⁡βh = \dfrac{d \tan\alpha \tan\beta}{\tan\alpha - \tan\beta}。

把 tan⁡θ\tan\theta 换成相似三角形的比例,就是重差术。 古人的高明在于不需要「角」这个概念,只用表高和距离就完成了等价计算。

一个可以直接告诉学生的事实:用相似三角形求高度,不必量任何角度,误差只来自距离测量。这比用量角器的方案可靠得多。

思考与拓展

基础题:

两表高 6 米,表间 30 米。从前表退 10 米望目标与表顶齐,从后表退 12 米望目标与表顶齐。求目标高度和它到前表的距离。

提示:后退差 2 米。目标距前表 =10×30÷2=150= 10 \times 30 \div 2 = 150 米;目标高 =6×30÷2+6=96= 6 \times 30 \div 2 + 6 = 96 米。

进阶题:

如果两次观测的后退距离完全相同(a1=a2a_1 = a_2),会发生什么?这说明重差术对数据有什么要求?

提示:分母为 0,公式失效。因为两条视线重合,无法区分远近。重差术的前提是两次观测必须不同。

挑战题:

只立一根表、观测一次,能否求出目标的高度和距离?为什么?

提示:一个方程、两个未知量,无法唯一确定。最少需要两根表、两次观测——这正是「重差」之「重」的含义。

开放题:

古人用「相多 4 步」换取 250 倍灵敏度。如果让你重做这道题,你会怎么设计表高、表间和后退距离,让结果又准又不那么脆弱?

提示:考虑误差传播。后退差越小灵敏度越高,但对测量误差越敏感。最优设计要在灵敏度和稳健性之间折中——这是现代实验设计的核心问题。

一句话总结

两根表、四次距离、一个四步之差——刘徽用相似三角形把「测不到的高」换算成一串乘除,这是中国古代数学对世界测量学最硬的一份贡献。

— Y. · 2026-11-15
重差术——刘徽测岛的两次观测 · 数书九章第30讲