A FindRoot
súgója így szól:
“alapértelmezés szerint a FindRoot Newton módszerét (Newton-Raphson) használja egy nemlineáris rendszer megoldására”
(vagy feltételezem egy nemlineáris egyenletről). Mindazonáltal van valami rejtve számomra a FindRoot
parancsban. Vegye figyelembe a
f[x]:=Exp[1 - x] - 1,
akinek Newton-iterációs függvénye
Nf[x_]:=E^(-1 + x) (-1 + E^(1 - x)) + x
Ezzel a függvénnyel ismétlődik a NestList
segítségével a Newton módszerével előállított értékek sorrendje. A Newton-módszer a kezdeti kitalálás nagy értékeihez lassú konvergenciát mutat be a problémához. $ X_0 = 10 $ -ot véve:
NestList[Nf, 10., 8] (* {10., -8092.08, -8091.08, -8090.08, -8089.08, -8088.08, -8087.08, -8086.08, -8085.08} *)
ahol láthatjuk a lassú konvergencia. A Nf[x]
függvény ábrája segít megérteni a módszer viselkedését. De ha
Module[{s = 0, e = 0}, {FindRoot[f[x], {x, 10.}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}]
veszi,
{{x -> 1.}, "Steps" -> 7, "Evaluations" -> 11}
csak 7 lépés szükséges a megoldás megszerzéséhez $ x = 1 $. Miért FindRoot
adja ezt az eredményt ?. Nyilvánvaló, hogy a FindRoot
nem a szokásos Newton-módszert használja, nem igaz? Tudna nekem valaki segíteni? Köszönet.
Megjegyzések
- itt és itt
Válasz
Alapértelmezés szerint FindRoot
a lépések vezérlésének "LineSearch"
módszerét használja, az oktatóanyagban leírt módon, tutorial/UnconstrainedOptimizationLineSearchMethods
. Az alapértelmezett beállítások a következők:
FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> {"LineSearch", "CurvatureFactor" -> Automatic, "DecreaseFactor" -> 1/10000, "MaxRelativeStepSize" -> 10, Method -> Automatic}}]
Ha Newton metódusát nagyjából pontosan meg szeretné kapni, ne használjon lépésvezérlést. Azonban FindRoot
továbbra is korlátozza a maximális lépésméretet (az alábbi esetben az első lépés csonka: x == -100.
):
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: 100 iteráción belül nem sikerült konvergálni a kért pontosságra vagy pontosságra. >>
(* {{x -> -1.07713}, "Steps" -> 100, "Evaluations" -> 101} *)
Használhatja a
StepMonitor :> Print[{x}], EvaluationMonitor :> Print[x]
lehetőségeket a lépések és értékelések nyomon követésére. Vagy használja a FindRootPlot
elemet a "Optimization`UnconstrainedProblems`"
csomagban. (Figyelje meg alaposan a nem pontértékelést jelölő sárga pontokat.)
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]
Megjegyzések
- Másképp fogalmazva: A
FindRoot[]
a Newton-Raphson csillapított verzióját használja, mert a csillapítás nélkül a kiindulási értékek rossz megválasztása gyakran divergenciát eredményez. A csillapítás miatt az iterációk ritkábban vadulnak meg.