quadratwurzel

cpp_rookie

Grünschnabel
Hallo,

folgende Aufgabe will mir einfach nicht in den Schädel rein.
Vielleicht kann mir ja mal jemand nen Denkanstoß geben, oder mehr? :)
Programmiert wird in c++.

Aufgabe:

Gegeben ist folgender Algorithmus zur Berechnung der Quadratwurzel einer reellen Zahl:
Sei a > 0.0 eine reelle Zahl. Dann konvergiert die rekursiv definierte Folge
x0 > 0 beliebiger Anfangswert
xn+1 = ½ * (xn + a/xn)
gegen die Quadratwurzel von a.
Setzen Sie diese Definition in eine Schleife um, die bei jedem Durchlauf die nächst bessere
Näherung berechnet und in einer Variablen ablegt (xn ist dann der Wert der Variablen x im
n-ten Schleifendurchlauf).

Was für eine Schleife soll das denn sein? Bzw. wie soll diese aussehen?
So mathematische Aufgaben rauben mir immer den letzten nerv :mad:

Wäre super wenn mir da jemand helfen könnte.
Gruß
cpp_rookie
 
Ich würde sagen, das ist eine for-Schleife, wobei n den Schleifenindex symbolisiert. In der Schleife steht dann die Formel für das x des nächsten Schleifendurchlaufs. Dann suchst du Dir einfach noch ein beliebiges Anfangs-x (>0) und läßt die Schleife laufen.

Du kannst natürlich auch eine while-Schleife verwenden und die so lange laufen lassen, bis sich der Wert nicht mehr ändert. Das ist aber nicht ganz ungefährlich, z.B. wenn der Wert irgendwann anfängt, um den Zielwert zu oszilllieren.
 
Also ich setze x0 z.b. = 1, das ist dann der Anfangswert von xn.
Dann lass ich die Schleife n mal durchlaufen und umso öfter sie durch läuft, umso exakter ist meine Näherung an die Wurzel der zahl a?
 
Zuletzt bearbeitet:
Hallo!

Die einfache Varainte für die Newton Interpolations Methode zur Näherung der Quardratwurzel einer rationalen Zahl sähe so aus:
C++:
// squareroot.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>

using namespace std;

double squareRoot(double rationalNumber, int maxIterations){
    if(rationalNumber < 0 || maxIterations < 0){
       return -1;
    }
    double currentValue = rationalNumber;
    for(int i = 0; i< maxIterations;i++){
        currentValue = 0.5 * (currentValue + rationalNumber / currentValue);
    }

    return currentValue;
}

int main(int argc, char* argv[])
{
    cout << squareRoot(3*3,10) << endl;
    cout << squareRoot(2,1000) << endl;
    cout << squareRoot(11*11,10) << endl;
    cout << squareRoot(39*39,10) << endl;
    cout << squareRoot(5635*5635,100) << endl;
    return 0;
}

Ausgabe:
Code:
3
1.41421
11
39
5635
Press any key to continue

Mit dieser Methode kommst du aber sehr schnell außerhalb des Wertebereichs von double, da muss man schon etwas mehr tricksen ;-).

Gruß Tom
 
Zurück