FindRoot
のヘルプページには次のように書かれています。
“デフォルトでは、FindRootはニュートン法(Newton-Raphson)を使用して非線形システムを解きます”
(または私が推測する非線形方程式)。それにもかかわらず、FindRoot
コマンドには何かが隠されています。関数
f[x]:=Exp[1 - x] - 1,
ニュートン反復関数は
Nf[x_]:=E^(-1 + x) (-1 + E^(1 - x)) + x
NestList
を使用してこの関数で反復します。ニュートン法によって生成された値のシーケンス。初期推定値が大きい場合のニュートン法では、この問題の収束が遅くなります。$ x_0 = 10 $を取ると、次のようになります。
NestList[Nf, 10., 8] (* {10., -8092.08, -8091.08, -8090.08, -8089.08, -8088.08, -8087.08, -8086.08, -8085.08} *)
収束が遅い。関数Nf[x]
のプロットは、メソッドの動作を理解するのに役立ちます。ただし、
Module[{s = 0, e = 0}, {FindRoot[f[x], {x, 10.}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}]
生成
{{x -> 1.}, "Steps" -> 7, "Evaluations" -> 11}
ソリューションを取得するために必要な手順は7つだけです$ x = 1 $。 FindRoot
がこの結果を生成するのはなぜですか?明らかに、FindRoot
は標準のニュートン法を使用していませんね。誰か助けてもらえますか?ありがとう。
コメント
- こちらとここ
回答
デフォルトではFindRoot
は、チュートリアル tutorial/UnconstrainedOptimizationLineSearchMethods
<で説明されているように、ステップ制御の“LineSearch”
メソッドを使用します。 / div> 。デフォルト設定は次のとおりです。
FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> {"LineSearch", "CurvatureFactor" -> Automatic, "DecreaseFactor" -> 1/10000, "MaxRelativeStepSize" -> 10, Method -> Automatic}}]
ニュートン法をほぼ正確に取得するには、ステップ制御を使用しません。ただし、FindRoot
は引き続き最大ステップサイズを制限します(以下の場合の最初のステップは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回の反復内で要求された精度または精度に収束できませんでした。>>
(* {{x -> -1.07713}, "Steps" -> 100, "Evaluations" -> 101} *)
オプションを使用して
StepMonitor :> Print[{x}], EvaluationMonitor :> Print[x]
手順と評価を監視できます。または、次のことができます。 "Optimization`UnconstrainedProblems`"
パッケージのFindRootPlot
を使用します(ステップではない評価を示す黄色の点を注意深く探してください)。
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]
コメント
- 別の言い方をすれば、
FindRoot[]
はニュートンラプソンの減衰バージョンを使用しています。減衰がないと、開始値の選択を誤ると発散が発生することがよくあります。ダンピングにより、反復がワイルドになる可能性が低くなります。