情報通信工学科 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 を忘れないでね

二分法、ニュートン法の課題のページに戻る