cos(α ± β) · 2α
和差角公式与二倍角公式
前两页的恒等式都在同一个角内部(见 同角三角函数的基本关系)或同一个角的对称像之间打转(见 诱导公式与终边的对称)。要把两个互不相关的角联系起来,需要一件新的几何事实:单位圆上两点之间的距离,只由它们的角度之差决定。
1 · 两条等长的弦
设
α、β
的终边与单位圆分别交于
Pα(cosα, sinα)
与
Pβ(cosβ, sinβ)。把整个图形绕原点旋转
−β
度:Pα
落到
Pα−β
处,Pβ
落到
P0(1, 0)
处。旋转是刚体运动,弦长不变,于是同一段长度有两种算法:
∣PαPβ∣2=(cosα−cosβ)2+(sinα−sinβ)2=2−2(cosαcosβ+sinαsinβ)
∣Pα−βP0∣2=(cos(α−β)−1)2+sin2(α−β)=2−2cos(α−β)
两处展开都用到了平方关系。令两式相等,约掉常数与系数即得:
定理 1.1(差角余弦) 对任意角
α
与
β,cos(α−β)=cosαcosβ+sinαsinβ。
推导只依赖两件事:交点落在单位圆上,以及旋转保持距离。两者对任意角都成立,所以这条等式不需要分象限讨论,也不要求
α、β
是锐角。
图 1-1 · 单位圆上
α、β
与
α±β
的三条终边,以及选余弦时出现的两条等长弦。可调两个角与和差开关,读数并排给出直接求值、公式合成与「把函数当加性的」错答。
2 · 由差角余弦派生的一族
其余公式都是定理 1.1 的推论,工具只有诱导公式与商数关系。把
β
换成
−β,右端的
sinβ
变号,得到和角余弦;把余弦的角写成
π/2
减一个角再换族,得到正弦的两条;正切的两条则由商数关系通分,分子分母同除
cosαcosβ
而来。六个等式合称和差角公式。
| 公式 |
右端 |
来历 |
|
cos(α−β)
|
cosαcosβ+sinαsinβ
|
定理 1.1 |
|
cos(α+β)
|
cosαcosβ−sinαsinβ
|
上式中
β→−β
|
|
sin(α+β)
|
sinαcosβ+cosαsinβ
|
cos(π/2−α−β)
换族
|
|
sin(α−β)
|
sinαcosβ−cosαsinβ
|
上式中
β→−β
|
|
tan(α+β)
|
1−tanαtanβtanα+tanβ
|
正弦除以余弦后约分 |
|
tan(α−β)
|
1+tanαtanβtanα−tanβ
|
上式中
β→−β
|
正切那两条比前四条脆:右端要求
tanα、tanβ
与
tan(α±β)
三者都有意义,任一个角落在
π/2+kπ
上就用不了。前四条没有这类限制。
警示 · 三角函数不是加性映射,sin(α+β)
与
sinα+sinβ
之间没有等号。这个错答能偏多远是量出来的:在
α, β∈[0°, 180°]
的
181×181
个整数格点上,∣sinα+sinβ−sin(α+β)∣
的最大值是 2.598076211353316,即
33/2,取在
α=β=120°
处。正弦的值域宽度只有
2,错答的偏差却超过
2.59。
3 · 正切公式在直角处的假结果
α+β=π/2
时
tan(α+β)
无意义,代数上的表现是分母
1−tanαtanβ
为零。看上去可以拿「分母为零」当判据,实测不行。
警示 · 双精度下这个分母不为零。Math.tan(Math.PI / 4) 算出的是 0.9999999999999999 而非
1,于是
1−tan45°tan45°
等于 2.220446049250313e-16,恰好是 Number.EPSILON;照公式算出的
tan90°
是 9007199254740991,也就是
253−1,一个看着完全正常的整数。换
30°+60°
那一组,分母是 3.3306690738754696e-16,结果 6933745219159076。所以判定极点必须按角来判(isTanPole 检查角是否落在
90°+k⋅180°
上),等分母报零是等不到的。
这件事把「公式的适用条件」与「实现的失效方式」分了开:适用条件由数学给出,而实现给出的不是报错,是一个量级正常、符号也正常的假结果。图 1-1 在选正切且两角之和为直角时会把左右两端的这种分歧显示出来。
4 · 二倍角与降幂
在和角公式里令
β=α,右端的两项合并,得到二倍角公式:sin2α=2sinαcosα,cos2α=cos2α−sin2α,tan2α=2tanα/(1−tan2α)。
余弦那条有三种等价写法。用平方关系把
sin2α
或
cos2α
换掉,得
cos2α=2cos2α−1=1−2sin2α。三式数值相同,用处不同:算出的量是
cosα
就取第二式,是
sinα
就取第三式,都能少开一次平方。
把后两式反解出平方项,得到降幂公式
sin2α=(1−cos2α)/2
与
cos2α=(1+cos2α)/2。它把二次式换成一次式,代价是角翻倍。半角公式是同一件事换个写法,把
α
换成
α/2
即得,符号由
α/2
所在象限裁决。
公式两端在浮点下并不逐位相等。左端只调一次 Math.sin,右端要做四次乘法与一次加减。以
1°
为步长扫遍
α, β∈[−360°, 360°]
的
721×721
个格点,正弦与余弦四条和差角公式两端的最大偏差是 2.6645352591003757e-15,合
12
个 Number.EPSILON,取在
α=−359°、β=−353°
处。这个界是量出来的,换一个 Math.sin 实现就可能变,trig.test.ts 里那条断言写的是「不超过
12
ulp」。
5 · 参考文献
- List of trigonometric identities. Wikipedia. 和差角、二倍角与降幂公式的完整清单。https://en.wikipedia.org/wiki/List_of_trigonometric_identities
- Proofs of trigonometric identities. Wikipedia. 差角余弦的距离法证明与其他几种证法。https://en.wikipedia.org/wiki/Proofs_of_trigonometric_identities
- Trigonometric Addition Formulas. Wolfram MathWorld. 六条和差角公式与它们的复数形式来源。https://mathworld.wolfram.com/TrigonometricAdditionFormulas.html
- Rotation matrix. Wikipedia. 平面旋转矩阵的两行恰是和角公式的两个分量。https://en.wikipedia.org/wiki/Rotation_matrix
- Ptolemy's theorem. Wikipedia. 托勒密定理,和角公式在历史上的另一条来路。https://en.wikipedia.org/wiki/Ptolemy%27s_theorem
- Machine epsilon. Wikipedia.
Number.EPSILON 的含义与 ulp 的口径。https://en.wikipedia.org/wiki/Machine_epsilon