Auf der Hilfeseite von FindRoot heißt es:

„Standardmäßig verwendet FindRoot die Newton-Methode (Newton-Raphson), um ein nichtlineares System zu lösen.“

(oder eine nichtlineare Gleichung, nehme ich an). Trotzdem ist im Befehl FindRoot etwas für mich verborgen. Betrachten Sie die Funktion

f[x]:=Exp[1 - x] - 1, 

dessen Newton-Iterationsfunktion

Nf[x_]:=E^(-1 + x) (-1 + E^(1 - x)) + x 

Iterieren mit dieser Funktion unter Verwendung von NestList erhalten Sie die nach Newtons Methode erzeugte Folge von Werten. Die Newton-Methode für große Werte der anfänglichen Schätzung stellt eine langsame Konvergenz für dieses Problem dar. Wenn wir $ x_0 = 10 $ nehmen, erhalten wir:

NestList[Nf, 10., 8] (* {10., -8092.08, -8091.08, -8090.08, -8089.08, -8088.08, -8087.08, -8086.08, -8085.08} *) 

, wo wir das sehen können langsame Konvergenz. Ein Diagramm der Funktion Nf[x] hilft, das Verhalten der Methode zu verstehen. Wenn Sie jedoch

Module[{s = 0, e = 0}, {FindRoot[f[x], {x, 10.}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}] 

verwenden, wird

{{x -> 1.}, "Steps" -> 7, "Evaluations" -> 11} 

benötigt, um nur 7 Schritte zu erhalten, um die Lösung $ zu erhalten x = 1 $. Warum erzeugt FindRoot dieses Ergebnis? Offensichtlich verwendet FindRoot nicht die Standardmethode von Newton, nicht wahr? Kann mir jemand helfen? Vielen Dank.

Kommentare

Antwort

Standardmäßig FindRoot verwendet die "LineSearch" Methode zur Schrittsteuerung, wie im Tutorial tutorial/UnconstrainedOptimizationLineSearchMethods . Die Standardeinstellungen sind

FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> {"LineSearch", "CurvatureFactor" -> Automatic, "DecreaseFactor" -> 1/10000, "MaxRelativeStepSize" -> 10, Method -> Automatic}}] 

Um Newtons Methode mehr oder weniger genau zu erhalten, verwenden Sie keine Schrittsteuerung. FindRoot begrenzt weiterhin die maximale Schrittgröße (der erste Schritt im folgenden Fall wird auf x == -100. abgeschnitten):

Module[{s = 0, e = 0}, {FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> None}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}] 

FindRoot :: cvmit: Konvergenz der angeforderten Genauigkeit oder Präzision innerhalb von 100 Iterationen fehlgeschlagen. >>

(* {{x -> -1.07713}, "Steps" -> 100, "Evaluations" -> 101} *) 

Sie können die Optionen

StepMonitor :> Print[{x}], EvaluationMonitor :> Print[x] 

verwenden, um die Schritte und Bewertungen zu überwachen. Oder Sie können Verwenden Sie FindRootPlot im Paket "Optimization`UnconstrainedProblems`". (Achten Sie sorgfältig auf die gelben Punkte, die eine Bewertung kennzeichnen, die kein Schritt ist.)

Needs["Optimization`UnconstrainedProblems`"] FindRootPlot[Exp[1 - x] - 1, {x, 10.}, PlotRange -> All] 

Mathematica-Grafiken

FindRootPlot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> None}, PlotRange -> All] 

Mathematica-Grafiken

Kommentare

  • Anders ausgedrückt: FindRoot[] verwendet eine gedämpfte Version von Newton-Raphson, da ohne die Dämpfung eine schlechte Auswahl der Startwerte häufiger zu Abweichungen führt. Die Dämpfung verringert die Wahrscheinlichkeit, dass die Iterationen wild werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.