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

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] 

Mathematica grafika

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

Mathematica grafika

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük