数値計算法I 第3回 ニュートン法 2006年度 九州工業大学工学部電気電子工学コース用講義資料 講師:趙孟佑 [email protected] 1 代数方程式 • f(x)=0 を満足するxを探す f (x) an x an1x n n1 a2 x a1x a0 2 n個の解をもつが、n≥5については、数値計算するしか ない。 f (x) e x sinx 2 このような場合は、数値計算に頼るしかない •2分法 •ニュートン法 2 ニュートン法 • f(x)が連続であり、且つ微分が可能であれば、特 殊な場合を除いて必ず解が求まる。 •初期値x0を決める •x0での接線を求める •f(x0)から接線を引く •接線がx軸と交差する点をx1とする •x1での接線を求める f(x0) •f(xn)から接線を引く •接線がx軸と交差する点をxn+1とする •xn+1での接線を求める x0 x1 x2 x3 3 ニュートン法 初期値をx0とする。 点(x0,f(x0))での接線の方程式は、 y f (x0 )(x x0 ) f (x0 ) x軸と交差する点x1は 0 f (x0 )(x1 x0 ) f (x0 ) f (x0 )(x1 x0 ) f (x0 ) f (x0 ) (x1 x0 ) f (x0 ) f (x0 ) x1 x0 f (x0 ) 4 ニュートン法 i+1番目の値は、 f (xi ) xi1 xi f (xi ) 値が真値に近づいていくと、f(xi)≈0なので、 xi+1はxiに比べて殆ど変化しなくなる。 |xi+1-xi|≤eまたは|f(xi+1)|<eになるまで計算を繰り返す eは十分に小さな数(普通は自分で決める) e:収束判定指数 5 ニュートン法 長所 • 2分法に比べて収束が早い。 • 重解でも可 短所 • まず微分しないといけない。 • 初期値によっては解が求まらない。 – f’(xi)=0となるxiに行ってしまうと発散する。 6 2分法 長所 • 愚直な方法ではあるが、殆どの場合に解が求まる。 – 電卓でも実行可能 短所 • 収束が遅い • 偶数重解は求められない。 ○ × 7 ニュートン法 f(x)=x3-6x2+7x+2=0 Y = x^ 3-6*x^ 2+7*x+2 4 case1 x0=0 2 y 0 case2 x0=2.5 -2 case3 x0=4.0 -4 -2 -1 0 1 2 3 4 5 6 x 真値は 2 5, 2, 2 5 8 ニュートン法 • f(x)=x3-6x2+7x+2=0 • f’(x)=3x2-12x+7 • case1において、 回数 1 2 3 4 5 f(x) x 0.00000000 0.2000000E+01 -0.28571429 -0.5131195E+00 -0.23763999 -0.1573670E-01 -0.23606963 -0.1655032E-04 -0.23606798 -0.1837464E-10 9 ニュートン法 case2において、 回数 1 2 3 4 case3において 回数 1 2 3 4 5 x 2.50000000 1.94117647 2.00008159 2.00000000 x 4.00000000 4.28571429 4.23763999 4.23606963 4.23606798 f(x) -0.2375000E+01 0.2939141E+00 -0.4079302E-03 0.1085354E-11 f(x) -0.2000000E+01 0.5131195E+00 0.1573670E-01 0.1655032E-04 0.1838174E-10 10 ニュートン法 初期値を1とおくと、 回数 1 2 3 4 5 6 x 1.00000000 3.00000000 1.00000000 3.00000000 1.00000000 3.00000000 f(x) 0.4000000E+01 -0.4000000E+01 0.4000000E+01 -0.4000000E+01 0.4000000E+01 -0.4000000E+01 1と3の間を繰り返す。 11 ニュートン法(初期値への依存性) Y = x^ 3-6*x^ 2+7*x+2 4 2 y 0 -2 -4 -2 -1 0 1 2 3 4 5 6 x 初期値が1または3の時は赤線のループを繰り返し 12 ニュートン法(初期値への依存性) Y = x^ 3-6*x^ 2+7*x+2 4 2 y 0 -2 -4 -2 -1 0 1 2 3 4 5 6 x 5 初期値が 2 の時は、微係数がゼロなので、 3 x軸と交差しない。 13 ニュートン法の収束 f(x)=0の真値解をaとし、 f(xi)とf’(xi)をaのまわりでテーラー展開する。 (xi a)2 f (xi ) f (a) (xi a) f (a) f (a) 2 0 (xi a)2 f (xi ) f (a) (xi a) f (a) f (a) 2 i+1番目の誤差は f (xi ) xi1 a xi a f (xi ) 14 ニュートン法の収束 xi1 a xi f (xi ) a f (xi ) (xi a)2 (xi a) f (a) f (a) 2 xi a f (a) (xi a) f (a) (xi a) f (a) 2 xi a (xi a) f (a) (xi a) f (a) f (a) キャンセル (xi a) f (a) 2 f (a) xi a (xi a) (x a) f (a) 1 i f (a) 2次収束 (xi a) f (a) (xi a) 2 f (a) f (a) 誤差xi+1-aは前のステップの (xi a)2 2 f (a) 誤差xi-a の2乗に比例 1 15 ニュートン法の例 x2-cos(x)=0の解 回数 Y = x^ 2-cos(x) 2 1 2 3 4 5 6 1 y 0 -1 -2 -2 -1.5 -1 -0.5 0 x 0.5 1 1.5 x f(x) 0.50000000 -0.6275826E+00 0.92420693 0.2516907E+00 0.82910576 0.1188097E-01 0.82414613 0.3292121E-04 0.82413231 0.2558270E-09 0.82413231 0.1110223E-15 2 16 ニュートン法のソース c 計算を倍精度で実施 implicit real*8 (a-h,o-z) c 初期値の入力 write(6,*)' input x0' read(5,*)x0 c 繰り返し最大数 itermax=100 c 最小誤差 errlim=1.d-10 iter=0 xp=x0 c 繰り返しの開始 10 continue iter=iter+1 c 新しいx値の計算 xn=xp-f(xp)/fd(xp) c 出力 write(6,100)iter,xp,f(xp) c 収束判定 if(dabs(f(xp)).lt.errlim)goto 30 if(iter.gt.itermax)goto 30 c x値の更新 xp=xn goto 10 30 continue c 回数、x値、f(x)の順で出力 c 整数は2桁を出力、実数は小数点以下8桁と小数点以下7桁の c 回数で表示 100 format(i5,f19.8,e15.7) stop end c f(x)を計算する関数サブルーチン function f(x) implicit real*8 (a-h,o-z) f=x*x*x-6*x*x+7*x+2 return end c f'(x)を計算する関数サブルーチン function fd(x) implicit real*8 (a-h,o-z) fd=3*x*x-12*x+7 return end 17
© Copyright 2024 ExpyDoc