数学 / 解三角形 · 六个元素里的三个 / 余弦定理与边角互化 待审核 2 / 4
勾股定理的推广

余弦定理与边角互化

勾股定理只对直角三角形成立。夹角一旦不是直角,a2a^2b2+c2b^2 + c^2 就不再相等,而差额是可以写出来的:它只依赖两条邻边与夹角。这条补上差额的等式就是余弦定理。

1 · 修正项的来历

把三角形摆进坐标系:AA 放在原点,BB 放在 (c, 0)(c,\ 0),则 CC 的坐标是 (bcosA, bsinA)(b\cos A,\ b\sin A)。边 aaBBCC 的距离,直接按两点距离公式展开:

a2=(cbcosA)2+(bsinA)2=b2cos2A+b2sin2A+c22bccosAa^2 = (c - b\cos A)^2 + (b\sin A)^2 = b^2\cos^2 A + b^2\sin^2 A + c^2 - 2bc\cos A

前两项由平方关系合成 b2b^2,得到:

定理 1.1(余弦定理) 在任意三角形中 a2=b2+c22bccosAa^2 = b^2 + c^2 - 2bc\cos A,另两式由字母轮换给出。

坐标推导顺带交出了几何读法。过 CCABAB 作垂线,垂足 HH 的横坐标恰是 bcosAb\cos A,这个量是 ACACABAB 上的投影长。AA 为钝角时 cosA\cos A 为负,投影随之为负,垂足落到 AA 的左侧、线段 ABAB 之外;代数式里那个负号在图上就是这件事。

图 1-1 · 三角形与 CCABAB 上的投影 AH=bcosAAH = b\cos A。可调两条邻边与夹角,读数并排给出 a2a^2b2+c2b^2 + c^2,观察垂足何时移出线段 ABAB

A=90°A = 90°cosA=0\cos A = 0,修正项整项消失,等式退回勾股定理。所以余弦定理与勾股定理是同一条等式的两个版本,后者只是 cosA=0\cos A = 0 的特例。

2 · 由三边反解出的角

定理 1.1 移项即得 cosA=b2+c2a22bc\cos A = \dfrac{b^2 + c^2 - a^2}{2bc}。这个方向比正弦定理干净:余弦在 (0°, 180°)(0°,\ 180°) 上单调递减,一个余弦值对应唯一一个内角,不存在 给值求角与凑角的拆法 里讨论的那种二解。已知三边求角一律走余弦定理,正是为了避开那次分类讨论。

警示 · 分子 b2+c2a2b^2 + c^2 - a^2 在三点接近共线时是两个相近数之差,商可以越出 [1, 1][-1,\ 1],而 Math.acos 对越界输入返回 NaN。这不是假想的边界:随机生成大批细长三角形、每个取三个角,越界的商占一到两成——具体比例随「抽样有多退化」而变(两次不同的抽样分别得到 13.5%13.5\%24.8%24.8\%),故它不是一个可复现的常数,能钉住的是具体那一组:三边取 34153.5586809330057.54601085464467134161.10469178765 时商为 1.0000000000003217,单测里以逐位相等断言这个值与随后的 NaNangleFromSides 因此先把商夹到 [1, 1][-1,\ 1] 再交给 Math.acos。夹一下不能把精度找回来,只能保证返回的是 00180180 而不是 NaN——真正的精度损失早在「顶点坐标换算成边长」那一步就发生了,三角形面积与形状判定 §3 有同一现象的量化。

角度本身也在流失精度。顶点取 (0, 0)(0,\ 0)(1, 0)(1,\ 0)(0.5, h)(0.5,\ h)CC 处的角接近 180°180°。把由坐标直接量出的夹角(走 arctan\arctan 与向量叉积)当参照,余弦定理反解出的角在 h=102h = 10^{-2} 时相对偏差 4.32e-15h=104h = 10^{-4}3.04e-13h=106h = 10^{-6}1.41e-11h=108h = 10^{-8}6.83e-10。高度每缩小两个数量级,相对偏差涨约五十倍,而绝对误差始终不超过 1.3×1071.3 \times 10^{-7} 度——只看绝对误差会以为一切正常。

3 · 两类已知条件

已知 步骤 要点
三边(SSS) 三次反解或两次反解加内角和 先算最大边的对角,它是唯一可能的钝角
两边及夹角(SAS) 一次正向算出第三边,再反解一个角 反解时优先算较小边的对角,避开钝角的符号判断

两条建议都为同一件事服务:把「可能是钝角」的那个角安排在能由符号自动定出的位置上,而不是靠事后检查。第三边算出后若改用正弦定理求余下的角,就又要面对 SSA 那种二解判别,得不偿失。

4 · 形状判定

三角形的钝直锐由最大角决定,而最大角必是最大边的对角。设三边排序后为 xyzx \le y \le z,只需看 x2+y2z2x^2 + y^2 - z^2 的符号:为正则是锐角三角形,为零是直角三角形,为负是钝角三角形。余下两角必为锐角,不必再验。

例 4.1 三边为 223344。最大边是 4422+3242=3<02^2 + 3^2 - 4^2 = -3 < 0,故为钝角三角形,钝角是 44 的对角,cos=3/12=0.25\cos = -3/12 = -0.25,约 104.48°104.48°。三边为 334455 时同一式子得 00,直角。三边为 445566 时得 5>05 > 0,锐角。

容差按边长平方的相对量取,而不是取一个绝对值:classify 里判零用的是 x2+y2z2εz2|x^2 + y^2 - z^2| \le \varepsilon z^2。边长量级从米换成毫米,同一个三角形的形状结论不该跟着变,而绝对容差做不到这一点。

5 · 参考文献

  1. Law of cosines. Wikipedia. 余弦定理的多种证明、历史与它对勾股定理的推广。https://en.wikipedia.org/wiki/Law_of_cosines
  2. Law of Cosines. Wolfram MathWorld. 等价形式与由它派生的半角公式。https://mathworld.wolfram.com/LawofCosines.html
  3. Jamshīd al-Kāshī. Wikipedia. 余弦定理在三角学史上的定型者之一。https://en.wikipedia.org/wiki/Jamsh%C4%ABd_al-K%C4%81sh%C4%AB
  4. Loss of significance. Wikipedia. 相近数相减导致有效位抵消的一般机制。https://en.wikipedia.org/wiki/Loss_of_significance
  5. Solution of triangles. Wikipedia. SSS 与 SAS 两类已知条件的标准解法。https://en.wikipedia.org/wiki/Solution_of_triangles