newton1

非線形方程式の数値解法 〜ニュートン法〜
荻田 武史
目的
•  非線形方程式 f(x) = 0 の解を数値計算で求める。 (例) f(x) = x2 -­‐ 4 であれば、x=-­‐2, 2のとき f(x) = 0 f(x)は、多項式から三角関数、指数関数などを含んで良い。 •  数値計算によって、厳密に f(x*) = 0 を満たす真の解 x*を
求めることは難しいが、x*に近い値(近似解)を求めること
は可能。 •  本講義では、非線形方程式の反復解法であるニュートン
法によって、f(x) = 0 の近似解を求める方法を学習し、その
アルゴリズムを理解した上で、プログラミングを行う。
インライン関数を定義する方法
<例> f(x) = cos x -­‐ x2 の場合 >> f=inline('cos(x) -­‐ x^2') f = Inline func8on: f(x) = cos(x) -­‐ x^2 >> f(0) ans = 1 >> ezplot(f,[-­‐1,1]) ← f(x)のグラフを -­‐1 ≦ x ≦ 1の 範囲で見る。
練習問題
以下をインライン関数で定義して、グラフを描いてみよ
う(xの範囲も適当に変更してみよう)。 (1) f(x) = x2 - 2
(2) f(x) = x2 - 3x + 2
(3) f(x) = x - sin x ! 2π $
(4)
f (x) = sin #
x &
" 1+ e %
反復解法について
・f(x) = 0 について、x0を初期値として与えた後、決めら
れた手順を繰り返して(反復)、x1 , x2 , … , xn と真の解x*
へ近づける(収束)。 ・反復の停止条件: f(xn)が、ある程度0に近づいたら 反復を止めることにする。 f (xn ) ≤ ε
ε:十分に小さい正の数(たとえば、10-­‐6など。プログラ
ムでは、1e-­‐6 のように書く) ニュートン法
•  連続で1回微分可能な関数 y = f(x) を考える。 •  ある点xnでの導関数f’(xn)が与えられるとき、 (xn,f(xn))を通り、傾きがf'(xn)の直線方程式は y = f '(xn )(x − xn ) + f (xn )
•  これをf(x)の近似解とみなすと、f(x) = 0の近似解は y = 0 のとき(x軸との交点)なので
f (xn )
xn+1 = xn −
f '(xn )
ニュートン法(つづき)
•  このように、1次式で近似することを繰り返し、 •  以下を満たすまで行う。 f (xn ) ≤ ε
x1, x2, x3と反復する毎に
真の解x*に近づいていく
x*
初期値
【実習】ニュートン法のプログラム
•  プログラム作成のポイント –  関数f(x)と導関数f'(x)をインライン関数で定義する。 (f'(x)は手計算で求める) –  初期値x0を引数として与える。 –  for文で反復を行う。 (収束しない場合もあるので、反復回数に上限を設ける) –  以下の反復条件を満たしたら、反復をbreakで止
めて、解を出力する。
f (xn ) ≤ ε
ニュートン法のプログラム
func8on [x,k] = mynewton1(f,fd,x0) eps1 = 1e-­‐6; % 許容誤差 kmax = 50; % 最大反復回数 x = x0; % xの初期値 for k=1:kmax fv = f(x); fg = fd(x); if abs(fv) < eps1 ← 反復停止条件
break; end if (abs(fg) <= eps * abs(fv)) ←割る数が0でないか(小さ過ぎないか)チェック
break; end d = fv / fg; x = x -­‐ d; ← xを更新
end
演習問題
•  以下の問題について、作成したニュートン法
で解いてみよう。 (1) f(x) = x2 - 2
(2) f(x) = x2 - 3x + 2
(3) f(x) = x - sin x
! 2π $
(4)f (x) = sin #
x &
" 1+ e %
入力する初期値を色々
変えてみて、収束速度を
調べてみよう