corvoattano
Goto Top

Newtonverfahren in C++

Ich möchte auf Grund einer Hausaufgabe das Newton-Verfahren, zur Berechnung der Nullstellen einer gebrochen-rationalen Funktion, in C++ realisieren.
Zurzeit gehe ich in die 12. Klasse einer FOS also mein Wissen über C++ ist sehr gering, weswegen ich nach Hilfe in einem Forum suche.

Ich brauche nicht zwingend eine Lösung aber ich wüsste gerne Funktionen mit denen sich diese Aufgabe realisieren lässt.

Gegeben ist eine Funktion: (5x^3 - 8) / (6x - 2)

Mit dem Newton-Verfahren sollen nun die Nullstellen berechnet werden.
Die Funktion ist im Programm Festgelegt und muss nicht vom Nutzer eingegeben werden. Ebenso ist die Ableitung der Funktion festgelegt.

Nun soll ein Startwert eingegeben werden und die Nullstellen sollen ausgegeben werden.

Danke schon mal im voraus.

Formel - Newton Verfahren

Content-ID: 354640

Url: https://administrator.de/contentid/354640

Ausgedruckt am: 25.11.2024 um 10:11 Uhr

em-pie
em-pie 13.11.2017 aktualisiert um 22:11:25 Uhr
Goto Top
Moin,

also wenn ich das richtig verstanden habe (das Newton-Prinzip bei Wikipedia), so näherst du dich der Nullstelle langsam.

Folglich musst du deine obige Formel einfach nur mehrmals anwenden:
Schreibe eine Funktion, die die obige Formel mit deiner genannten Funktion ausrechnet.
Mit dem hieraus gewonnenem Ergebnis rufst du die selbe Funktion quasi wieder rekursiv auf. Mit dem Ergebnis wieder rekursiv, usw.
Das Ganze machst du so lange, bis du als Ergebnis eine Null erhältst.

Mehr müsste das nicht sein....

Kann mich aber auch irren face-wink
canlot
Lösung canlot 13.11.2017 um 22:50:55 Uhr
Goto Top
Zitat von @em-pie:

Moin,

also wenn ich das richtig verstanden habe (das Newton-Prinzip bei Wikipedia), so näherst du dich der Nullstelle langsam.

Folglich musst du deine obige Formel einfach nur mehrmals anwenden:
Schreibe eine Funktion, die die obige Formel mit deiner genannten Funktion ausrechnet.
Mit dem hieraus gewonnenem Ergebnis rufst du die selbe Funktion quasi wieder rekursiv auf. Mit dem Ergebnis wieder rekursiv, usw.
Das Ganze machst du so lange, bis du als Ergebnis eine Null erhältst.
Naja nicht ganz face-smile
Bis man sich an eine Nullstelle genähert hat, das kann eine Null sein muss aber nicht.

Mehr müsste das nicht sein....

Kann mich aber auch irren face-wink

@CorvoAttano
Also gut, du brauchst dafür eine Stammfunktion und eine Ableitung, dann würdest du einen Punkt auswählen und so lange durch iterieren bis es reicht.

Ich würde das ungefähr so schreiben(in C++).

float Stammfunktion(float x)
{
 return ((5*x)*(5*x)*(5*x) - 8) / (6*x - 2);
}

float Ableitung(float x)
{
 ..... //musst du selber schreiben
}

int main()
{
 float startwert = 0;
 float x = startwert;
for(int i = 0; i < 10; i++)
{
 x = x - (Stammfunktion(x)/Ableitung(x));
std::cout >> x;
}
}

Der Code ist nicht getestet, es sind sehr wahrscheinlich ein paar Fehler drin.
Aber einen Ansatz hast du jetzt face-smile