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
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%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 - Ссылка
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%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.
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.
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.)
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.
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
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.
Tags und Links algorithm math complexity-theory trigonometry