Matroids Matheplanet Forum Index
Moderiert von Spock mire2
Mathematische Software & Apps » Mathematica » MiniMaxApproximation arcsin(sqrt(x/2)) / sqrt(x/2) im Intervall [0, 1/2]
Autor
Beruf J MiniMaxApproximation arcsin(sqrt(x/2)) / sqrt(x/2) im Intervall [0, 1/2]
AlphaSigma
Senior Letzter Besuch: im letzten Monat
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 Letzter Besuch: in der letzten Woche
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 Letzter Besuch: in der letzten Woche
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 Letzter Besuch: in der letzten Woche
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 Letzter Besuch: im letzten Monat
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 Letzter Besuch: in der letzten Woche
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 Letzter Besuch: im letzten Monat
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 Letzter Besuch: in der letzten Woche
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 Letzter Besuch: im letzten Monat
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.

Wechsel in ein anderes Forum:
 Suchen    
 
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]