. Cプログラミング (2014) . 第7回 − 方程式の解:Newton 法 − 松田七美男 2014 年 11 月 13 日 . 方程式 f (x) = 0 の解法 解析的な公式がない場合反復法のような近似計算 で求める他ない . 反復解法 . 初期値 x0 を設定し,x1 , x2 , · · · を関係式 xk+1 = g(xk ) (k = 0, 1, 2, · · · ) により,逐次計算する方法. . . 方程式 f (x) = 0 の解法 解析的な公式がない場合反復法のような近似計算 で求める他ない . 反復解法 . 初期値 x0 を設定し,x1 , x2 , · · · を関係式 xk+1 = g(xk ) (k = 0, 1, 2, · · · ) により,逐次計算する方法. . 2 分法,はさみうち法,Newton 法 . 収束判定 ある微小な値 ε > 0 を設定して,例えば以下のよ うな条件を満たしたときに収束したとみなして, 計算を打ちきる. . 収束判定条件の例 . |xk+1 − xk | < ε . |xk+1 − xk | < ε|xk | |f (xk+1 )| < ε . 収束判定 ある微小な値 ε > 0 を設定して,例えば以下のよ うな条件を満たしたときに収束したとみなして, 計算を打ちきる. . 収束判定条件の例 . |xk+1 − xk | < ε . |xk+1 − xk | < ε|xk | |f (xk+1 )| < ε ☞上記の条件を満たさない場合に備えて,反復回 数の上限を定めておくことも必要 . ニュートン法:概要 y = f(x) f (xk) xk+2 xk+1 xk f (xk) f ’(xk) = x - x k k+1 . ニュートン法:概要 y = f(x) f (xk) xk+2 xk+1 xk f (xk) f ’(xk) = x - x k k+1 . ニュートン法:概要 y = f(x) f (xk) xk+2 xk+1 xk f (xk) f ’(xk) = x - x k k+1 . . xk+1 = xk − f (xk ) f (xk ) (k = 0, 1, · · · ) . ニュートン法:概要 y = f(x) f (xk) f (xk+1) xk+2 xk+1 xk f (xk) f ’(xk) = x - x k k+1 . . xk+1 = xk − f (xk ) f (xk ) (k = 0, 1, · · · ) . ニュートン法:概要 y = f(x) f (xk) f (xk+1) xk+2 xk+1 f (xk+1) f ’(xk+1) = x - x k+1 k+2 xk . . xk+1 = xk − f (xk ) f (xk ) (k = 0, 1, · · · ) . ニュートン法:概要 y = f(x) f (xk) xk+2 xk+1 xk f (xk) f ’(xk) = x - x k k+1 . . xk+1 = xk − f (xk ) f (xk ) (k = 0, 1, · · · ) . ニュートン法:原理 xk+1 − xk = h 1 とおいて,点 xk で Taylor 展開 し h の 2 次以上の項を無視すれば, 0 f (xk+1 ) = f (xk + h) f (xk ) + f (xk )h = f (xk ) + f (xk )(xk+1 − xk ) f (xk ) ∴ xk+1 = xk − f (xk ) . ニュートン法:アルゴリズム for (i = 0; i < N; i++) { dx = -f(x)/df(x); x += dx; if (fabs(dx) <= eps) { printf("x = %.12e", x); } printf("Can’t solve\n"); . . ニュートン法:アルゴリズム N:繰り返しの上限 for (i = 0; i < N; i++) { dx = -f(x)/df(x); x += dx; if (fabs(dx) <= eps) { printf("x = %.12e", x); } printf("Can’t solve\n"); . . ニュートン法:アルゴリズム N:繰り返しの上限 for (i = 0; i < N; i++) { dx = -f(x)/df(x); df(x):微分値を返す関数 x += dx; if (fabs(dx) <= eps) { printf("x = %.12e", x); } printf("Can’t solve\n"); . . ニュートン法:アルゴリズム N:繰り返しの上限 for (i = 0; i < N; i++) { dx = -f(x)/df(x); df(x):微分値を返す関数 x += dx; if (fabs(dx) <= eps) { 打ち切りの判定 printf("x = %.12e", x); } printf("Can’t solve\n"); . . ニュートン法:アルゴリズム N:繰り返しの上限 for (i = 0; i < N; i++) { dx = -f(x)/df(x); df(x):微分値を返す関数 x += dx; if (fabs(dx) <= eps) { 打ち切りの判定 printf("x = %.12e", x); 成功:結果の表示 } printf("Can’t solve\n"); . . ニュートン法:アルゴリズム N:繰り返しの上限 for (i = 0; i < N; i++) { dx = -f(x)/df(x); df(x):微分値を返す関数 x += dx; if (fabs(dx) <= eps) { 打ち切りの判定 printf("x = %.12e", x); 成功:結果の表示 } printf("Can’t solve\n"); 失敗の旨の表示 . . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 y 0.2 π 4 0 − π 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . ニュートン法:初期値の適正範囲 0.4 f (x) = 1 tan(x) − x 2 0.2 y Newton 法は初期値に敏感 π 4 0 π − 4 -0.2 -0.4 -1.5 -1 -0.5 0 x . 0.5 1 1.5 . 数値微分 Newton 法の改善 . 数値微分 Newton 法の改善 . 初期値に敏感 ⇒ 人間が判断するしかない? 1 . 数値微分 Newton 法の改善 . 初期値に敏感 ⇒ 人間が判断するしかない? 2. f (x) の導関数を式で与えるのは面倒 ⇒ 数値微分 1 例えば,次の近似式を用いる. . f (x + ∆x) − f (x) f (x) ∆x . (1) . 数値微分 Newton 法の改善 . 初期値に敏感 ⇒ 人間が判断するしかない? 2. f (x) の導関数を式で与えるのは面倒 ⇒ 数値微分 1 例えば,次の近似式を用いる. . f (x + ∆x) − f (x) f (x) ∆x . (1) 素直なコーディング 関数へのポインタ double df(double (*f)(), double x, double dx) { return (f(x+dx)-f(x))/dx ; } . √ . arccos (1/ 2) の値 GUI 関数電卓ソフト(xcalc 等)を使わなくともコマンドラ イン上で計算させることができる. octave(MATLAB 互換) . octave -q --eval ’acos(1/sqrt(2))’ . gnuplot(グラフ作成ツールだが数学関数も豊富) . gnuplot -e ’print acos(1/sqrt(2))’ . ☞ 1 π f (x) = 0 の点は,x = ± arccos √ = ± でした. 4 2 . Newton 法よりも高次の収束 Halley の式(3 次収束) 公式: xk+1 = xk − fk /fk 1 − fk fk /2(fk )2 2 階微分の近似式: f (x + ∆x) − f (x) ∆x f (x + 2∆x) − 2f (x + ∆x) + f (x) ∼ (∆x)2 f (x) ∼ を用いて,数値微分を行うことができる.
© Copyright 2024 ExpyDoc