Ich habe sehr begrenzte Ressourcen, da ich mit einem Mikrocontroller arbeite. Gibt es eine Erweiterung der Taylor-Serie, eine gemeinsame Nachschlagetabelle oder einen rekursiven Ansatz?
Ich würde es vorziehen, etwas zu tun, ohne math.hs sqrt () zu verwenden.
algorithms
c
numerical-algorithms
Tarabyte
quelle
quelle
Antworten:
Wenn Sie eine billige und schmutzig optimierte Power-Series-Erweiterung (die Koeffizienten für Taylor-Serien konvergieren langsam) für
sqrt()
und eine Reihe anderer Trancendentale wollen, habe ich einen Code von vor langer Zeit. Früher habe ich diesen Code verkauft, aber seit fast einem Jahrzehnt hat mich niemand mehr dafür bezahlt. Also denke ich, ich werde es für den öffentlichen Konsum freigeben. Diese spezielle Datei war für eine Anwendung gedacht, bei der der Prozessor Gleitkomma (IEEE-754 mit einfacher Genauigkeit) und einen C-Compiler und ein Dev-System hatte, dies jedoch nichthaben (oder wollten nicht verlinken) die stdlib, die die Standard-Mathematikfunktionen gehabt hätte. Sie brauchten keine perfekte Präzision, aber sie wollten, dass die Dinge schnell waren. Sie können den Code ziemlich einfach rückentwickeln, um die Leistungsreihenkoeffizienten zu ermitteln und Ihren eigenen Code zu schreiben. Dieser Code setzt IEEE-754 voraus und maskiert die Bits für Mantisse und Exponent.Es scheint, dass das "Code-Markup", das SE hat, mit Winkelzeichen unfreundlich ist (Sie kennen ">" oder "<"), daher müssen Sie wahrscheinlich auf "Bearbeiten" klicken, um alles zu sehen.
quelle
stdlib
.Wenn Sie es nicht gesehen haben, ist die "Quake Quadratwurzel" einfach mystifizierend. Es verwendet etwas Magie auf Bitebene, um Ihnen eine sehr gute erste Annäherung zu geben, und verwendet dann ein oder zwei Runden von Newtons Näherung, um sie zu überarbeiten. Es kann Ihnen helfen, wenn Sie mit begrenzten Ressourcen arbeiten.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
quelle
Sie können die Quadratwurzelfunktion auch mithilfe der Newtonschen Methode approximieren . Die Newtonsche Methode ist eine Methode zur Annäherung an die Wurzeln einer Funktion. Es ist auch eine iterative Methode, bei der das Ergebnis der vorherigen Iteration in der nächsten Iteration bis zur Konvergenz verwendet wird. Die Gleichung für Newtons Methode zum Erraten, wo die Wurzel einer Funktion wenn eine anfängliche Schätzung x 0 gegeben ist, ist definiert als:f(x) x0
ist die erste Vermutung, wo sich die Wurzel befindet. Wir recyceln die Gleichung weiter und verwenden die Ergebnisse früherer Iterationen, bis sich die Antwort nicht mehr ändert. Um die Schätzung der Wurzel bei der ( n + 1 ) -Iterationzu bestimmen, wird im Allgemeinendie Schätzung bei der n- Iteration wie folgt definiert:x1 (n+1) n
Nehmen wir an, wir erhalten eine Zahl um die Newtonsche Methode zur Approximation der Quadratwurzel zu verwenden . Um die Quadratwurzel zu berechnen, müssen wir √ berechnena Als solches suchen wir nach einer Antwort, bei derx= √ ista−−√ . Quadrieren Sie beide Seiten, und wenn Sieaauf die andere Seite der Gleichung verschieben, erhalten Siex2-a=0. Daher lautet die Antwort auf diese Gleichung √x=a−−√ a x2−a=0 und ist somit dieWurzelder Funktion. Als solches seif(x)=x2-adie Gleichung, deren Wurzel wir finden wollen. Durch Einsetzen in Newtons Methode istf'(x)=2xund daher:a−−√ f(x)=x2−a f′(x)=2x
xn+1=1
Um die Quadratwurzel von zu berechnen, müssen wir einfach die Newtonsche Methode berechnen, bis wir konvergieren. Wie von @ robertbristow-johnson festgestellt, ist die Aufteilung jedoch eine sehr teure Operation - insbesondere für Mikrocontroller / DSPs mit begrenzten Ressourcen. Zusätzlich kann es einen Fall geben, in dem eine Schätzung 0 sein kann, was aufgrund der Teilungsoperation zu einem Fehler beim Teilen durch 0 führen würde. Als solches können wir die Newtonsche Methode verwenden und stattdessen nach der reziproken Funktion lösen , dh 1a . Dies vermeidet auch jegliche Teilung, wie wir später sehen werden. Quadrieren Sie beide Seiten und bewegen Sie √1x=a−−√ Over auf der linken Seite ergibt also 1a−−√ . Daher wäre die Lösung hierfür11x2−a=0 . Durch Multiplikation mitawürden wir unser beabsichtigtes Ergebnis erhalten. Mit der Newtonschen Methode haben wir also wieder:1a√ a
Es gibt jedoch eine Warnung, die wir bei der Betrachtung der obigen Gleichung berücksichtigen sollten. Für Quadratwurzeln sollte die Lösung positiv sein. Damit die Iterationen (und das Ergebnis) positiv sind, muss die folgende Bedingung erfüllt sein:
3 x n > ( x n ) 3 a
Deshalb:
Da Ihr Tag nach einem Algorithmus sucht
C
, schreiben wir sehr schnell einen:Dies ist eine ziemlich grundlegende Implementierung der Newtonschen Methode. Beachten Sie, dass ich die anfängliche Schätzung immer wieder um die Hälfte reduziere, bis die Bedingung, über die wir zuvor gesprochen haben, erfüllt ist. Ich versuche auch, die Quadratwurzel von 5 zu finden. Wir wissen, dass dies ungefähr 2,236 oder so entspricht. Die Verwendung des obigen Codes ergibt die folgende Ausgabe:
Wie Sie sehen, unterscheidet sich nur, wie viele Iterationen erforderlich sind, um die Quadratwurzel zu berechnen. Je höher die Anzahl der zu berechnenden Daten ist, desto mehr Iterationen sind erforderlich.
Ich weiß, dass diese Methode bereits in einem früheren Beitrag vorgeschlagen wurde, aber ich dachte, ich würde die Methode ableiten und Code bereitstellen!
quelle
Da das Code-Markup für SE wie Scheiße zu funktionieren scheint, werde ich versuchen, dies direkter zu beantworten, speziell für dasx−−√ Funktion.
Ja, eine Potenzreihe kann schnell und effizient die Quadratwurzelfunktion und nur über einen begrenzten Bereich approximieren . Je breiter die Domäne, desto mehr Begriffe benötigen Sie in Ihrer Potenzreihe, um den Fehler ausreichend gering zu halten.
wo
Wenn es sich um Gleitkomma handelt, müssen Sie den Exponenten und die Mantisse trennen, wie es mein C-Code in der anderen Antwort tut.
quelle
Tatsächlich erfolgt dies durch Lösen einer quadratischen Gleichung mit der Newton-Methode:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Für Zahlen größer als eins können Sie die folgende Taylor-Erweiterung verwenden:
http://planetmath.org/taylorexpansionofsqrt1x
quelle
Innerhalb von 4% Genauigkeit, wenn ich mich gut erinnere. Es wurde von Ingenieuren vor logarithmischen Linealen und Taschenrechnern verwendet. Ich habe es in Notes et formules de l'ingénieur, De Laharpe , 1923 gelernt
quelle