FindRoot
-apusivulla sanotaan:
”oletusarvoisesti FindRoot käyttää Newtonin menetelmää (Newton-Raphson) epälineaarisen järjestelmän ratkaisemiseksi”
(tai luulen epälineaarinen yhtälö). Siitä huolimatta FindRoot
-komennossa on jotain piilotettua minulle. Harkitse funktiota
f[x]:=Exp[1 - x] - 1,
joiden Newton-iterointitoiminto on
Nf[x_]:=E^(-1 + x) (-1 + E^(1 - x)) + x
Toistetaan tällä funktiolla käyttämällä hankittua NestList
Newtonin menetelmällä tuotettujen arvojen järjestys. Newtonin menetelmä alkuperäisen arvauksen suurille arvoille tuo hitaan lähentymisen tähän ongelmaan. Kun otetaan $ x_0 = 10 $, saat:
NestList[Nf, 10., 8] (* {10., -8092.08, -8091.08, -8090.08, -8089.08, -8088.08, -8087.08, -8086.08, -8085.08} *)
josta voimme nähdä hidas lähentyminen. Funktion Nf[x]
käyrä auttaa ymmärtämään menetelmän käyttäytymistä. Mutta
Module[{s = 0, e = 0}, {FindRoot[f[x], {x, 10.}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}]
ottaminen tuottaa
{{x -> 1.}, "Steps" -> 7, "Evaluations" -> 11}
tarvitsee vain 7 vaihetta ratkaisun saamiseksi $ x = 1 $. Miksi FindRoot
tuottaa tämän tuloksen ?. Ilmeisesti FindRoot
ei käytä tavanomaista Newtonin menetelmää, eikö olekin? Voiko kukaan auttaa minua? Kiitos.
Kommentit
- Katso täältä ja täällä
vastaus
Oletuksena FindRoot
käyttää vaiheohjauksen "LineSearch"
-menetelmää opetusohjelmassa kuvatulla tavalla tutorial/UnconstrainedOptimizationLineSearchMethods
. Oletusasetukset ovat
FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> {"LineSearch", "CurvatureFactor" -> Automatic, "DecreaseFactor" -> 1/10000, "MaxRelativeStepSize" -> 10, Method -> Automatic}}]
Saadaksesi Newtonin menetelmän tarkalleen, älä käytä askelohjausta. FindRoot
rajoittaa edelleen askelen enimmäiskokoa (alla olevan tapauksen ensimmäinen vaihe katkaistaan muotoon 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: Yhdistäminen pyydettyyn tarkkuuteen tai tarkkuuteen 100 iteraation sisällä epäonnistui. >>
(* {{x -> -1.07713}, "Steps" -> 100, "Evaluations" -> 101} *)
Voit käyttää vaiheita ja arviointeja seuraamalla asetuksia
StepMonitor :> Print[{x}], EvaluationMonitor :> Print[x]
. Tai voit käytä FindRootPlot
"Optimization`UnconstrainedProblems`"
-paketissa. (Etsi tarkkaan keltaisia pisteitä, jotka merkitsevät arviointia, joka ei ole vaihe.)
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]
Kommentit
- Toisin sanoen:
FindRoot[]
käyttää Newton-Raphsonin vaimennettua versiota, sillä ilman vaimennusta lähtöarvojen huonot valinnat johtavat usein eroavaisuuksiin. Vaimennus tekee iteraatioista vähemmän todennäköisesti villejä.