非線形方程式の数値計算 (ニュートン法) 電気情報工学科 ∗ コンピュータシミュレーション 2015 年 7 月 10 日 (金) 概要 非線形方程式の近似解を,数値計算により求める.特に,二分法とニュートン法 により近似解を求めるプログラムを作成する. 1 講義内容概略 数値計算による非線形方程式の近似解を求めてみる.今回はニュートン法によるプログ ラムの作成を行う.特に以下の点について修得できることを目標とする. • 二分法とニュートン法の計算原理をしっかりと理解し,それらを説明することがで きる. • アルゴリズムのフローチャートが書ける. • C 言語でプログラムを作成し,実際に近似解を得ることができる. 2 ニュートン法 2.1 2.1.1 計算方法 漸化式 関数 f (x) のゼロ点 α に近い近似値 x0 から出発する.そして,関数 f (x) 上の点 (x0 , f (x0 )) での接線が,x 軸と交わる点を次の近似解 x1 とする.そして,次の接線が x 軸と交わる点 を次の近似解 x2 とする.同じことを繰り返して x3 , x4 , · · · を求める (図 1).この計算結果 ∗ 秋田工業高等専門学校 1 の数列 (x0 , x2 , x3 , x4 , · · · ) は初期値 x0 が適当であれば,真の解 α に収束することは図より 明らかであろう. 実際にこの数列を計算するためには,漸化式が必要である.図のようにすると,関数 f (x) 上の点 (xi , f (xi )) の接線を引き,それと x 軸と交点が xi+1 になる.まずは, xi+1 を求 めることにする.点 (xi , f (xi )) を通り,傾きが f 0 (xi ) の直線の方程式は, y − f (xi ) = f 0 (xi )(x − xi ) (1) である.図 1 より,y = 0 の時の x の値が xi+1 になることが分かる.したがって, xi+1 は, xi+1 = xi − f (xi ) f 0 (xi ) (2) となる.これで,xi から xi+1 が計算できる.これをニュートン法の漸化式と言う.この漸 化式を用いれば,次々とより精度の良い近似解を求めることができる. 計算の終了は, xi+1 − 1 ≤ ε (3) xi の条件を満たした場合とするのが一般的である ε は計算精度を決める定数で,非常に小さ な値をプログラマが設定する.これ以外にも計算の終了を決めることは可能なので,状況 に応じて,計算の打ち切り方法 (例えば break) を使えばいい.ニュートン法による計算収 束の様子を図 1 に示す. 150 125 100 75 50 25 -1 1 2 x3 4 3 x2 x1 5 x0 6 -25 図 1: f (x) = x3 − 3x2 + 9x − 8 の実数解をニュートン法で計算し,解の収束の様子を示して いる.初期値 x0 = 5 から始まり,接線と x 軸の交点からより精度の高い回を求めている. 2 2.1.2 解への収束速度 ニュートン法を使う上で必要な式は,式 (2) のみである.計算に必要な式は分かったが, 数列がどのように真の解 α に収束するか考える.xi+1 と真値 α の差の絶対値,ようするに 誤差を計算する. f (α) = 0 を忘れないで,右辺 f (xi )/ f 0 (xi ) を α の周りでテイラー展開す る.すると, f (xi ) |α − xi+1 | = α − xi + 0 f (xi ) [ ] ( ) f (α) f (α) f 00 (α) (4) = α − xi + 0 + 1− (xi − α) + O (α − xi )2 f (α) f 02 (α) ( ) = O (α − xi )2 となる.i + 1 番目の近似値は,i 番目に比べて 2 乗で精度が良くなるのである.これを, 二次収束と言い,非常に早く解に収束する.例えば,10−3 の精度で近似解が得られてい るとすると,もう一回式 (2) を計算するだけで,10−6 程度の精度で近似解が得られるとい うことである.一次収束の二分法よりも,収束が早いことが分かる. 2.1.3 解けない方程式 アルゴリズムから,二分法は解に必ず収束する.ただし,収束のスピードが遅いのが欠 点である.一方,ニュートン法は解に収束するとは限らない.初期値が悪いと解に収束し ない場合がある.厳密にその条件を求めるのは大変なので,実例を示すことにする. 非線形方程式 3 tan−1 (x − 1) + x =0 4 (5) を計算することを考える.これは,初期値が悪いと収束しない方程式の例である.例えば 初期値 x0 = 3 の場合,図 2 のように収束しない 1 .これを初期値 x0 = 2.5 にすると図 3 の ように収束する. このようにニュートン法は解に収束しないで,振動する場合がある.こうなると,プロ グラムは無限ループに入り,永遠に計算し続ける.これは資源の無駄遣いなので,慎むべ きである.通常は,反復回数の上限を決めて,それを防ぐ.ニュートン法を使う場合は, この反復回数の上限は必須である. ニュートン法で収束する必要条件が分かればこの問題は解決する.しかし,それを探 すのは大変である.というか私には分からない.一方,十分条件は簡単にわかる.閉区間 [a, b] で, f (a) < 0, f (b) > 0 のような関数を考える.このとき, • 常に f 0 (x) > 0, f 00 (x) > 0 で,初期値が x0 = b の場合 • 常に f 0 (x) > 0, f 00 (x) < 0 で,初期値が x0 = b の場合 発散だと思う.もしかしたら振動かも.私は興味がありませんので,発散か振動か誰か証明してくださ い. 1 3 は,必ず収束する.ニュートン法の図から明らかである. f (a) > 0, f (b) < 0 の場合は, f (x) に-1 倍すれば,先の十分条件を考えることができる. 実際には収束しない場合のほうが稀であるので,ニュートン法は非常に強力な非線形方 程式の解法である.ただ,反復回数を忘れないことが重要である.また,二分法と組み合 わせて使うことも考えられる. 4 5 x5 -15 x3 -10 -5 x1 2 x2 x0 5 x4 10 x1 x6 15 -3 -2 x5 x3 -1 1 x4 x2 2 x0 3 -2 -5 -4 図 2: ニュートン法で解が求まらない場合 2.2 図 3: ニュートン法で解が求まる場合 フローチャート 二分法同様,関数と計算を打ち切る条件はプログラム中に書くものとする.そうする と,図 4 のようなニュートン法のフローチャートが考えられる.なお,漸化式を取扱う場 合,一次元配列を利用すると便利である. 始め i = -1 x0 を入力 i ← i+1 xi+1 = xi - f(xi) / f’(xi) 解の精度検査 (xi+1- xi) / xi ≦ 解 xi+1 を表示 no yes yes 反復回数検査 i ≦ imax no 収束しないと 表示 終り 図 4: ニュートン法のフローチャート 4 2.3 プログラムの穴埋め問題 リスト 1: ニュートン法のプログラム(穴埋め) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 # i n c l u d e < s t d i o . h> # i n c l u d e <math . h> # d e f i n e EPS 1 e −7 # d e f i n e IMAX 100 / / 計算精度 / / 計算回数の上限 / / ユーザー定義関数のプロトタイプ宣言 void b i s e c t i o n ( ) ; v o i d newton ( ) ; double f ( double x ) ; double fd ( double x ) ; / / =================================== / / メイン関数 / / =================================== i n t main ( ) { newton ( ) ; return 0; } / / ===================================== / / 解くべき非線形関数 / / ===================================== double f ( double x ) { double y ; y = x + exp ( x ) + s i n ( x ) ; return y ; } / / ==================================== / / 解くべき非線形関数の導関数 / / ==================================== double fd ( double x ) { double y ; y = 1 + exp ( x ) + c o s ( x ) ; return y ; } / / ====================================== / / ニュートン法による計算 / / ====================================== v o i d newton ( ) { d o u b l e x [IMAX ] ; i n t i = −1; FILE ∗ f p ; 5 51 52 53 54 55 56 57 58 59 60 61 62 63 64 f p = f o p e n ( ” newton . d a t ” , ”w” ) ; p r i n t f ( ” ニュートン法による計算を行います. \ n ” ) ; p r i n t f ( ” の初期値を入力してください: x ” ) ; s c a n f ( ”%l f %∗c ” ,&x [ 0 ] ) ; / / ターミナルへの表示 / / ターミナルへの表示 / / 初期値の入力 / / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− / / ここにニュートン法の計算とファイル出力のプログラムを書く / / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− } f c l o s e ( fp ) ; p r i n t f ( ” ニュートン法による解:%0.15 f \ n ” , x [ i + 1 ] ) ; / / 繰返しごとの計算結果のターミナル表示 p r i n t f ( ” ニュートン法による計算回数:%d \ n ” , i ) ; / / 繰返しごとの計算回数のターミナル表示 3 練習問題 [練習 1] 下記の非線形方程式をニュートン法と二分法で解きなさい. [練習 2] ニュートン法と二分法について,横軸に計算回数,縦軸に計算結果の解 を同時にプロットしたグラフを作成し,解の収束速度について考察しな さい.また,計算結果をファイル出力し,グラフは gnuplot を用いること. 今回解く方程式: f (x) = x + exp(x) + sin(x) (6) 4 レポート課題 上記の練習問題をプログラムリストと結果を示したレポートを作成し,提出する.特 に,体裁がしっかりした報告書を提出すること. 提出期限:2015 年 7 月 17 日の講義終了時まで. 提出場所:坂本研究室入口の段ボールのレポート入れ.または講義中に手渡し. 6
© Copyright 2024 ExpyDoc