IT入門B2 ー 方程式の反復解法 ー 授業内容 •反復解法 •ニュートン法 •プログラムの作成 •演習 非線形方程式 連立一次方程式を解く場合には,ガウスの消去法等といった直接解法によ り解の計算ができる. 非線形方程式を解く場合は直接解法が存在しないため,反復解法を用いて 解を数値的に計算する. 今回の授業では,反復解法の中でもよく知られたニュートン法を用いて方 程式の解を求めるプログラムを作成する. 反復解法 方程式 f ( x) 0, f :R R が与えられたとする. (i ) 適当な初期値 x ( 0 )から出発し,f ( x) 0のある解 x* に収束する列 x をつく り,x (i )が x* に十分近づいたときに計算を打ち切り x (i ) を近似解とする. 収束の判定は,ある微小な値 0 に対し,例えば次のような条件 とする: (1) x (i 1) x (i ) (2) x (i 1) x (i ) x (i ) (3) f ( x (i ) ) このとき,上の条件がすべて満たされても, x (i ) x* が成り立つとは限らない. ニュートン法 ― 非線形方程式を解くための反復解法の一つ. f : R Rを1回連続微分可能な関数とし,方程式 f ( x) 0 を解くことを考える. 適当な初期点 x ( 0) R を選び,これを方程式の最初の近似解とする. ただし, f ( x(0) ) 0 とする. このとき f ( x(0) ) 0 ならば,x ( 0 )を修正し x (1) x (0) h とし,方程式 f ( x) 0のより良い近似解となるようにする. ニュートン法 f を x ( 0 ) のまわりでTaylor展開すると, 2 f ( x ( 0) ) f ( x ( 0) ) ( 0) ( 0) f ( x) f ( x ) x x x x (0) 1! 2! となる.ここで,x x (1)として1次の項で打ち切ると, f ( x (1) ) f ( x ( 0 ) h) f ( x ( 0 ) ) f ( x ( 0 ) ) h と近似できる.このとき,(右辺 0) になってほしいわけだから, f ( x ( 0) ) f ( x ( 0) )h 0 f ( x (0) ) h f ( x ( 0) ) と定まる.よって, x (1) である. x ( 0) f ( x ( 0) ) f ( x ( 0) ) ニュートン法 ここで, g ( x) x f ( x) f ( x) とおくと,上式は x(1) g ( x(0) ) と書ける. これを繰り返して一般化すると x ( i 1) f ( x (i ) ) g(x ) x f ( x (i ) ) (i ) (i ) i 0,1,2,3, となる.この反復解法をニュートン法と呼ぶ. ニュートン法 x ( i 1) f ( x (i ) ) g(x ) x f ( x (i ) ) (i ) (i ) i 0,1,2,3, ニュートン法により得られる点列 x (i ) が点 x*に収束したとする. このとき f ( x* ) x g(x ) x f ( x* ) * * * となる.すなわち f ( x* ) 0 したがって,x*が f ( x) 0 の解となっていることがわかる. ニュートン法 f (x) - 幾何学的な解釈 - x (i 1) x* 曲線 y f (x) 上の点 x(i ) , f ( x(i ) ) における接線 y f ( x(i ) )(x x(i ) ) f ( x(i ) ) とx軸との交点のx座標 f ( x (i ) ) xx f ( x (i ) ) (i ) を求める操作の反復を行っている. x (i ) ニュートン法 - 参考 r R を定数として g ( x) x rf ( x) とする. 反復解法として i 0,1,2,3, x(i 1) g ( x(i ) ) x(i ) rf ( x(i ) ) を用いる方法を簡易ニュートン法と呼ぶ. r 1 f ( x ( 0) ) とする場合や,r を f ( x ( 0) )0 1 のなんらかの近似とする場合が多い. (0) f ( x ) プログラムの作成 以下の例題を解くためのプログラムを作成してみよう. 例 題 方程式 x 1.2e x の解をニュートン法により求める. x 1 .2 e x x 1 .2 e x 0 より, f ( x) x 1.2e x とすると f ( x) 1 1.2e x であり, x ( i 1) f ( x (i ) ) g(x ) x f ( x (i ) ) (i ) (i ) で定まる反復により解を求める. i 0,1,2,3, プログラムの作成 ・ f ( x), f ( x) の計算: f ( x), f ( x) はそれぞれ f ( x) x 1.2e x f ( x) 1 1.2e x で与えられている.これらの値の計算には,f ( x), f ( x)をそれぞれ 関数として定義することにしよう. f ( x) x 1.2e xを以下のような関数として定義できる: double func(double x) { double y; y = x – 1.2*exp(-x); return y; } f (x )も同様に関数名func_d()等として定義してみよう. プログラムの作成 このとき,関数func()をmain関数等から呼び出すことでf xの値 を計算できる. double func(double x) { double y; y = x – 1.2*exp(-x); return y; } int main(void) { double f, x; x = 1.0; f = func(x); … ← fにf x)の値が代入される プログラムの作成 f ( x (i ) ) i 0,1,2,3, x x (i ) f ( x ) ニュートン法では,適当な初期点 x ( 0 )を選び,上式にしたがってi の値を順 次変化させながら次の点を次々と計算する. 適当な停止条件を満たしたところで計算を止め,そのときの値を解とする. ( i 1) (i ) ・初期点の設定: 現在いる点を表す変数xをdouble型で宣言し,xに適当な値を代入. int main(void) { double x; … x = 1.0; … ・ニュートン法の反復: while文,for文等の繰り返し処理を利用して反復を実現する. プログラムの作成 ・反復の停止条件: ニュートン法の反復を停止する条件として x ( i 1) x ( i ) を利用することにする. 現在いる点xから,ニュートン反復により計算される次の点を表す 変数をx_nとして宣言している場合, fabs(x_n – x) < e が成立したときに反復を停止すれば良い. このとき,eとして予め微小な値を定義しておく必要がある. ← 106の指数表現 e = 1e-6; while (…) { /* ニュートン反復により次の点x_nを計算する部分 */ if (fabs(x_n - x) < e) … } break; プログラムの作成 ・最大反復回数の設定: ニュートン法では,初期点の選び方により解に収束しない場合がある. その場合を考慮して,最大の反復回数を設定しておき,解に収束しな かった場合は強制的に終了させる. 例えば,変数maxに最大の反復回数を代入しておき,繰り返し文の 終了条件として利用する. max = 100; i = 0; while (i<max) { … i++; } max = 100; for (i=0; i<max; i++) { … } 繰り返し文が終了したとき,iの値がmaxに等しい場合は解に収束して おらず,それ以外の時は解に収束している. プログラムの作成 例題を解くためのプログラムの流れ int main(void) { double e, x, x_n; int i, max; x = 1.0; e = 1e-6; max = 100; if (i < max) { /* 解に収束 */ } else { /* 解に収束していない } i = 0; while (i < max) { /* ニュートン反復により 次の点x_nを計算する部分 */ if (fabs(x_n - x) < e) break; /* } 変数の更新 */ return 0; } */ プログラムの作成 プログラム作成上の注意 ・exp(), fabs()等の数学関数を利用するにはプログラムの最初に #include <math.h> と記述. ・また,コンパイル時に-lmオプションを付け、 gcc -lm … とする. ・詳細は,第3回の講義資料を参照のこと. 演 習 1 例題を解くためのプログラムを完成させて,例題の解を計算してみよう. 2 方程式 x cos(x) 0 の解をニュートン法により計算してみよう.
© Copyright 2024 ExpyDoc