∫π每天一道数学题
← 返回海岛算经专题
海岛算经 · 第 2 讲 · 2026-08-24 · 约 11 分钟

第二讲 望松 —— 怎么知道山有多高、树有多大?

山上长了一棵松树,你只在山脚下,怎么同时算出山高和松高?刘徽用"入表"的巧妙设计,三次观测就搞定。三望法的经典应用。

原典

今有望松生山上,不知高下。立两表齐,高二丈,前后相去五十步,令后表与前表参相直。从前表却行七步四尺,薄地遥望松末,与表端参合。又望松本,入表二尺八寸。复从后表却行八步五尺,薄地遥望松末,亦与表端参合。问松高及山去表各几何?

答曰:松高一十二丈二尺八寸;山去表一里二十八步、七分步之四。

术曰:以入表乘表间为实。相多为法,除之。加入表,即得松高。求表去山远近者:置表间,以前表却行乘之为实。相多为法,除之,得山去表。


这道题说的是什么

上一道题我们测的是海岛——一个大目标,整个岛峰是一个点。

这道题升级了:山上长了一棵松树,你不仅要测出山有多高,还要测出这棵松树本身有多高。

你可能会说:这有什么难的?先测山顶高度,再测树底高度,一减不就是树高嘛。

哎,问题就在这——你在山脚下的平地上,你只能看到树顶和树底,但你不知道"树底"对应的地面位置在哪。因为山是斜的,你看不见"树底下的地面"在哪里。

所以刘徽的方法是:只测树顶,通过"入表"的巧妙设计,把树高也算出来。

什么叫"入表"?就是你从前面的杆子看松树底部的时候,视线不经过杆顶了,而是从杆子上某一个高度穿过去。这个高度,就叫"入表"——进入杆子多少的意思。

太聪明了。就多了这么一个小小的观测,就能多算出一个未知数。


示意图

望松三望法示意图

三次观测:前表望松末、前表望松本(入表)、后表望松末。

把题拆解一下

我们先理一理,这道题里你能观测到几个数据:

  1. 两根杆子,都是 2 丈高(20 尺)
  2. 两杆相距 50 步
  3. 从前杆后退 7 步 4 尺,看松顶,视线擦过杆顶
  4. 还是在同一个位置,看松树的底部,视线从杆顶往下 2 尺 8 寸的位置穿过去(这就是"入表二尺八寸")
  5. 从后杆后退 8 步 5 尺,看松顶,视线也擦过杆顶

注意:松底的观测只在前面那个点做了一次,后面那个点没做。为什么?因为不需要。有松顶的两次观测 + 松底的一次观测,就够了。


古人的算法

刘徽给的公式:

松高=入表×da2a1+入表\text{松高} = \dfrac{\text{入表} \times d}{a_2 - a_1} + \text{入表} 山去表=a1×da2a1\text{山去表} = \dfrac{a_1 \times d}{a_2 - a_1}

其中 dd = 表间,a1a_1 = 前表却行,a2a_2 = 后表却行。

是不是跟上一题的岛高公式结构很像?就是把"表高"换成了"入表"。

我们来算一下(统一用尺做单位方便计算):

  • 表高 =2= 2=20= 20
  • 表间 d=50d = 50=300= 300 尺(1 步 =6= 6 尺)
  • 前表却行 a1=7a_1 = 7 步 4 尺 =46= 46
  • 后表却行 a2=8a_2 = 8 步 5 尺 =53= 53
  • 相多 a2a1=5346=7a_2 - a_1 = 53 - 46 = 7
  • 入表 =2= 2 尺 8 寸 =2.8= 2.8

松高

松高=2.8×3007+2.8=8407+2.8=120+2.8=122.8 尺\text{松高} = \frac{2.8 \times 300}{7} + 2.8 = \frac{840}{7} + 2.8 = 120 + 2.8 = 122.8 \text{ 尺} =12 丈 2 尺 8 寸= 12 \text{ 丈 } 2 \text{ 尺 } 8 \text{ 寸}

跟刘徽的答案完全一样!

山去表

D=46×3007=138007=197137 尺D = \frac{46 \times 300}{7} = \frac{13800}{7} = 1971\frac{3}{7} \text{ 尺} =32847 步=1 里 2847 步= 328\frac{4}{7} \text{ 步} = 1 \text{ 里 } 28\frac{4}{7} \text{ 步}

完美对上。


现代数学视角:为什么"入表"这么神奇?

为什么测一次"入表"就能算出树高?我们用相似三角形来看一看。

这道题里其实有三组相似关系:

  1. 从前面看松顶 → 松高 + 山高 相关
  2. 从后面看松顶 → 松高 + 山高 相关
  3. 从前面看松底 → 只有山高 相关

前两组跟上一题的岛高公式是一样的,能算出"松顶的总高度"(山高 + 松高)。

第三组只有一组观测,不够算山高——但是注意,我们不需要算山高的具体值。我们用"松顶总高"和"松底高度"两个式子相减,山高就消掉了,剩下的就是松高。

这就是"入表"的巧妙之处:它不是为了算山高,而是为了跟松顶的观测做差,把山高这个未知数消掉,直接得到松高。

具体来说,设山高为 HH,松高为 hh,山到前表距离为 DD,表高为 h0h_0,入表为 Δh\Delta h

看松顶(前表):

H+hD+a1=h0a1(1)\frac{H+h}{D + a_1} = \frac{h_0}{a_1} \qquad (1)

看松顶(后表):

H+hD+d+a2=h0a2(2)\frac{H+h}{D + d + a_2} = \frac{h_0}{a_2} \qquad (2)

看松底(前表):

HD+a1=h0Δha1(3)\frac{H}{D + a_1} = \frac{h_0 - \Delta h}{a_1} \qquad (3)

用 (1) 减 (3):

hD+a1=Δha1\frac{h}{D + a_1} = \frac{\Delta h}{a_1}

哎,有意思——松高 hh 和"入表"Δh\Delta h 成正比,比例系数是 D+a1a1\dfrac{D+a_1}{a_1}

然后再结合 (1)(2) 两式算出 D+a1D+a_1,代入进去,hh 就出来了。

你看,其实就是多了一次观测、多了一个比例关系,问题就解决了。刘徽的厉害之处在于:他不用列方程、不用解方程组,直接给你一个简洁的公式,照着算就行。


跟高中数学的关系

这道题对应的高中知识点是:

相似三角形的进阶应用 + 方程思想

这道题里有三个未知数(山高、松高、距离),但我们有三个条件,所以能解。这就是方程思想——有几个未知数,就需要几个独立的方程。

高中数学里的"测量问题"经常会遇到这种"不可到达的两个点之间的距离""底部不可见的高度"之类的问题,思路跟《海岛算经》是一模一样的:

  • 不能直接测?那就多测几次
  • 每多测一次,就多一个方程
  • 方程够了,就能把未知数都解出来

这就是数学的力量——你不需要到现场,只需要在远处测几次,通过计算,就能得到你想要的答案。


三望是什么意思?

上一道题叫"二望"——观测两次。 这一道题叫"三望"——观测三次。

哪三次?

  1. 前表看松顶
  2. 后表看松顶
  3. 前表看松底

每多一次"望",就能多求一个未知数。《海岛算经》的 9 道题,从二望、三望到四望,难度层层递进。

到第九题"登山临邑",是四望——要测一座城的南北长和东西宽,得观测四次才行。

刘徽自己在序言里说:"度高者重表,测深者累矩,孤离者三望,离而又旁求者四望。"

意思就是:测高度用两根表,测深度用两个矩,情况复杂的要测三次,更复杂的(既要测远又要测宽)要测四次。

这个"望"的次数,本质上就是方程的个数。几百年前的古人,虽然没有"方程"这个词,但已经在熟练运用方程的思想了。


思考与拓展

  1. 这道题里,为什么看松底只需要在前表观测一次,后表不需要? (提示:我们的目标是求松高,不是求山高。松高跟山高是什么关系?)

  2. 如果要测一棵完整的树(你能看到树顶和树底,而且树长在平地上),你需要测几次?怎么测?

  3. 想象一下:如果山上不是一棵树,而是一座塔,塔分三层,你能不能想办法分别测出每一层的高度?需要观测几次?

  4. 生活中还有什么地方能用类似的方法?比如:

    • 操场上的旗杆高度(你可以走近)
    • 河对岸的树高(你过不去)
    • 窗户里的画有多大(你进不去那个房间)

一句话总结

多加一次观测,就能多求一个未知数。古人的"三望""四望",本质上就是方程思想——用多个方程解多个未知数。

— Y. · 2026-08-24