ニュートン法
非線形方程式のためのニュートン法は線形近似に基づいている.
このため,ニュートン法のステップは単に
と設定することで求めることができる.
ニュートン法は,最小化のための「ニュートン」法と同様に,方程式の根付近で二次収束する.ニュートン法はFindRootのデフォルトのメソッドとして使われている.
ニュートン法は「直線探索法」や「信頼領域法」の刻み幅制御に用いることができる.うまくいくと,通常直線探索制御の方が速いが,信頼領域法によるアプローチの方が強力である.
いくつかのユーティリティ関数を含むパッケージをロードする.
次は
FindRoot問題としてのローゼンブロック(Rosenbrock)関数である.
| Out[2]= |  |
これはデフォルトの直線探索アプローチで非線形系の解を求める.ニュートン法は
FindRootのデフォルトのメソッドである.
| Out[3]= |  |
それぞれの直線探索が直線
に沿って始まっている点に注意のこと.これはこの問題に特有の,ニュートンステップ独特の特性である.
次で,ローゼンブロック関数のヤコビ行列とニュートンステップを記号的に計算する.
| Out[4]= |  |
このステップが点
に追加されると,ステップが直線
に動く理由が簡単に分かる.これはこの問題独特の特徴で,ほとんどの関数では見られないことである.「信頼領域法」はニュートンステップが区間の境界線より内側にないとこの方法を試さないので,信頼領域法による刻み幅制御が使われたときは,このような特徴はあまりはっきりとは現れない.
| Out[5]= |  |
ヤコビ行列の構造が疎である場合,Mathematica はヤコビ行列の計算にも,必要な数値線形代数の扱いにもSparseArrayオブジェクトを使う.
非線形方程式を解くことが,陰的メソッドで微分方程式を解くというような,より一般的な数値解法の一部になっているときは,初期値が極めてよいことが多く,完全収束が絶対に必要なわけではないことがある.ニュートンステップの計算で最も高く付く部分は,ヤコビ行列を求めて行列を因数分解する部分であることが多い.しかし,根に十分近ければ,確実に収束率に影響するが,ヤコビ行列を何ステップ分か凍結しておくことも可能である.Mathematica でこれを行うのには,ヤコビ行列を更新するまでに何ステップ必要かを指定するメソッドオプションの
を使う.デフォルトは
で,この場合,ヤコビ行列は1ステップごとに更新される.
次は,ヤコビ行列が3ステップごとにしか更新されないときに,単純な二乗根を求めるのに必要なステップ数,関数の評価回数,およびヤコビ行列の評価回数を示したものである.
| Out[6]= |  |
次は,ヤコビ行列が各ステップごとに更新されるときに,単純な二乗根を求めるのに必要なステップ数,関数の評価回数,およびヤコビ行列の評価回数を示したものである.
| Out[7]= |  |
もちろん,簡単な一次元の根を求めるためにヤコビ行列を更新する場合のコストはそれほど高くない.ここで更新が保存してあるのは例示の目的によるものである.
| | |
| "UpdateJacobian" | 1 | ヤコビ行列を更新するまでに必要なステップ数 |
| "StepControl" | "LineSearch" | 刻み幅制御のためのメソッド. , ,None(これは推奨しない)のいずれか |
FindRootにおけるMethod->"Newton"のメソッドオプション