计算角度整数倍的正弦和余弦

计算科学 特殊功能
2021-11-28 09:52:24

在评估柱谐波时,需要评估三角函数,可能适用于大整数在 C 代码中执行此操作的最佳方法是什么?目前,我只是在角度进行评估,但我怀疑标准库在大参数上会失去准确性。我正在考虑使用双角公式等来递归地减少参数的大小,但我想知道这是否会导致更多的错误。cos(mθ)sin(mθ)mθ[π,π]mθ

3个回答

我以前遇到过类似的问题,但我更担心速度而不是准确性(请参阅此处的论文)。如果你的角度ϑ是一个结果arccos(),这在几何计算中经常出现,您可以使用Chebyshev 多项式,其定义为

Tk(x)=cos(karccos(x)),orTk(cos(ϑ))=cos(kϑ)

并且可以使用三项递归关系快速稳定地评估

Tk(x)=2xTk1(x)Tk2(x),T0(x)=1,T1(x)=x.

因此,对于您的问题,您可以评估cos(mϑ)m+1乘法和加法,只要你有cos(ϑ).

如果你做它迭代,通过计算\浮动点误差不会因累积而爆发。这是因为转移矩阵是正交的。它是一个简单的旋转矩阵。sin(nθ)cos(nθ)sin((n1)θ)cos((n1)θ)

我更喜欢的过程,我也看到一些 FFT 实现使用它,也涉及三项递归,但比计算更稳定一点coskxsinkx从以前的前辈。(在Bulirsch/Stoer中对这些重复进行了很好的分析;请参见示例 2 和示例 3。查看不稳定性的几何方法是,尽管您一开始绘制了一个近似圆,但从长远来看,您实际上会失去控制.)

重复(实际上与 Bulirsch/Stoer 中的示例 4 相同,请参阅详细分析)如下进行:

cos(θ+ε)=cosθ(pcosθ+qsinθ)sin(θ+ε)=sinθ(psinθqcosθ)

我们有预先计算的常数

p=2sin2ε2,q=sinε

如前所述,它们的表现非常出色,尤其是在以下情况下ε很小。