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-Key: 354640

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

Printed on: April 28, 2024 at 08:04 o'clock

Member: em-pie
em-pie Nov 13, 2017 updated at 21:11:25 (UTC)
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
Member: canlot
Solution canlot Nov 13, 2017 at 21:50:55 (UTC)
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