数学 / 三角函数 · 从角到波 / 和差角公式与二倍角公式 待审核 10 / 13
cos(α ± β) · 2α

和差角公式与二倍角公式

前两页的恒等式都在同一个角内部(见 同角三角函数的基本关系)或同一个角的对称像之间打转(见 诱导公式与终边的对称)。要把两个互不相关的角联系起来,需要一件新的几何事实:单位圆上两点之间的距离,只由它们的角度之差决定。

1 · 两条等长的弦

设 α\alpha、β\beta 的终边与单位圆分别交于 Pα(cos⁡α, sin⁡α)P_\alpha(\cos\alpha,\ \sin\alpha) 与 Pβ(cos⁡β, sin⁡β)P_\beta(\cos\beta,\ \sin\beta)。把整个图形绕原点旋转 −β-\beta 度:PαP_\alpha 落到 Pα−βP_{\alpha-\beta} 处,PβP_\beta 落到 P0(1, 0)P_0(1,\ 0) 处。旋转是刚体运动,弦长不变,于是同一段长度有两种算法:

∣PαPβ∣2=(cos⁡α−cos⁡β)2+(sin⁡α−sin⁡β)2=2−2(cos⁡αcos⁡β+sin⁡αsin⁡β)|P_\alpha P_\beta|^2 = (\cos\alpha - \cos\beta)^2 + (\sin\alpha - \sin\beta)^2 = 2 - 2(\cos\alpha\cos\beta + \sin\alpha\sin\beta)
∣Pα−βP0∣2=(cos⁡(α−β)−1)2+sin⁡2(α−β)=2−2cos⁡(α−β)|P_{\alpha-\beta} P_0|^2 = (\cos(\alpha-\beta) - 1)^2 + \sin^2(\alpha-\beta) = 2 - 2\cos(\alpha-\beta)

两处展开都用到了平方关系。令两式相等,约掉常数与系数即得:

定理 1.1(差角余弦) 对任意角 α\alpha 与 β\beta,cos⁡(α−β)=cos⁡αcos⁡β+sin⁡αsin⁡β\cos(\alpha - \beta) = \cos\alpha\cos\beta + \sin\alpha\sin\beta。

推导只依赖两件事:交点落在单位圆上,以及旋转保持距离。两者对任意角都成立,所以这条等式不需要分象限讨论,也不要求 α\alpha、β\beta 是锐角。

图 1-1 · 单位圆上 α\alpha、β\beta 与 α±β\alpha \pm \beta 的三条终边,以及选余弦时出现的两条等长弦。可调两个角与和差开关,读数并排给出直接求值、公式合成与「把函数当加性的」错答。

2 · 由差角余弦派生的一族

其余公式都是定理 1.1 的推论,工具只有诱导公式与商数关系。把 β\beta 换成 −β-\beta,右端的 sin⁡β\sin\beta 变号,得到和角余弦;把余弦的角写成 π/2\pi/2 减一个角再换族,得到正弦的两条;正切的两条则由商数关系通分,分子分母同除 cos⁡αcos⁡β\cos\alpha\cos\beta 而来。六个等式合称和差角公式。

公式 右端 来历
cos⁡(α−β)\cos(\alpha - \beta) cos⁡αcos⁡β+sin⁡αsin⁡β\cos\alpha\cos\beta + \sin\alpha\sin\beta 定理 1.1
cos⁡(α+β)\cos(\alpha + \beta) cos⁡αcos⁡β−sin⁡αsin⁡β\cos\alpha\cos\beta - \sin\alpha\sin\beta 上式中 β→−β\beta \to -\beta
sin⁡(α+β)\sin(\alpha + \beta) sin⁡αcos⁡β+cos⁡αsin⁡β\sin\alpha\cos\beta + \cos\alpha\sin\beta cos⁡(π/2−α−β)\cos(\pi/2 - \alpha - \beta) 换族
sin⁡(α−β)\sin(\alpha - \beta) sin⁡αcos⁡β−cos⁡αsin⁡β\sin\alpha\cos\beta - \cos\alpha\sin\beta 上式中 β→−β\beta \to -\beta
tan⁡(α+β)\tan(\alpha + \beta) tan⁡α+tan⁡β1−tan⁡αtan⁡β\dfrac{\tan\alpha + \tan\beta}{1 - \tan\alpha\tan\beta} 正弦除以余弦后约分
tan⁡(α−β)\tan(\alpha - \beta) tan⁡α−tan⁡β1+tan⁡αtan⁡β\dfrac{\tan\alpha - \tan\beta}{1 + \tan\alpha\tan\beta} 上式中 β→−β\beta \to -\beta

正切那两条比前四条脆:右端要求 tan⁡α\tan\alpha、tan⁡β\tan\beta 与 tan⁡(α±β)\tan(\alpha \pm \beta) 三者都有意义,任一个角落在 π/2+kπ\pi/2 + k\pi 上就用不了。前四条没有这类限制。

警示 · 三角函数不是加性映射,sin⁡(α+β)\sin(\alpha + \beta) 与 sin⁡α+sin⁡β\sin\alpha + \sin\beta 之间没有等号。这个错答能偏多远是量出来的:在 α, β∈[0°, 180°]\alpha,\ \beta \in [0°,\ 180°] 的 181×181181 \times 181 个整数格点上,∣sin⁡α+sin⁡β−sin⁡(α+β)∣|\sin\alpha + \sin\beta - \sin(\alpha+\beta)| 的最大值是 2.598076211353316,即 33/23\sqrt{3}/2,取在 α=β=120°\alpha = \beta = 120° 处。正弦的值域宽度只有 22,错答的偏差却超过 2.592.59。

3 · 正切公式在直角处的假结果

α+β=π/2\alpha + \beta = \pi/2 时 tan⁡(α+β)\tan(\alpha + \beta) 无意义,代数上的表现是分母 1−tan⁡αtan⁡β1 - \tan\alpha\tan\beta 为零。看上去可以拿「分母为零」当判据,实测不行。

警示 · 双精度下这个分母不为零。Math.tan(Math.PI / 4) 算出的是 0.9999999999999999 而非 11,于是 1−tan⁡45°tan⁡45°1 - \tan 45° \tan 45° 等于 2.220446049250313e-16,恰好是 Number.EPSILON;照公式算出的 tan⁡90°\tan 90° 是 9007199254740991,也就是 253−12^{53} - 1,一个看着完全正常的整数。换 30°+60°30° + 60° 那一组,分母是 3.3306690738754696e-16,结果 6933745219159076。所以判定极点必须按角来判(isTanPole 检查角是否落在 90°+k⋅180°90° + k \cdot 180° 上),等分母报零是等不到的。

这件事把「公式的适用条件」与「实现的失效方式」分了开:适用条件由数学给出,而实现给出的不是报错,是一个量级正常、符号也正常的假结果。图 1-1 在选正切且两角之和为直角时会把左右两端的这种分歧显示出来。

4 · 二倍角与降幂

在和角公式里令 β=α\beta = \alpha,右端的两项合并,得到二倍角公式:sin⁡2α=2sin⁡αcos⁡α\sin 2\alpha = 2\sin\alpha\cos\alpha,cos⁡2α=cos⁡2α−sin⁡2α\cos 2\alpha = \cos^2\alpha - \sin^2\alpha,tan⁡2α=2tan⁡α/(1−tan⁡2α)\tan 2\alpha = 2\tan\alpha / (1 - \tan^2\alpha)。

余弦那条有三种等价写法。用平方关系把 sin⁡2α\sin^2\alpha 或 cos⁡2α\cos^2\alpha 换掉,得 cos⁡2α=2cos⁡2α−1=1−2sin⁡2α\cos 2\alpha = 2\cos^2\alpha - 1 = 1 - 2\sin^2\alpha。三式数值相同,用处不同:算出的量是 cos⁡α\cos\alpha 就取第二式,是 sin⁡α\sin\alpha 就取第三式,都能少开一次平方。

把后两式反解出平方项,得到降幂公式 sin⁡2α=(1−cos⁡2α)/2\sin^2\alpha = (1 - \cos 2\alpha)/2 与 cos⁡2α=(1+cos⁡2α)/2\cos^2\alpha = (1 + \cos 2\alpha)/2。它把二次式换成一次式,代价是角翻倍。半角公式是同一件事换个写法,把 α\alpha 换成 α/2\alpha/2 即得,符号由 α/2\alpha/2 所在象限裁决。

公式两端在浮点下并不逐位相等。左端只调一次 Math.sin,右端要做四次乘法与一次加减。以 1°1° 为步长扫遍 α, β∈[−360°, 360°]\alpha,\ \beta \in [-360°,\ 360°] 的 721×721721 \times 721 个格点,正弦与余弦四条和差角公式两端的最大偏差是 2.6645352591003757e-15,合 1212 个 Number.EPSILON,取在 α=−359°\alpha = -359°、β=−353°\beta = -353° 处。这个界是量出来的,换一个 Math.sin 实现就可能变,trig.test.ts 里那条断言写的是「不超过 1212 ulp」。

5 · 参考文献

  1. List of trigonometric identities. Wikipedia. 和差角、二倍角与降幂公式的完整清单。https://en.wikipedia.org/wiki/List_of_trigonometric_identities
  2. Proofs of trigonometric identities. Wikipedia. 差角余弦的距离法证明与其他几种证法。https://en.wikipedia.org/wiki/Proofs_of_trigonometric_identities
  3. Trigonometric Addition Formulas. Wolfram MathWorld. 六条和差角公式与它们的复数形式来源。https://mathworld.wolfram.com/TrigonometricAdditionFormulas.html
  4. Rotation matrix. Wikipedia. 平面旋转矩阵的两行恰是和角公式的两个分量。https://en.wikipedia.org/wiki/Rotation_matrix
  5. Ptolemy's theorem. Wikipedia. 托勒密定理,和角公式在历史上的另一条来路。https://en.wikipedia.org/wiki/Ptolemy%27s_theorem
  6. Machine epsilon. Wikipedia. Number.EPSILON 的含义与 ulp 的口径。https://en.wikipedia.org/wiki/Machine_epsilon