情報通信工学科 2年 コンピュータ数値解析(学内専用)中川朋子
二分法、はさみうち法、ニュートン法
二分法で解く時のHint: 答えが出ない!という時、良くある間違い
(1) f(xa)*f(xm) < 0.0 で判断するはずなのに、まちがって
f(xa)*f(xb) < 0.0 になってる
(2) 中点xmをxbに入れ直すのか、xaに入れ直すのか、がまちがってる
(3) 終了条件(繰り返し継続条件)が間違ってない?
xb-xa が 求める精度より 大きいなら、ループを続けるはずなんだけど、、、
(4) プログラムは間違ってないけど、初期値 xa, xb の選び方がダメ
f(xa) がマイナスで f(xb) もマイナスとか
f(xa) がプラスで f(xb) もプラスとかじゃ、間に解がないのでは、、、?
二分法で解く時のHint:どこも間違ってないのに答えが出ない時!
(5) 中点xm がたまたまちょうど解になった場合、
本当はそこで終了してほしいけど、
現在のプログラムは、f(a) * f(xm) < 0 しか調べていないので、
f(xm) == 0 でも、単にfalseになるだけで、ここで終わってくれないし、
いつまでたっても xm の値が変わらず、結果が出ませんよね。
(途中経過を出力してれば、判断がつくはず)
もしf(xm)==0.0になったらそこで解を出力して終了できるように
条件判断を入れておくといいですね。
二分法で解く時のHint:改良型(少し速い)もあるよ
二分法で求めた中点の代りに、
xaとxbを |fa| : |fb| に内分する点をxmとする
「はさみうち法」という方法もあります。
普通、このほうが早く解に近づくよね。(図解するとよくわかるよ)
(xm-xa) : (xb-xm) = |fa| : |fb|より
|fb|(xm-xa) = |fa|(xb-xm)
(|fb|+|fa|)xm = |fb|xa+|fa|xb
xm=の式にして使う。
絶対値 |fa| は abs( fa )のように書けばよい。
数学関数なので、<math.h> と -lm を忘れないでね
二分法、ニュートン法の課題のページに戻る