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]
FindRootPlot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> None}, PlotRange -> All]
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.