ミューラー法
📂数値解析 ミューラー法 メソッド f ( α ) = 0 f (\alpha) = 0 f ( α ) = 0 としよう。初期値 x 0 , x 1 , x 2 x_{0} , x_{1} , x_{2} x 0 , x 1 , x 2 と
w n : = f [ x n , x n − 1 ] + f [ x n , x n − 2 ] − f [ x n − 2 , x n − 1 ]
w_{n} := f [x_{n} , x_{n-1} ] + f [ x_{n} , x_{n-2} ] - f [ x_{n-2} , x_{n-1} ]
w n := f [ x n , x n − 1 ] + f [ x n , x n − 2 ] − f [ x n − 2 , x n − 1 ]
によって、
x n + 1 : = x n − 2 f ( x n ) w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ]
x_{n+1} : = x_{n} - {{ 2 f ( x_{n} ) } \over { w_{n} \pm \sqrt{ w_{n}^{2} - 4 f (x_{n} ) f [ x_{n} , x_{n-1} , x_{n-2} ] } }}
x n + 1 := x n − w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ] 2 f ( x n )
のように定義された数列 { x n } \left\{ x_{n} \right\} { x n } は n → ∞ n \to \infty n → ∞ の時、α \alpha α に p ≈ 1.84 p \approx 1.84 p ≈ 1.84 次で収束する。
ただし、( w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ] ) ∈ C \left( w_{n} \pm \sqrt{ w_{n}^{2} - 4 f (x_{n} ) f [ x_{n} , x_{n-1} , x_{n-2} ] } \right) \in \mathbb{C} ( w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ] ) ∈ C は + + + と − - − の大きい方を選ぶ。 複素数の絶対値 は ∣ x + i y ∣ : = x 2 + y 2 |x + iy| := \sqrt{ x^2 + y^2} ∣ x + i y ∣ := x 2 + y 2 のように計算される。説明 ミュラーメソッドはセカントメソッド の応用と見ることができるが、まだニュートン-ラプソンメソッド より遅いが、複素数の解を見つけることができる特徴がある。微分や符号を使った解法ではなく、根の公式を使って解くため、幾何学的な意味にこだわる必要はなく、複素数をカバーする。
例 与えられた( x i , f ( x i ) ) i = n − 1 n + 1 \left( x_{i} , f (x_{i}) \right)_{i = n-1}^{n+1} ( x i , f ( x i ) ) i = n − 1 n + 1 に対して、二次多項式
p 2 ( x ) = f ( x n + 1 ) + ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n + 1 ) ( x − x n ) f [ x n + 1 , x n , x n − 1 ]
p_{2} (x) = f(x_{n+1} ) + (x - x_{n+1} ) f [ x_{n+1} , x_{n} ] + ( x - x_{n+1} ) ( x - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ]
p 2 ( x ) = f ( x n + 1 ) + ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n + 1 ) ( x − x n ) f [ x n + 1 , x n , x n − 1 ]
は一意に存在し、p ( x i ) = f ( x i ) p ( x_{i} ) = f(x_{i} ) p ( x i ) = f ( x i ) をよく満たしている。これを ( x − x n + 1 ) (x - x_{n+1}) ( x − x n + 1 ) に対する二次方程式に変えてみよう。
f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] x n + 1 − x n ⟹ ( x n + 1 − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] ⟹ ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] ⟹ f [ x n + 1 , x n ] + ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n ] + f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] ⟹ f [ x n + 1 , x n ] + ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = w n + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] ⟹ ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n ) ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] = w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
\begin{align*}
& f [ x_{n+1} , x_{n} , x_{n-1} ] = { { f [x_{n+1} , x_{n-1} ] - f [ x_{n-1} , x_{n} ] } \over { x_{n+1} - x_{n} }}
\\ \implies& ( x_{n+1} - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ] \\ & = f [x_{n+1} , x_{n-1} ] - f [ x_{n-1} , x_{n} ]
\\ \implies& ( x - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ] \\ & = f [x_{n+1} , x_{n-1} ] - f [ x_{n-1} , x_{n} ] + ( x - x_{n+1} ) f [ x_{n+1} , x_{n} , x_{n-1} ]
\\ \implies& f [x_{n+1} , x_{n} ] + ( x - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ] \\ & = f [x_{n+1} , x_{n} ] + f [x_{n+1} , x_{n-1} ] - f [ x_{n-1} , x_{n} ] + ( x - x_{n+1} ) f [ x_{n+1} , x_{n} , x_{n-1} ]
\\ \implies& f [x_{n+1} , x_{n} ] + ( x - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ] \\ & = w_{n} + ( x - x_{n+1} ) f [ x_{n+1} , x_{n} , x_{n-1} ]
\\ \implies& ( x - x_{n+1} ) f [x_{n+1} , x_{n} ] + ( x - x_{n} ) ( x - x_{n+1} ) f [ x_{n+1} , x_{n} , x_{n-1} ] \\ & = w_{n} ( x - x_{n+1} ) + ( x - x_{n+1} )^2 f [ x_{n+1} , x_{n} , x_{n-1} ]
\end{align*}
⟹ ⟹ ⟹ ⟹ ⟹ f [ x n + 1 , x n , x n − 1 ] = x n + 1 − x n f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] ( x n + 1 − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] f [ x n + 1 , x n ] + ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = f [ x n + 1 , x n ] + f [ x n + 1 , x n − 1 ] − f [ x n − 1 , x n ] + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] f [ x n + 1 , x n ] + ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = w n + ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n ) ( x − x n + 1 ) f [ x n + 1 , x n , x n − 1 ] = w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
従って、
p 2 ( x ) = f ( x n + 1 ) + ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n + 1 ) ( x − x n ) f [ x n + 1 , x n , x n − 1 ] = f ( x n + 1 ) + w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
\begin{align*}
p_{2} (x) =& f(x_{n+1} ) + (x - x_{n+1} ) f [ x_{n+1} , x_{n} ] + ( x - x_{n+1} ) ( x - x_{n} ) f [ x_{n+1} , x_{n} , x_{n-1} ]
\\ =& f(x_{n+1} ) + w_{n} (x - x_{n+1} ) + ( x - x_{n+1} )^2 f [ x_{n+1} , x_{n} , x_{n-1} ]
\end{align*}
p 2 ( x ) = = f ( x n + 1 ) + ( x − x n + 1 ) f [ x n + 1 , x n ] + ( x − x n + 1 ) ( x − x n ) f [ x n + 1 , x n , x n − 1 ] f ( x n + 1 ) + w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
x = x n + 1 x = x_{n+1} x = x n + 1 を代入すると、p 2 ( x n + 1 ) = f ( x n + 1 ) + 0 + 0 p_{2} (x_{n+1}) = f(x_{n+1}) + 0 + 0 p 2 ( x n + 1 ) = f ( x n + 1 ) + 0 + 0 となるため、p 2 ( x ) = 0 p_{2} (x) = 0 p 2 ( x ) = 0 となる ( x − x n + 1 ) (x - x_{n+1}) ( x − x n + 1 ) を見つければ、結局 f ( x n + 1 ) = 0 f(x_{n+1} ) = 0 f ( x n + 1 ) = 0 を見つけるのと同じだ。元々見つけたいものが lim n → ∞ f ( x n ) = 0 \displaystyle \lim_{n \to \infty} f ( x_{n} ) = 0 n → ∞ lim f ( x n ) = 0 を満たす x n x_{n} x n だったので、
p 2 ( x ) = f ( x n + 1 ) + w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
p_{2} (x) = f(x_{n+1} ) + w_{n} (x - x_{n+1} ) + ( x - x_{n+1} )^2 f [ x_{n+1} , x_{n} , x_{n-1} ]
p 2 ( x ) = f ( x n + 1 ) + w n ( x − x n + 1 ) + ( x − x n + 1 ) 2 f [ x n + 1 , x n , x n − 1 ]
における ( x − x 2 ) (x - x_{2}) ( x − x 2 ) に根の公式 を使えばいい。根の公式で
x n + 1 − x n = − w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ] 2 f [ x 2 , x 1 , x 0 ]
x_{n+1} - x_{n} = {{ - w_{n} \pm \sqrt{ w_{n}^{2} - 4 f (x_{n} ) f [ x_{n} , x_{n-1} , x_{n-2} ] } } \over { 2 f [ x_{2} , x_{1} , x_{0} ] }}
x n + 1 − x n = 2 f [ x 2 , x 1 , x 0 ] − w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ]
を得て、実際の計算はコンピュータが行うため、有効数字などの問題で逆有理化を逆に使って
x n + 1 = x n − 2 f ( x n ) w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ]
x_{n+1} = x_{n} - {{ 2 f ( x_{n} ) } \over { w_{n} \pm \sqrt{ w_{n}^{2} - 4 f (x_{n} ) f [ x_{n} , x_{n-1} , x_{n-2} ] } }}
x n + 1 = x n − w n ± w n 2 − 4 f ( x n ) f [ x n , x n − 1 , x n − 2 ] 2 f ( x n )
を公式として使う。
一方で、f ′ f ' f ′ が必ず存在する必要はないが、f ’ ( α ) ≠ 0 f’ ( \alpha ) \ne 0 f ’ ( α ) = 0 ならば、n → ∞ n \to \infty n → ∞ の時、w n → f ′ ( α ) w_{n} \to f ' ( \alpha ) w n → f ′ ( α ) であるため、微分係数を見つける用途で使うこともできる。
実装 以下はミュラーメソッドをRで実装したものである。理論上は3点 ( x 0 , x 1 , x 2 ) (x_{0} , x_{1} , x_{2}) ( x 0 , x 1 , x 2 ) を持って始めるが、実際には x 0 , x 1 x_{0} , x_{1} x 0 , x 1 だけでも x 2 : = x 0 + x 1 2 \displaystyle x_{2} := {{x_{0} + x_{1}} \over {2}} x 2 := 2 x 0 + x 1 を決定できるので、2つの初期値だけを受け取って使う。この時、( x 0 , x 1 ) (x_{0} , x_{1}) ( x 0 , x 1 ) が実際に実数であっても、データ型は複素数 でなければならない。
dd<- function ( f, X) {
if ( length ( X) == 1 ) { return ( f( X) ) }
temp<- numeric( 0 )
for ( i in 1 : length ( X) ) { temp[ i] <- prod ( X[ i] - X[ - i] ) }
return ( sum ( f( X) / temp) )
}
Muller<- function ( f, x0, x1)
{
x2<- ( x0+ x1) / 2
while ( Mod ( f( x2) ) > 10 ^ ( - 3 ) ) {
w = dd( f, c ( x2, x1) ) + dd( f, c ( x2, x0) ) - dd( f, c ( x0, x1) )
p = w + sqrt ( w^ 2 - 4 * f( x2) * dd( f, c ( x2, x1, x0) ) )
m = w - sqrt ( w^ 2 - 4 * f( x2) * dd( f, c ( x2, x1, x0) ) )
if ( Mod ( p) > Mod ( m) ) { w<- p} else { w<- m}
x0<- x1
x1<- x2
x2 <- ( x2 - ( ( 2 * f( x2) ) / w) )
}
return ( x2)
}
f<- function ( x) { x^ 2 + 9 }
Muller( f, - 6 + 0i , - 5 + 0i )
g<- function ( x) { x^ 2 + x + 1 }
Muller( g, - 1i , - 2 + 0i )
以下は上記のコードを実行した結果である。f ( x ) = x 2 + 9 = f(x) = x^2 + 9 = f ( x ) = x 2 + 9 = の虚根の一つであるx = − 3 i x = -3 i x = − 3 i と、g ( x ) = x 2 + x + 1 = 0 g(x) = x^2 + x + 1 = 0 g ( x ) = x 2 + x + 1 = 0 の複素根の一つであるx = − 1 + 3 i 2 \displaystyle x = - {{1 + \sqrt{3} i } \over {2}} x = − 2 1 + 3 i をよく見つけ出したことが確認できる。