数値解析 第3回 (2) 二分法
二分法のアイデア
情報科学では「二分割する作戦」が良く出てきますが、ここでは「解の存在範囲」を二分割します。
「存在範囲を二分割する」する作業を繰り返して解を追い詰めていこう、という作戦です。
そのキーポイントは
中間値の定理 f(x) が連続関数で、区間
[a, b,] の両端で関数値が逆符号
f(a)×f(b)<0
であれば、その区間内に少なくとも1つ
f(x)=0 の解
α が存在する。
これをどう使うかと言うと、
二分法のアイデア さらに
a と
b の中点
c=a+b2 を考える。
- もし f(a)×f(c)≦0 であれば、区間 a<x≦c に少なくとも1つ f(x)=0 の解が存在し、
- そうでなければ区間 c<x<b に少なくとも1つ f(x)=0 の解が存在する。
いずれにしても、解の存在範囲の区間幅を半分に狭めることができる。
二分法のアルゴリズム
Alg.3 ( 二分法 )
- f(a)×f(b)<0 を満たす a, b を入力する
- c=a+b2 とおく
- if ( f(a)×f(c)≦0 ) b=c; else a=c;
- if ( 終了条件 ) c を出力して終了; else 2° へ戻れ;
終了条件としては次のような条件を設定します。
- 反復回数が十分大きい
- |f(c)| が十分に小さい
- |a−b| が十分に小さい
Rem.4 1回のループで区間幅が半分になるということは、2進数として精度が1桁向上することになります。
220 ≒ 106 ですから、ループを 20 回まわせば10進数としての精度が6桁向上します。
Rem.5 2重解はこのままでは求めることができません。
解の左右では
f(x) が同符号なので、解の付近で
f(a)×f(b)<0 が成立しないからです。
そこで次の定理を使います。
Th.6
α が f(x)=0 の2重解であること ⇔ f(α)=f′(α)=0.
2重解
α は
f′(x)=0 の単根ですので、
f′(x)=0 について二分法を適用することで
α が求まります。
(一般に
m 重解は
f(m−1)(x)=0 の単根になります。)