重差术——刘徽测岛的两次观测
两表高三丈、前后相去千步,一次前退一百二十三步、一次后退一百二十七步——刘徽用两次观测、四个数字,算出岛高四里五十五步、距前表一百零二里一百五十步。这是中国古代测量学最漂亮的一击。
原典
今有望海岛,立两表,齐高三丈,前后相去千步,令后表与前表参相直。从前表却行一百二十三步,人目著地取望岛峰,与表末参合。从后表却行一百二十七步,人目著地取望岛峰,亦与表末参合。问岛高及去表各几何?
答曰:岛高四里五十五步,去表一百二里一百五十步。
术曰:以表高乘表间为实;相多为法,除之。所得加表高,即得岛高。求前表去岛远近者,以前表却行乘表间为实,相多为法,除之,得岛去表数。
这道题说的是什么
一座海岛,不知道它多高、离岸多远。古人的办法是在岸上竖两根一样高的表(标杆),前后相距一千步,让后表、前表、海岛三点在一条直线上。
然后人做两件事:
第一次:从前表向外(远离海岛的方向)退一百二十三步,伏在地上望岛峰,让眼睛、前表顶端、岛峰三点成一直线。
第二次:从后表向外退一百二十七步,同样伏地望岛峰,让眼睛、后表顶端、岛峰三点成一直线。
只凭这两条视线,就能同时求出岛高和它的水平距离。
这道题是中国古代数学最有名的一道。 唐朝人把刘徽《九章算术注》的第十卷单独抽出来成书,就用第一题的「今有望海岛」命名,叫作《海岛算经》。全书九题,全是重差术。
示意图
两表齐高三丈、前后相去千步;前表却行 123 步与后表却行 127 步分别构成两对相似三角形,「相多」4 步是整个算法的枢纽。
古人的算法
先把四个数字摆清楚
| 量 | 数值 | 说明 |
|---|---|---|
| 表高 | 三丈 = 5 步 | 「齐高」,两表一样高 |
| 表间 | 1000 步 | 后表在前表外侧(远离海岛一侧)一千步 |
| 前表却行 | 123 步 | 第一次观测,人到前表的水平距离 |
| 后表却行 | 127 步 | 第二次观测,人到后表的水平距离 |
注意「三丈 = 5 步」。 古代度量衡里 6 尺为 1 步,1 丈 = 10 尺,所以 1 丈 = 10/6 步,三丈正好是 5 步。题目选三丈而不是五尺,就是为了让表高恰好是整数步——这不是巧合,是出题人在迁就算筹。
为什么是「相多」四步
术文里最要紧的两个字是相多,意思是「相减所得的差」。减谁?减两次的后退距离:
整个算法都由这 4 步驱动。 表间有 1000 步,后退只差 4 步,所以两条视线相差极微,而测量的恰恰是这个极微的差——差得越小,放大的倍数越高。
这正是「重差」二字的含义:重(两次)之差。
岛去前表的距离
术文说:「以求前表去岛远近者,以前表却行乘表间为实,相多为法,除之,得岛去表数。」
写成现代式子:
折成里(1 里 = 300 步):
得 102 里 150 步,与答曰合。
岛高
术文说:「以表高乘表间为实,相多为法,除之,所得加表高,即得岛高。」
注意这里用的是前一条术文里的商——也就是已经求出的岛去前表的距离 30750 步,而不仅仅是表高乘表间。完整地写:
再加表高 5 步:
折里:
得 4 里 55 步,与答曰合。
四个数字怎么对上的
| 所求 | 算式 | 结果 | 答曰 |
|---|---|---|---|
| 岛去前表 | 30750 步 = 102 里 150 步 | ✅ | |
| 岛高 | 1255 步 = 4 里 55 步 | ✅ |
这里有个容易被忽略的细节:求岛高时为什么要加表高?因为第一次观测时人伏在地上、眼高为 0,视线从地面出发经过前表顶端。岛高是从海面算起的,而公式算出的 1250 步是「岛峰高出前表顶端的那部分」,所以要把表高补回去。
为什么公式是对的
用相似三角形说清楚。设岛峰距前表水平距离为 ,岛高为 ,表高 。
第一次观测,人距前表 步,眼高 0,视线过人眼、前表顶、岛峰:
第二次观测,人距后表 步,而後表在前表外侧 步处,所以人眼到岛峰的水平距离是 :
两式相除消去 :
交叉相乘:
两边消去 ,得:
于是:
正是术文的公式。 代回第一式求 :
也合。
现代数学视角
这就是「两次交会」
现代测量学要测一个不可直达点的三维位置,靠的是交会——从两个已知点各测一个角度或距离,两条直线/双曲线的交点就是目标。
重差术做的正是这件事,只不过它测的不是角度,而是距离:
- 已知点:两根表的位置和高度
- 观测量:人伏地处到表的水平距离
- 约束:视线三点共线(等价于测了一个角度,但古人用相似三角形把这个角度条件转成了距离关系)
所以刘徽不需要任何角度概念,只用相似三角形就完成了三角测量的全部工作。
表高和表间为什么这么选
表高三丈 = 5 步、表间 1000 步、后退差只有 4 步。这组数字的放大倍数是:
也就是说,测量 123 步和 127 步这种几十上百步量级的距离,误差哪怕有半步,算出的岛距就会偏 步。古人选 4 步而不是 40 步,是把灵敏度拉满了。
代价是脆。后来李淳风注《海岛算经》时就讨论过这类问题的精度取舍,这正是实验设计的思想。
GPS 的祖先
GPS 定位靠四颗卫星,每颗给出一个距离(通过时间差换算),四个球面的交点就是接收机位置。
重差术是两次观测、两个约束,解两个未知量(岛高和岛距)——数学结构和 GPS 同源,只是古人手里只有算筹和相似三角形。
和秦九韶的关系
刘徽《海岛算经》成书于魏景元四年(263 年)。秦九韶《数书九章》成书于淳祐七年(1247 年),比它晚了近一千年。秦九韶在《数书九章》卷四设「测望类」,取九题,用的全是重差术,并在刘徽基础上推广到更复杂的场景。
四库馆臣为《数书九章》所作的提要里说得很清楚:
按测望之法见于晋刘徽海岛算经,原名重差,其书一卷九题,法简数密。此卷本其法而扩充之。
所以这一讲是《数书九章》测望类的源头。 刘徽先立起两根表,一千年后秦九韶接着往下走。
高中课本关联
知识点定位:
- 相似三角形:本题的全部代数都建立在相似三角形对应边成比例上
- 解三角形:若改用角度描述,就是正弦定理/正切的应用
- 方程思想:两个观测给出两个方程,消元解出两个未知量
高考考法:
「测量不可达目标」是高考应用题的经典母题。现代版本通常给仰角:
在山脚 处测得山顶仰角为 ,前进 米到 处再测得仰角为 ,求山高。
设山高 、山脚到 的距离 :
消去 得 。
把 换成相似三角形的比例,就是重差术。 古人的高明在于不需要「角」这个概念,只用表高和距离就完成了等价计算。
一个可以直接告诉学生的事实:用相似三角形求高度,不必量任何角度,误差只来自距离测量。这比用量角器的方案可靠得多。
思考与拓展
基础题:
两表高 6 米,表间 30 米。从前表退 10 米望目标与表顶齐,从后表退 12 米望目标与表顶齐。求目标高度和它到前表的距离。
提示:后退差 2 米。目标距前表 米;目标高 米。
进阶题:
如果两次观测的后退距离完全相同(),会发生什么?这说明重差术对数据有什么要求?
提示:分母为 0,公式失效。因为两条视线重合,无法区分远近。重差术的前提是两次观测必须不同。
挑战题:
只立一根表、观测一次,能否求出目标的高度和距离?为什么?
提示:一个方程、两个未知量,无法唯一确定。最少需要两根表、两次观测——这正是「重差」之「重」的含义。
开放题:
古人用「相多 4 步」换取 250 倍灵敏度。如果让你重做这道题,你会怎么设计表高、表间和后退距离,让结果又准又不那么脆弱?
提示:考虑误差传播。后退差越小灵敏度越高,但对测量误差越敏感。最优设计要在灵敏度和稳健性之间折中——这是现代实验设计的核心问题。
一句话总结
两根表、四次距离、一个四步之差——刘徽用相似三角形把「测不到的高」换算成一串乘除,这是中国古代数学对世界测量学最硬的一份贡献。