Berechne den Kosinus einer Sequenz

8

Ich muss folgendes berechnen:

%Vor%

totalN ist eine große Zahl, also möchte ich das effizienter machen. Gibt es eine Möglichkeit, dies zu verbessern? Ich vermute, dass es da ist, denn schließlich wissen wir, was das Ergebnis von cos (n) ist, für n = 1..N, vielleicht gibt es einen Satz, der es mir erlaubt, dies schneller zu berechnen. Ich würde wirklich jeden Hinweis schätzen.

Vielen Dank im Voraus,

Federico

    
Federico 01.03.2010, 18:10
quelle

9 Antworten

6

Mit einer der schönsten Formeln der Mathematik Eulers Formel
exp(i*x) = cos(x) + i*sin(x) ,

ersetzt x := n * phi :

cos(n*phi) = Re( exp(i*n*phi) )
sin(n*phi) = Im( exp(i*n*phi) )

exp(i*n*phi) = exp(i*phi) ^ n

Power ^n ist n wiederholte Multiplikationen. Daher können Sie cos(n*phi) und gleichzeitig sin(n*phi) durch wiederholte komplexe Multiplikation mit exp(i*phi) beginnend mit (1+i*0) berechnen.

Codebeispiele:

Python:

%Vor%

oder C:

%Vor%     
Curd 01.03.2010, 18:34
quelle
6

Ich bin mir nicht sicher, welche Kompromisse zwischen Genauigkeit und Leistung Sie eingehen wollen, aber es gibt ausführliche Diskussionen über verschiedene sinusförmige Näherungstechniken unter diesen Links:

Spaß mit Sinusiden - Ссылка Schneller und genauer Sinus / Cosinus - Ссылка

Edit (Ich denke, das ist der Link "Don Cross", der auf der Seite "Spaß mit Sinusiden" gebrochen ist):

Optimierung der Trig Berechnungen - Ссылка

    
datageist 01.03.2010 18:56
quelle
4

Vielleicht ist die einfachste Formel

  

cos (n + y) = 2 cos (n) cos (y) - cos (n-y).

Wenn Sie die Konstante 2 * cos (y) vorberechnen, kann jeder Wert cos (n + y) aus den vorherigen 2 Werten mit einer einzigen Multiplikation und einer einzigen Subtraktion berechnet werden. D. h. Im Pseudocode

%Vor%     
Accipitridae 01.03.2010 21:02
quelle
3

Hier ist eine Methode, aber sie benutzt ein bisschen Erinnerung für die Sünde. Es verwendet die trigonometrischen Identitäten:

%Vor%

Dann ist hier der Code:

%Vor%

Wenn ich keine Fehler gemacht habe, sollte es das tun. Natürlich könnte es Rundungsprobleme geben, seien Sie sich dessen bewusst. Ich habe dies in Python implementiert und es ist ziemlich genau.

    
Justin Peel 01.03.2010 18:28
quelle
1

Hier gibt es einige gute Antworten, aber sie sind alle rekursiv. Die rekursive Berechnung funktioniert nicht für die Cosinus-Funktion, wenn Gleitkomma-Arithmetik verwendet wird. Sie werden immer Rundungsfehler bekommen, die sich schnell zusammenfügen.

Betrachten Sie die Berechnung y = 45 Grad, insgesamt N 10 000. Sie werden nicht mit 1 als Endergebnis enden.

    
Kirk Broadhurst 07.03.2010 11:51
quelle
1

Um Kirks Bedenken zu begegnen: Alle Lösungen, die auf der Wiederholung von cos und sin beruhen, laufen auf das Computing hinaus

x (k) = R x (k - 1),

wobei R die Matrix ist, die sich um y dreht und x (0) der Einheitsvektor (1, 0) ist. Wenn das wahre Ergebnis für k - 1 x '(k - 1) ist und das wahre Ergebnis für k ist x' (k), dann geht der Fehler von e (k - 1) = x (k - 1) - x ' (k - 1) bis e (k) = Rx (k - 1) - Rx '(k - 1) = Re (k - 1) durch Linearität. Da R eine sogenannte orthogonale Matrix ist, hat Re (k - 1) dieselbe Norm wie e (k - 1), und der Fehler wächst sehr langsam. (Der Grund, warum es überhaupt wächst, ist eine Abrundung; die Computerdarstellung von R ist im Allgemeinen fast, aber nicht ganz orthogonal, so dass es notwendig ist, die Wiederholung mit den Auslöseoperationen von Zeit zu Zeit abhängig von der Genauigkeit neu zu starten Dies ist immer noch viel, viel schneller als die Verwendung der Trig-Ops zur Berechnung jedes Wertes.)

    
user287792 07.03.2010 15:33
quelle
0

Sie können dies mit komplexen Zahlen tun.

Wenn Sie x = sin (y) + i cos (y) definieren, wird cos (y * i) der reelle Teil von x ^ i sein.

Sie können iterativ für alle i berechnen. Komplexe Multiplikation ist 2 Multiplikationen plus zwei Additionen.

    
user180326 01.03.2010 18:17
quelle
0

Das Wissen von cos (n) hilft nicht - Ihre Mathebibliothek macht bereits diese Art von trivialen Dingen für Sie.

Wissen, dass cos ((i + 1) y) = cos (i y + y) = cos (i ) cos (y) -sin (i y) sin (y) kann helfen, wenn Sie cos (y) und sin (y) vorberechnen und sowohl cos (i y) als auch sin (i * y) auf dem Weg verfolgen. Es kann jedoch zu einem gewissen Genauigkeitsverlust kommen - Sie müssen dies überprüfen.

    
AVB 01.03.2010 18:17
quelle
0

Wie genau muss das resultierende cos (x) sein? Wenn Sie mit einigen leben können, können Sie eine Nachschlagetabelle erstellen, die den Einheitskreis in Intervallen von 2 * PI / N abtastet und dann zwischen zwei benachbarten Punkten interpoliert. N würde gewählt werden, um ein gewisses Maß an Genauigkeit zu erreichen.

Was ich nicht weiß ist, ob eine Interpolation tatsächlich weniger kostenintensiv ist als die Berechnung eines Kosinus. Da es bei modernen CPUs meist in Microcode erfolgt, darf es nicht sein.

    
Larry 01.03.2010 20:54
quelle