非線形システムを解くためのニュートン法
📂数値解析非線形システムを解くためのニュートン法
メソッド
f(x):=f1(x)⋮fN(x)のような多変数関数 f:RN→RNが f∈C2(N(α))であり、f(α)=0、[Df(α)]−1が存在するとしよう。αに十分近い初期値x0に対して、
xn+1:=xn−[Df(xn)]−1f(xn)
のように定義された数列{xn}は、n→∞の時、αに対してクアドラティックに収束する。
- f∈C2(N(α))とは、αの近傍でfが2回微分可能で連続であることを意味する。
- Dfはfのヤコビアンを示している。
説明
モチーフ
{x+cos(x−y)=0−y+sin(x+y)=0
例えば、上のような問題があるとする。リニアシステムなら、線形代数のツールを使用して比較的簡単に解を出すことができるが、ノンリニアの場合はこのように二つの変数が混在していて解が難しい。しかし、ニュートンメソッドは数値的ではあるが、うまく解いてくれる。
ニュートン-ラフソンメソッドの一般化
ニュートン-ラフソンメソッドは、その速度が非常に速いだけではなく、ノンリニアシステム
⎩⎨⎧f1(x1,⋯,xN)=0⋮fN(x1,⋯,xN)=0
を解くことができる汎用性も持っている。しかも、導出と証明も1次元からただ多次元に一般化するだけで、基本的な骨組みは同じだ。特にf:R→Rとすると[Df(xn)]−1=f′(xn)1になることを自然に理解できる。これは、ヤコビアンがベクトル関数の微分係数と同じ役割をするからだ。
要約すると、理解しやすくて速く、解くことのできる問題が多いので、非常に優れたメソッドだ。ニュートンメソッドを使いこなせば、ほとんどの分野で方程式を解く最良のツールを持っていると言ってもいい。
実装
以下は、Rコードでニュートンメソッドを実装したもので、ヤコビアンを求めるために numDeriv
パッケージを使用している。
library(numDeriv)
Newton<-function(f,x0,tol=10^(-8)){
while(sqrt(sum(f(x0)^2))>tol){
x0 <- x0 - solve(jacobian(f,x0)) %*% f(x0)
}
return(c(x0))
}
f<-function(v){c(
v[1]+cos(v[1]-v[2]),
-v[2]+sin(v[1]+v[2])
)}
Newton(f,c(1,1))
f(c(-0.9980201,-0.9350821))
初期値(x0,y0)=(1,1)でコードを実行すると、{x+cos(x−y)=0−y+sin(x+y)=0の近似解である(−0.9980201⋯,−0.9350821⋯)を求めることができることがわかる。
参照