Auswertung von Sinus und Cosinus eines ganzzahligen Vielfachen eines Winkels


8

Wenn zylindrischen Harmonischen Auswertung eines trigonometrischen Funktionen Bedürfnisse bewerten und sin ( m θ ) , was möglicherweise für große ganze Zahl m und θ [ - π , π ] . Was ist der beste Weg, dies in C-Code zu tun? Derzeit bewerte ich nur unter dem Winkel m & thgr;, aber ich würde vermuten, dass Standardbibliotheken bei großen Argumenten an Genauigkeit verlieren. Ich habe überlegt, Doppelwinkelformeln und dergleichen zu verwenden, um die Größe der Argumente rekursiv zu reduzieren, aber ich frage mich, ob dies letztendlich zu mehr Fehlern führt.cos(mθ)sin(mθ)mθ[π,π]mθ

Antworten:


4

Wenn Sie es iterativ tun, durch die Berechnung und cos ( n θ ) von sin ( ( n - 1 ) θ ) und cos ( ( n - 1 ) θ ) , dann Floating - Point - Fehler werden nicht durch die Ansammlung sprengen . Dies liegt daran, dass die Übergangsmatrix orthonormal ist. Es ist eine einfache Rotationsmatrix.sin(nθ)cos(nθ)sin((n1)θ)cos((n1)θ)


Hm, das ist ein guter Punkt. Habe ich jedoch die Gewissheit, dass das Ergebnis nicht von der "genauen" Antwort abweicht, auch wenn der Fehler nicht explodiert?
Victor Liu

Ich bezweifle, dass die Ergebnisse im Vergleich zur genauen Antwort sehr unterschiedlich sein werden. Sie können versuchen, und θ = π / m, damit Sie wissen, was Sie erwartet. m=1000θ=π/m

Immer wenn ist, würde ich die Doppelwinkelformel verwenden, um den Exponenten in zwei Hälften zu schneiden. Dies entspricht der Berechnung der n- ten Potenz der Rotationsmatrix mit dem O ( log ( n ) ) - Algorithmus. nnO(log(n))
Erik P.

Du hast recht. Meine Antwort war auf der Annahme , dass alle Zwischenwerte ( ) ebenfalls verwendet werden. 1,...,m1

7

Ich bin schon einmal auf ein ähnliches Problem gestoßen, habe mir aber mehr Sorgen um Geschwindigkeit als um Genauigkeit gemacht (siehe Artikel hier ). Wenn Ihr Winkel das Ergebnis eines Arccos ( ) ist , was bei geometrischen Berechnungen häufig der Fall ist, können Sie Chebyshev-Polynome verwenden , die wie folgt definiert sindϑarccos()

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

und kann schnell und stabil unter Verwendung der Drei-Term-Wiederholungsrelation bewertet werden

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

cos(mϑ)m+1cos(ϑ)


2

coskxsinkx

Die Wiederholung (praktisch dieselbe wie in Beispiel 4 in Bulirsch / Stoer, siehe für eine detaillierte Analyse) verläuft wie folgt:

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

wo wir die vorberechneten Konstanten haben

p=2sin2ε2,q=sinε

ε

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.