二分法とは? アルゴリズム・収束・例題
二分法とは?
二分法とは、
関数 $f(x)$ が
を満たすときに、
反復計算によって方程式 $f(x)=0$ の近似解を求めるアルゴリズムの一つである。
計算を繰り返すたびに解の存在する範囲を半分に縮まるので、確実に収束性が担保される。
正確には、以下のような反復計算を繰り返す。
詳細
二分法の定義を述べるにあたって、
関数 $f(x)$ が $a \lt b$ である $a$ と $b$ に対して、
を満たすと
連続関数であると仮定する。
これに対し
数列 $\{ a_{n} \}$ と $\{ b_{n} \}$ を次のように定義しながら、
反復計算を実行する。
ステップ 1
数列の初項を
とする。
仮定より、
であるので、このステップで解 ($f(x)=0$ を満たす $x$) が求まることはない。
ステップ 2
ステップ $1$ で得られた $a_{1}$ と $b_{1}$ の中点において、
である場合には、
数列の第2項を
とする。
反対に、
である場合には、
とする。
どちらの場合であっても、
$a_{2} \lt b_{2}$ であり、
が成り立つ。
また、
ステップ 2 での数列の差 $b_{2}-a_{2}$ は、
ステップ 1 での差 $b_{1}-a_{1}$ の半分になる。
一方で運良く
となった場合には、解が
であることが分かったので、計算を終了する。
ステップ $n$
ステップ $2$ 以降は同様の方針に従って数列を更新して行く。
すなわち、
ステップ $n-1$ で得られた $a_{n-1}$ と $b_{n-1}$ の中点において、
である場合には、
とする。
反対に、
の場合には、
とする。
どちらの場合であっても、$a_{n} \lt b_{n}$ であり、
が成り立つ。
また、
ステップ $n$ での数列の差 $b_{n}-a_{n}$ は、
ステップ $n-1$ での差 $b_{n-1}-a_{n-1}$ の半分になる。
一方で運良く
となった場合には、解が
であることが分かったので、計算を終了する。
以上の反復計算によって、数列 $\{ a_{n} \}$ と $\{ b_{n} \}$ を更新して行き、
十分な精度が得られた時点で計算を終了する。
計算を終了した時点の数列 $a_{n}$ と $b_{n}$ の間に解があると判断する。
このような数値解法を
二分法
(Bisection method)
という。
計算終了のルールとしては、
次のようなものがある。
すなわち、
一回の反復によって数列の差が半分になって行くことから、
計算を進めてゆくと、
その差が次第に小さくなって行く。
そこで、その差が十分に小さくなったとき、
例えば、正の小さな値 $\epsilon$ に対して、
が満たされたときに計算を終了する。
このとき、
解は $b_{n}$ と $a_{n}$ の間にあり、
計算誤差が $\epsilon$ であると判断する。
二分法を用いた例題
二分法を用いて
の解を数値的に小数点 2 桁まで求める。
説明
関数 $f(x)$ を
と定義し、
区間 $[1, 2]$ に対して
二分法を適用する。
数列 $\{ a_{n} \}$ と $\{ b_{n} \}$ の初項を
とする。
これらの中点において、
であるので、
数列の第2項は
とする。
これらの中点において、
であるので、
数列の第3項を
とする。
これらの中点において、
であるので、
数列の第4項を
とする。
これらの中点において、
であるので、
数列の第5項を
とする。
これらの中点において、
であるので、
数列の第6項を
とする。
これらの中点において、
であるので、
数列の第7項を
とする。
これらの中点において、
であるので、
数列の第8項を
\begin{eqnarray}
a_{8} &=& 1.7265625
\\
b_{8} &=& 1.734375
\end{eqnarray}
とする。
この時点で数列の差が
になり、小数点2桁 $(0.01)$ よりも小さくなったので、計算を終了する。
この結果、
真の解が
の範囲にあると判断される。
実際の値が
であるので、およそ 小数点2桁 程度の誤差で近似値が得られている。
この精度で満足出来ないのであれば、さらに反復計算を進めてゆく。
$f(x)$ は区間 $[1,2]$ において単調増加関数であるので、
反復を繰り返せば繰り返すほど、真の解に近い結果を得られる (
単調増加なら収束を参考)。
単調増加関数なら収束
区間 $[a, b]$ で連続かつ単調増加する関数 $f(x)$ が
を満たすとき、
二分法は
を満たす唯一つの $x$ に収束する。
証明
区間 $[a, b]$ で連続かつ単調増加する関数 $f(x)$ が
を満たすとし、
二分法を適用する。
二分法では、
計算の第 1 ステップにおいて、
数列の $\{a_{n} \}$ と $\{ b_{n} \}$ の初項を
と定義する (
二分法の定義を参考)。
このとき、$a_{1} \lt b_{1}$ かつ
であるので、
中間値の定理により、
を満たす $x$ が区間 $[a_{1}, b_{1}]$ の間に唯一つ存在する。
ここで「唯一つ」の部分には $f$ の単調増加性を用いた。
このとき、区間の幅 $d_{1}$ は、
である。
計算の第 2 ステップにおいては、
$a_{1}$ と $b_{1}$ の中点で
である場合には、
数列の第2項を
とし、反対に
である場合には、
とする。
どちらの場合であっても、、$a_{2} \lt b_{2}$ であり、
が成り立つので、
中間値の定理により、
を満たす $x$ が区間 $[a_{2}, b_{2}]$ の間に唯一つ存在する。
ここで「唯一つ」の部分で $f$ の単調増加性を用いた。
このとき、
区間の幅 $d_{2}$ は、
となり、
$d_{1}$ の半分になる。
ステップ $2$ 以降は同様の方針に従って数列を更新して行く。
すなわち、
ステップ $n-1$ で得られた $a_{n-1}$ と $b_{n-1}$ の中点において、
である場合には、
とし、
反対に
の場合には、
とする。
どちらの場合であっても、$a_{n} \lt b_{n}$ であり、
が成り立つので、
中間値の定理により、
を満たす $x$ が区間 $[a_{n}, b_{n}]$ の間に唯一つ存在する。
ここで「唯一つ」の部分で $f$ の単調増加性を用いた。
ステップ $n$ での区間の幅 $d_{n}$ は、
となり、
第 1 ステップと比較して $\frac{1}{2^{n-1}}$ の分だけ幅が狭くなる。
このように連続かつ単調増加な関数 $f$ に対して二分法を適用すると、
各ステップで現れる区間の幅 $d_{n}$
が $1/2$ 倍ずつ小さくなり、なおかつ、
その中に解が唯一つ存在するように計算が反復される。
したがって、
必ずどこかのステップで任意の幅 $\epsilon$
よりも小さな区間の中に
解が唯一つ存在する状態に達する。
このステップを $N$ とすると、
$N \lt n$ である全ての $n$ に対して、
が成り立つので、
が成り立つ。
この関係は、極限
の定義そのものであり、
数列 $b_{n}$ が解 $x$ に収束することを表している。
同様に、
も成り立つ。
このように、
連続かつ単調増加する関数に対して二分法を適用すると、
反復計算で現れる数列が真の解に収束することが保証される。
単調減少関数に対しても同様である。
二分法の収束速度
区間 $[a, b]$ に対して二分法を適用したとき、
近似解の範囲が $\epsilon$ より小さくなるためには、
よりも多くの回数の反復計算が必要である。
証明
定義 から分かるように、
二分法では一回の計算ステップで、近似解の範囲が前のステップの範囲の半分になる。
従って、
$N$ 回反復した後の近似解の範囲は、
である。
これが正の小さな値 $\epsilon$ より小さくなるためには、
が成り立たなくてはならない。
これより、
であるので、
$\epsilon$ より小さい範囲に近似解を絞り込むためには、
最低でも
より多くのステップの反復計算を実行する必要がある。
例
区間が $[0,1]$ の二分法で、
近似解の範囲を $10^{-4}$ まで絞り込むためには、
よりの多くの回数 (つまり 14 回) の反復計算を要する。
順序データの探索への応用
コンピュータ上で小さい順に並べられたデータ
の中から値 $C$ よりも大きな最小のものを求める問題において、
二分法は効果的である。
簡単な解説
コンピュータ上において、
小さい順に並べられたデータ
の中から値 $C$ よりも大きな最小のものを求めるためには、
単純にはデータの最初から順番に探索して行き、
を満たす $n$ を見つけ、
それを出力するというアルゴリズムが考えられる。
この場合、出力に要する計算ステップ数はデータのサイズ $N$ に比例する。
一方で同じデータに対して、各データ点を結んだ連続関数
を定義して、
区間 $[1, N]$ に対して
二分法を適用すると、
$\log_{2} N$ に比例する回数で解を絞り込むことできる
(
二分法の収束速度 を参考) 。
$N$ が大きい場合、$N$ と $\log_{2} N$ では大きな差になるので、
二分法は
コンピュータ上での順序データの探索を高速化させる。
特徴
1.
速くはないが確実に収束
上の $\sqrt{3}$ を求める例から分かるように、
二分法では、小数点 2 桁の精度を得るために、
$8$ 回程度の計算を要する。
一方で、ニュートン法を用いると、
同じ精度を得るために $1$ 回の計算で済む。
(
ニュートン法で $\sqrt{3}$ を求める を参考) 。
これだけを見ると、二分法よりもニュートン法の方が優れているように思えるが、
必ずしもそうではない。
二分法の長所は、一回の反復で必ず解の範囲が半分になり、
反復計算を進めて行けば行くほど、解の範囲は必ず小さくなることにある。
このことは、
ニュートン法では保証されない。
したがって、必ず解を収束させたい場面においては、
ニュートン法のような勾配法に頼らず、
二分法を適用した方が効果的なこともある。
2.
コンピュータ上での探索では高速
順序データの探索を参考
3.
単調関数なら真の解に収束
単調増加関数なら収束を参考
中間値の定理
区間 $[a,b]$ で
連続な関数が
を満たすとき、
を満たす任意の $C$ に対して、
を満たす $c$ が 区間 $[a,b]$ の中に存在する。
これを
中間値の定理という。
二分法に応用する際には、
とし、次のように言い直す。
すなわち、
区間 $[a,b]$ で連続な関数が
を満たすとき、
を満たす $c$ が 区間 $[a,b]$ の中に存在する。