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] 

Mathematicaグラフィックス

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

Mathematicaグラフィックス

コメント

  • 別の言い方をすれば、 FindRoot[]はニュートンラプソンの減衰バージョンを使用しています。減衰がないと、開始値の選択を誤ると発散が発生することがよくあります。ダンピングにより、反復がワイルドになる可能性が低くなります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です