|
Autor |
MiniMaxApproximation arcsin(sqrt(x/2)) / sqrt(x/2) im Intervall [0, 1/2] |
|
AlphaSigma
Senior  Dabei seit: 23.11.2012 Mitteilungen: 462
 | Themenstart: 2019-10-02
|
Hallo,
im Forum von www.mikrocontroller.net sucht jemand für eine math-lib eine
minmax rationale Approximation für
\[\arcsin\left(\sqrt{x/2}\right) / \sqrt{x/2}\]
im Intervall [0, 1/2]. Der relative Fehler soll kleiner 55 Bit, also 2e-17 sein. Dafür gibt es laut dieser Seite Function Approximations Package in Mathematica die Funktion
MiniMaxApproximation. Ich habe kein Mathematica und habe daher auf wolfram alpha versucht
\[
\text{MiniMaxApproximation} [sin^{-1} (x^{1/2}) / x^{1/2},{x,\{0,1/2\},6,6}]
\]
zu lösen. Das und andere Umschreibungen der Aufgabe versteht wolfram alpha scheinbar nicht. Habe ich das Problem nur nicht richtig formuliert oder bietet wolfram alpha diese Funktionalität nicht?
Ich verwende Debian Linux und habe u.a. Maxima, Axiom, Reduce und Octave. Da habe ich die Funktionalität noch nicht gefunden (habe aber auch noch nicht richtig gesucht).
Kennt hier jemand die "Syntax" von wolfram alpha oder wäre jemand mit Mathematica bereit, die Koeffizienten für das rationale Approximationspolynom zu generieren?
Vielen Dank
AlphaSigma
|
Profil
|
StefanVogel
Senior  Dabei seit: 26.11.2005 Mitteilungen: 4330
Wohnort: Raun
 | Beitrag No.1, eingetragen 2019-10-05
|
Hallo AlphaSigma,
online rechnen geht mit mathematica.wolframcloud.com Sign up for free, doch bin ich noch nicht weiter gekommen als bis zur Fehlermeldung "Failed to locate the extrema in 20 iterations. The function ArcSin[Sqrt[x]]/Sqrt[x] may be vanishing on the interval {0,1/2} or the WorkingPrecision may be insufficient to get convergence", auch nicht mit geänderten Intervall, WorkingPrecision, MaxIterations.
Viele Grüße,
Stefan
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2162
 | Beitrag No.2, eingetragen 2019-10-05
|
Vermutlich soll die Wandlung einer gegebenen expliziten Funktion in ein Bruch 2er Polynome einfach nur ein Geschwindigkeitsgewinn bringen
(oder eine Sprache kann asin(x) nicht).
Hier mal eine Lösung mit mathematica:
https://matheplanet.com/matheplanet/nuke/html/uploads/b/47407_MiniMaxApprox.PNG
Die Abweichung ist also immer kleiner 3e-14, was dem normalen double
Datentyp etwa entspricht.
2e-17 bekommt man mit double nicht hin!
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2162
 | Beitrag No.3, eingetragen 2019-10-05
|
Die Reihenentwicklung ist selbst mit Polynom 10.Grades nicht so genau:
https://matheplanet.com/matheplanet/nuke/html/uploads/b/47407_MiniMaxApproxSeries2.PNG
|
Profil
|
AlphaSigma
Senior  Dabei seit: 23.11.2012 Mitteilungen: 462
 | Beitrag No.4, vom Themenstarter, eingetragen 2019-10-05
|
Hallo,
erstmal vielen Dank für die Antworten.
Es geht dem Fragesteller um die Implementierung spezieller Funktionen wie sin, cos, tan und deren Umkehrfunktionen in einer Bibliothek für avr-gcc, d.h. den GNU C-Compiler für 8-Bit AVR-Mikrocontroller mit double Genauigkeit. Die AVRs haben nur 8 Bit Register, nur Hardwarebefehle für Addition und Multiplikation und nur für Ganzzahlen. Sie laufen mit maximal 20 MHz und max. 256 KByte für Programme und 16 KByte RAM für Daten. Kilobyte nicht Megabyte und schon gar nicht Gigabyte. D.h. die Berechnung sollte möglichst wenige Divisionen verwenden und wenig Speicherplatz für vorberechnete Werte belegen. Bei der ursprünglichen Frage ging es um den arctan. Dafür gibt es geeignete rationale Polynome x*P(x^2)/Q(x^2) in dem Buch Hart, "Computer Approximations". Z.B. eines mit Grad 6 im Zähler und im Nenner bzgl. x^2, d.h je 7 Koeffizienten im Zähler und Nenner für eine relative Genauigkeit von ca. 2e-17 für 0 < x < tan (pi/4). Den absoluten und relativen Fehler habe ich unter Linux mit bc (bc - An arbitrary precision calculator language) überprüft. https://www.mikrocontroller.net/topic/480840#5990326
In dem Buch von Hart gibt es Koeffizienten für rationale Polynome unterschiedlicher Grade für rel. Genauigkeiten bis 1e-25. Die 1. Auflage des Buches ist, nebenbei bemerkt, von 1968. Die Frage bzgl. einer effizienten Approximation von arctan konnte somit beantwortet werden.
In diesem Beitrag wird nun nach einer ähnlich effizienten Approximation für
\[
\arcsin\left(\sqrt(x/2)\right)/\sqrt(x/2)
\]
mit \(0 < x < 1/2\) gefragt. https://www.mikrocontroller.net/topic/480840#5990457 Man beacht \(x/2\) nicht \(x\).
Ich habe inzwischen Implementierungen des Remez-Algorithmus in Matlab/Octave und in C-Bibliotheken gefunden, allerdings nur für einfache Polynome, nicht für rationale. Ich werde mich dann wohl mal bei Wolfram Alpha anmelden oder mir einen RaspberryPi mit Mathematica besorgen.
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2162
 | Beitrag No.5, eingetragen 2019-10-05
|
Also hier mit x/2 und etwas genauer:
https://matheplanet.com/matheplanet/nuke/html/uploads/b/47407_MiniMaxApproxSeriesXhalb.PNG
Dort wird auch nur mit double gerechnet.
|
Profil
|
AlphaSigma
Senior  Dabei seit: 23.11.2012 Mitteilungen: 462
 | Beitrag No.6, vom Themenstarter, eingetragen 2019-10-05
|
Vielen Dank hyperG,
ich denke Du hast nichts dagegen, wenn ich das Ergebnis auf mikrocontroller.net mit einem Link hierher kommuniziere, oder?
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2162
 | Beitrag No.7, eingetragen 2019-10-07
|
Kein Problem.
Durch den LINK sieht man ja die Quelle.
|
Profil
|
AlphaSigma
Senior  Dabei seit: 23.11.2012 Mitteilungen: 462
 | Beitrag No.8, vom Themenstarter, eingetragen 2019-11-01
|
Hallo hyperG,
kurzer Nachtrag: Mit WorkingPrecision 30 und Polynomgrad 5/5 erhalte ich:
\sourceon Mathematica
In[29]:= mmlist =
MiniMaxApproximation[
ArcSin[Sqrt[x/2]]/Sqrt[x/2], {x, {0.00000000000001, 1/2}, 5, 5},
WorkingPrecision -> 30];
mmfunc = mmlist[[2, 1]]
Out[30]= (1.00000000000000000008629059933 -
1.18681417959864950921122529677 x +
0.494264805211390263255396571324 x^2 -
0.0846958092538975690694231783752 x^3 +
0.00520341959718635442405095188701 x^4 -
0.0000577104932695244324239800742932 x^5)/(1 -
1.27014751293198280590547245976 x +
0.581360431289052905460197604182 x^2 -
0.114907603136629507944969755424 x^3 +
0.00906755032272074793394491020607 x^4 -
0.000190303978349659438168313002141 x^5)
In[31]:= Plot[mmfunc - ArcSin[Sqrt[x/2]]/Sqrt[x/2], {x, 0.0000000000000001,
0.5}]
\sourceoff
https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_plot01.png
Also in etwa das doppelte der double precision Genauigkeit von 2e-16.
Ich werde mal in der Dokumentation schauen, ob Mathematica das Approximieren auch mit höherer Genauigkeit kann.
Korrektur: Die Approximation war ja bereits mit WorkingPrecision 30. Wenn man das auch noch im Plot-Befehl anfügt, sieht man die wirklich erzielte Genauigkeit von 1e-19. Sehr schön.
\sourceon Mathematica
In[32]:= Plot[mmfunc - ArcSin[Sqrt[x/2]]/Sqrt[x/2], {x, 0.0000000000000001, 0.5}, WorkingPrecision -> 30]
\sourceoff
https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_plot02.png
|
Profil
|
AlphaSigma hat die Antworten auf ihre/seine Frage gesehen. AlphaSigma hat selbst das Ok-Häkchen gesetzt. |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|