Hat jemand einen einfachen Algorithmus zur Berechnung eines einigermaßen genauen Arkussinus? Mit "einfach" meine ich eine Art Polynom, das <= 5 Multiplikationen pro Ausgangsabtastung erfordert. Und mit "ziemlich genau" meine ich ein Algo, dessen Fehler nicht mehr als 10% beträgt, wenn das Eingabeargument nahe bei plus oder minus eins liegt. Ich suchte eine Weile im Internet, fand aber nichts sofort Nützliches.
algorithms
math
Richard Lyons
quelle
quelle
Antworten:
Hier ist nur eine Polynomversion :
Das scheint fünf Multiplikationen (vorausgesetzt, Sie können das Ergebnis von speichern
x.*x
) und drei Additionen zu haben.Und die
scilab
Handlung ist:Top ist
scilab
‚sasin
vs diese, unten ist der Fehler zwischen den beiden.Ursprüngliche Antwort
Die Quadratwurzel hier mag ein Ärger sein, aber ich dachte, ich würde es aufschreiben, weil es nach Spaß aussieht. :-)
Diese Seite schlägt vor:
Ich habe dies in implementiertx=−1 0≤x≤1 −1≤x≤0
scilab
und es funktioniert OK, außer um . Nur die auf reflektieren , eine viel bessere Annäherung.Das obere Diagramm zeigt
scilab
dieasin
Funktion gegen die obige Annäherung (rot gestrichelt) gegen meine Änderung in Grün.Das untere Diagramm zeigt den Fehler für meine Änderung (das Zeichnen des Originals auf derselben Achse bedeutet, dass das Grün überall Null aussieht).
quelle
Ich habe eine ziemlich gute Implementierung von hier .arctan()
Ich denke, Sie können die Identität verwenden:
um zu bekommen was du willst.
quelle
Der zentrale Teil der Kurve ist kein wirkliches Problem, da er ziemlich linear ist und die Taylor-Annäherung an zwei oder drei Terme ein guter Ausgangspunkt ist (Polynomanpassung der kleinsten Quadrate etwas besser).
Die Seiten sind wegen der unendlichen Neigung problematischer. Ein Weg, um damit umzugehen, ist über die Transformation
das beinhaltet eine Quadratwurzel.
Wenn Ihr Argument mit Gleitkomma dargestellt wird, erhalten Sie eine schnelle Approximation der Quadratwurzel, indem Sie den Exponenten halbieren und eine lineare Transformation auf die Mantisse anwenden.z
Sei mit , dann . Sie können durch .z=m2e 1≤m<2 z√=m−−√2e/2 m−−√ (2–√−1)(m+2–√)
quelle