二分法
Bisection Method
初級
公開日: 2026-03-20
1. 原理
二分法は中間値の定理に基づく根の探索法である。
中間値の定理
$f$ が $[a,b]$ 上で連続かつ $f(a)\cdot f(b) < 0$ ならば、$f(c) = 0$ を満たす $c \in (a,b)$ が少なくとも1つ存在する。
この定理を反復的に適用し、区間を半分に分割しながら根を挟み撃ちにする。
2. アルゴリズム
二分法
- $f$ が連続で $f(a)\cdot f(b) < 0$ を満たす初期区間 $[a,b]$ を選ぶ。
- 中点 $c = (a+b)/2$ を計算する。
- $f(c) = 0$ ならば $c$ が根であり終了。
- $f(a)\cdot f(c) < 0$ ならば $b \leftarrow c$、そうでなければ $a \leftarrow c$ とする。
- 停止条件を満たすまで 2--4 を繰り返す。
3. 収束性
$n$ 回の反復後、根を含む区間の幅は
$$|b_n - a_n| = \frac{b_0 - a_0}{2^n}$$であり、中点 $c_n$ の誤差は
で上から抑えられる。これは線形収束であり、1回の反復で約1ビットの精度が得られる。$k$ 桁の精度を得るには約 $k \times \log_2 10 \approx 3.32k$ 回の反復が必要である。
4. 停止条件
以下のいずれかを満たしたとき反復を停止する。ここで $\varepsilon$, $\delta$ はユーザーが指定する許容誤差(例: $10^{-8}$)、$N_{\max}$ は最大反復回数(無限ループ防止用)である。
- 区間幅: $|b_n - a_n| < \varepsilon$(根の位置が精度 $\varepsilon$ 以内に確定)
- 関数値: $|f(c_n)| < \delta$($c_n$ が根に十分近い)
- 反復回数: $n \geq N_{\max}$(計算時間の上限)
区間幅による停止条件が最も信頼性が高い。必要な反復回数は $n \geq \lceil\log_2((b_0-a_0)/\varepsilon)\rceil - 1$ で事前に計算できる。
5. 利点と欠点
| 利点 | 欠点 |
|---|---|
| 連続関数なら収束が確実に保証される | 収束速度が遅い(線形) |
| 導関数 $f'(x)$ が不要 | 初期区間両端で関数値が異符号であることが必要 |
| 実装が極めて簡単 | 重根を見つけにくい(符号が変化しないため) |
| 反復回数が事前に予測可能 | 多次元への拡張が困難 |
導関数が不要であることは実用上大きな利点である。ニュートン法は2次収束と高速だが、各反復で $f'(x)$ を計算する必要がある。$f'(x)$ の解析的な式が得られない場合や、$f$ 自体が数値シミュレーションの出力である場合には、ニュートン法は適用しにくい。割線法は導関数不要だが、初期値の選び方次第で発散する可能性がある。二分法は「遅いが確実」であり、他の手法の初期値を求めるための前処理としても有用である。
多次元への拡張が困難な理由は、二分法の本質が「符号の異なる2点で根を挟み撃ちにする」ことにあるためである。二分法が使えるかどうかは、定義域の次元ではなく値域の次元で決まる。
- 値域がスカラー($f: \mathbb{R}^n \to \mathbb{R}$)— 二分法は適用可能。$n$ 次元空間内の2点 $\mathbf{a}, \mathbf{b}$ を結ぶ直線上で $g(t) = f(\mathbf{a} + t(\mathbf{b} - \mathbf{a}))$ とパラメータ化すれば、$g: [0,1] \to \mathbb{R}$ に対する通常の二分法がそのまま使える。
- 値域がベクトル($\mathbf{f}: \mathbb{R}^n \to \mathbb{R}^n$)— 二分法は適用できない。出力がベクトルであるため「正負」の概念がなく、どちら側に根があるか判定できない。
6. 計算例
$f(x) = x^2 - 2$ の根 $x^* = \sqrt{2} \approx 1.4142$ を区間 $[1, 2]$ で求める。$f(1)=-1 < 0$, $f(2)=2 > 0$。
| $n$ | $a_n$ | $b_n$ | $c_n$ | $f(c_n)$ | 選択 |
|---|---|---|---|---|---|
| 0 | 1.0000 | 2.0000 | 1.5000 | $+0.2500$ | 左半分 |
| 1 | 1.0000 | 1.5000 | 1.2500 | $-0.4375$ | 右半分 |
| 2 | 1.2500 | 1.5000 | 1.3750 | $-0.1094$ | 右半分 |
| 3 | 1.3750 | 1.5000 | 1.4375 | $+0.0664$ | 左半分 |
| 4 | 1.3750 | 1.4375 | 1.4063 | $-0.0225$ | 右半分 |
| 5 | 1.4063 | 1.4375 | 1.4219 | $+0.0217$ | 左半分 |
$f(c_n)$ の符号が $+, -, -, +, -, +$ と交互に入れ替わりながら、区間幅は $1.0 \to 0.5 \to 0.25 \to \cdots$ と半分ずつ縮小し、根 $x^* = \sqrt{2}$ に収束する。
7. よくある質問
Q1. 二分法とは何ですか?
連続関数 $f$ に対して $f(a)f(b)<0$ を満たす区間を半分に分割し、根を含む側の区間を繰り返し選択するアルゴリズムである。中間値の定理により収束が保証される。
Q2. 二分法の収束速度は?
線形収束(1次収束)であり、1回の反復で区間幅が半分になる。$k$ 桁の精度を得るには約 $3.32k$ 回の反復が必要である。
Q3. 二分法の欠点は何ですか?
収束速度が遅いこと、初期区間で $f$ の符号変化が必要なこと、多次元への拡張が困難なことが主な欠点である。
8. 参考資料
- Wikipedia「二分法」(日本語版)
- Wikipedia「Bisection method」(英語版)
- R. L. Burden & J. D. Faires, Numerical Analysis, 10th ed., Cengage, 2016.
- W. H. Press et al., Numerical Recipes, 3rd ed., Cambridge, 2007.