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
x1=x0−f(x0)f′(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
xn+1=xn−f(xn)f′(xn)
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−−√ax2−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−af′(x)=2x
xn+1=1
xn+1=xn−x2n−a2xn
xn+1=12(xn+axn)
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
xn+1=xn−f(xn)f′(xn)
xn+1=xn−1(xn)2−a−2(xn)3
xn+1=12(3xn−(xn)3a)
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
3xn−(xn)3a>0
3xn>(xn)3a
(xn)2a<3
Deshalb:
(x0)2a<3
x0x0x010−6
Da Ihr Tag nach einem Algorithmus sucht C
, schreiben wir sehr schnell einen:
#include <stdio.h> // For printf
#include <math.h> // For fabs
void main()
{
float a = 5.0; // Number we want to take the square root of
float x = 1.0; // Initial guess
float xprev; // Root for previous iteration
int count; // Counter for iterations
// Find a better initial guess
// Half at each step until condition is satisfied
while (x*x*a >= 3.0)
x *= 0.5;
printf("Initial guess: %f\n", x);
count = 1;
do {
xprev = x; // Save for previous iteration
printf("Iteration #%d: %f\n", count++, x);
x = 0.5*(3*xprev - (xprev*xprev*xprev)*a); // Find square root of the reciprocal
} while (fabs(x - xprev) > 1e-6);
x *= a; // Actual answer - Multiply by a
printf("Square root is: %f\n", x);
printf("Done!");
}
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:
Initial guess: 0.500000
Iteration #1: 0.500000
Iteration #2: 0.437500
Iteration #3: 0.446899
Iteration #4: 0.447213
Square root is: 2.236068
Done!
a
Initial guess: 0.015625
Iteration #1: 0.015625
Iteration #2: 0.004601
Iteration #3: 0.006420
Iteration #4: 0.008323
Iteration #5: 0.009638
Iteration #6: 0.010036
Iteration #7: 0.010062
Square root is: 99.378067
Done!
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!