角度の整数倍の正弦と余弦の評価


8

円筒調和関数を評価する場合、三角関数とを評価する必要があります。これは、大きな整数とます。Cコードでこれを行う最良の方法は何ですか?現在、私はの角度評価しているだけですが、標準ライブラリは大きな引数で精度を失うと思われます。引数の大きさを再帰的に減らすために、ダブルアングルの数式などを使用することを検討していましたが、結果的にエラーが増えるかどうか疑問に思っています。M θ M θ [ - π π ] M θcos(mθ)sin(mθ)mθ[π,π]mθ

回答:


4

繰り返し行う場合、とからとを計算することにより、浮動ポイントエラーは蓄積によって爆破されません。これは、遷移行列が正規直交であるためです。単純な回転行列です。のcos nはθ の罪N - 1 θ のcos N - 1 θ sin(nθ)cos(nθ)sin((n1)θ)cos((n1)θ)


うーん、それは良い点です。ただし、エラーが爆発しない場合でも、結果が「正確な」答えからはずれないことは保証されますか?
Victor Liu、

正確な回答と比較して、結果が大きく異なることはないと思います。あなたは、のために試すことができとあなたが期待するものを知っているので。θ = π / Mm=1000θ=π/m

が偶数のはいつでも、二重角度の式を使用して指数を半分にカットします。これは、アルゴリズムで回転行列の乗を計算することに対応します。n O log n nnO(log(n))
エリックP.

あなたが正しい。私の答えは、すべての中間値()も使用されるという仮定に基づいていました。1,...,m1

7

以前に同様の問題に遭遇しましたが、正確さよりも速度の方が心配でした(こちらの論文を参照)。角度がの結果である場合、これは幾何計算でよくあることですが、次のように定義されるチェビシェフ多項式を使用できます。arccos ϑarccos()

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

3項の反復関係を使用して、迅速かつ安定して評価できます。

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

このように、あなたの問題のために、あなたが評価することができますにおける回の乗算と加算、あなたが持って提供。cos(mϑ)m+1cos(ϑ)


2

一部のFFT実装でも使用されていることがわかっている、私が好む手順も3項の反復を含みますが、以前のおよびの計算よりも少し安定しています。(Bulirsch / Stoerでのこれらの再発の優れた分析があります。例2と3を参照してください。不安定性を幾何学的に見る方法は、最初はおおよその円をトレースしますが、長い目で見れば、文字通り制御不能になっているということです。)coskxsinkx

再発(事実上、Bulirsch / Stoerの例4と同じです。詳細な分析については、次を参照してください)は次のように進行します。

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

事前に計算された定数があります

p=2sin2ε2,q=sinε

前述のように、特にが小さい場合は、非常に優れたパフォーマンスを発揮します。ε

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.