Transcript 4.非線型方程式
4.非線型方程式 コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。 1642/12/25 - 1727/3/20 Sir Isaac Newton 非線型方程式の種類 ①代数方程式 f ( x) a0 xn a1xn1 an1x an 0 ②超越方程式(sin関数や指数関数など超越関数を含む方程式) f ( x) x cos x 0 注意 ①複素数の範囲内では, 代数方程式の解の個数は,分かっているが, 超越方程式の解の個数は,一般的には分からない。 ②いずれの方程式を解くにしても, あらかじめ概略のグラフを描く等の手段により, 解の存在と,どの範囲に解があるかを 確認しておく必要がある。 4.1 実根(複素数は含めない)の求め方 (1)繰返し法 解くべき方程式 f ( x) 0 を x g (x) と置き換えることができるとき xk 1 g ( xk ) とし,適当な解の予測値 繰返し演算を行う。 x0 を与えて, 繰返し法の例題 [例] 2 x 1 2 f ( x) x 4 x 1 0 x g ( x) 4 x0 0 0 1 0.25 4 0.252 1 x2 0.265625 4 x1 解 2 3 0.267949 に急速に近づく 厳密解との比較のための式定義 繰返し法を Excel で式定義して様子を眺めよう 2次方程式の 根の公式による解 x2 1 x g ( x) 4 繰返し法での収束の様子 グラフを描いて確かめよう 課題(1) 下記の方程式を繰返し法を用いて, Excelで定義し, 収斂の様子をグラフで確かめること f ( x) 2 x 2 3x 1 0 x j 2 x 2j 1 1 3 交点における g(x) の傾きが1より大きい場合 繰返し法では,ほとんど収束しない 収束しない例 f ( x) 4 x 2 x 1 0 x g ( x) 4 x 2 1 1 17 x 8 解決策 交点の傾きが 1 より小さくなるような等価な方程式に変換する。たとえば, 1 x 2( x 1) とおけば, 4 1 f ( x) 4 x x 1 1 2 4( x 1) 2( x 1) 2 4 2( x 1) 4( x 1) 2 4 x2 10x 2 0 2 2 4( x 1) 4( x 1) 2 x 2 5 x 1 0 2 x 2 1 x g ( x) 5 1 とすればよい。 x を求めて, x 2( x 1) 解決策 [確認] 1 x 2( x 1) とおいて x を求めて元に戻す。 課題(2) ① 下記の方程式が繰返し法では収斂しないことを確認せよ。 ② また,どのようにすれば収斂するかを検討せよ。 ③ 収斂する方法をExcelで定義して提出せよ。 f ( x) 6x 2 2x 1 0 VBAでのプログラム Function 漸化式(X) As Double 漸化式 = (X * X + 1) / 2 ' この部分に漸化式を書く End Function Function 繰返し法(E, iter, EPS, iterMax) As Double iter = 0: X1 = 0: E = EPS * 100 Do While E > EPS And iter < iterMax iter = iter + 1 X2 = 漸化式(X1) E = Abs(X2 - X1) X1 = X2 Loop 繰返し法 = X2 End Function Sub ボタン1_Click() R = 繰返し法(E, iter, 0.0000001, 5000) MsgBox " 繰返し回数 = " & iter & _ " 結果 = " & Format(R, "#0.0000") & " 誤差 = " & E End Sub (2)区間縮小法 区間 x1 , x2 の間に解が一つだけあることが分かっていれば, f (x) は,x1 と x2 の間で符号を変える。すなわち f ( x1 ) f ( x2 ) 0 もし, f ( x1 ) 0 ならば ここで,中点 f ( x2 ) 0 x x1 x2 2 である。 における関数値の正負によって区間を 縮小できる。すなわち f ( x) 0 f ( x) 0 x1, x x, x2 例題とする関数 [例] f ( x) x 2 x 2 0 の場合 Excel式定義で確かめてみよう(1) f ( x) x 2 x 2 0 の場合 区間縮小法の式定義 式が変わればここを変更 Excel式定義で確かめてみよう(2) 区間縮小法の収束の様子 VBAでのプログラム Function F(X) As Double F = X * X - X - 2 ' ここに解くべき関数を書く End Function Function 区間縮小法(E, iter, EPS, iterMax) As Double iter = 0: X1 = 1: X2 = 4: E = EPS * 100 Do While E > EPS And iter < iterMax iter = iter + 1: X = (X1 + X2) / 2: Y = F(X) If Abs(Y) < EPS Then: Exit Do ElseIf Y > 0 Then: X2 = X Else: X1 = X End If E = Abs(X2 - X1) Loop E = Abs(Y): 区間縮小法 = X End Function Sub ボタン4_Click() R = 区間縮小法(E, iter, 0.000001, 500) MsgBox " 繰返し回数 = " & iter & " 結果 = " & _ Format(R, "#0.0000") & " 誤差 = " & E End Sub 課題(3) 下記の方程式を区間縮小法を用いて, Excelで定義し, 収斂の様子をグラフで確かめること f ( x) x cos x 0 (3)ニュートン・ラプソン(Newton-Raphson)法 (ニュートン・ラフソン法と呼ぶ人もいるが?…ニュートン・ラプソン法が多勢) 近似値 x1 として,真の解との誤差を h とすると f ( x1 h) 0 左辺をテーラ展開して,1次の項までとれば f ( x1 h) f ( x1 ) f ( x1 )h 0 h f ( x1 ) したがって, x2 x1 f ( x1 ) f ( x1 ) f ( x1 ) は,より高い精度の近似値となる。 これを繰り返して,解に収束させていく。 y y f (x) xk 2 xk 1 xk x ニュートン・ラプソン法の式定義 Excel式定義で確かめてみよう(1) f ( x) x 2 x 2 0 の場合 式が変わればここを変更 ニュートンラプソン法の収束の様子 Excel式定義で確かめてみよう(2) 課題(4) 下記の方程式をニュートンラプソン法を用いて, Excelで定義し, 収斂の様子をグラフで確かめること f ( x) 2x2 3x 1 0 Function F(X) As Double F = X * X - X - 2 ' ここに解くべき関数を書く End Function Function DF(X) As Double DF = 2*X - 1 ‘ ここに微分式を書く End Function Function ニュートンラプソン法(E, iter, EPS, iterMax) ' X^2 - X - 2 = 0を解く iter = 0: X = 1: E = EPS * 100 Do While iter < iterMax iter = iter + 1 Y = F(X): If Abs(Y) < EPS Then Exit Do X = X - Y / DF(X) Loop E = Abs(Y): ニュートンラプソン法 = X End Function Sub ボタン5_Click() R = ニュートンラプソン法(E, iter, 0.00001, 500) MsgBox " 繰返し回数 = " & iter & " 結果 = " & _ Format(R, "#0.0000") & " 誤差 = " & E End Sub (4)セカント(secant)法 (secantとは,「割線」,「交差する」等の意味) 導関数を求めることができない場合,解の近似値を2個用意し, 2点を結ぶ直線とX軸との交点を新たな近似値とする方法。すなわち, f ( x1 ) f ( x2 ) y ( x3 x2 ) f ( x2 ) 0 x1 x2 x1 x2 x3 x2 f ( x2 ) f ( x1 ) f ( x2 ) これを繰り返すことで解に収束させる。 曲線に交差する割線 y f (x) y x xk 2 xk 1 xk セカント(secant)法 k 回目の式は以下のように表すことができる。 xk 1 xk xk 1 xk f ( xk ) f ( xk 1 ) f ( xk ) (セカント法の弱点) 初期値を2個与える必要があるので, 多変数への拡張が困難である。 曲線に交差する割線 y y f (x) x xk 2 xk 1 xk ニュートンラプソン法との比較 微分値の替わりに 割線を用いていると捉えてよい。 y y f (x) y y f (x) x xk 2 xk 1 xk x xk 2 xk 1 xk セカント法の式定義 Excel式定義で確かめてみよう(1) f ( x) x 2 x 2 0 の場合 式が変わればここを変更 セカント法による収斂 課題(5) 下記の方程式をセカント法を用いて, Excelで定義し, 収斂の様子をグラフで確かめること f ( x) 2x2 3x 1 0 VBAでのプログラム(関数F(X)はニュートンラプソンと共通) Function セカント法(E, iter, EPS, iterMax) EPS = 0.00001: iter = 0: iterMax = 500 X1 = 1: X2 = 4: E = EPS * 100 Y1 = F(X1) ' X1に関する式を書く Do While E > EPS And iter < iterMax iter = iter + 1 Y2 = F(X2) ' X2に関する式を書く Y = (Y1 + Y2) / 2 If Abs(Y) < EPS Then Exit Do X = X2 - Y2 * (X1 - X2) / (Y1 - Y2) X1 = X2: X2 = X: Y1 = Y2 '前回式の保存 Loop E = Abs(Y): セカント法 = X End Function Sub ボタン6_Click() R = セカント法(E, iter, 0.00001, 500) MsgBox " 繰返し回数 = " & iter & " 結果 = " & _ Format(R, "#0.0000") & " 誤差 = " & E End Sub 課題(6) サンプルVBAプログラムを用いて 以下の方法による収斂回数を比較せよ。 ① 繰返し法 ② 区間縮小法 ③ ニュートンラプソン法 ④ セカント法 f ( x) x cos x 0