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

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] 

Mathematica-grafiikka

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

Mathematica-grafiikka

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ä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *