二分法シミュレーター 戻る
数値解析シミュレーター

二分法 シミュレーター — 区間囲み込みによる根の探索

f(x)=x³−2x−5 を例に、中点 c=(a+b)/2 で区間を半分ずつ縮めていく二分法の収束過程をリアルタイム可視化。初期区間 a, b・許容差・反復回数を自由に調整できる。

パラメータ
初期区間左端 a1.00
初期区間右端 b3.00
最大反復回数30
許容差 1e^−n6
計算結果
収束した根
反復回数
最終区間幅
収束状態
関数と区間 [a, b](f(x)=x³−2x−5)
区間幅 (b−a) の収束(log10)
理論・主要公式

$$c_n = \frac{a_n + b_n}{2}, \quad [a_{n+1}, b_{n+1}] = \begin{cases} [a_n, c_n] & f(a_n)\,f(c_n) < 0 \\ [c_n, b_n] & \text{otherwise} \end{cases}$$

二分法の更新則。中点 c_n の符号で根のある側を選び、区間を半分に縮める。

$$f(x) = x^{3} - 2x - 5, \quad f(a_0)\cdot f(b_0) < 0$$

テスト関数(Newton の原例題)と前提条件。実根は x ≈ 2.094551482。

$$|b_n - a_n| < \varepsilon, \qquad N \approx \log_2\!\left(\frac{b_0 - a_0}{\varepsilon}\right)$$

収束判定と必要反復数。許容差 ε=1e^−n に対し N ≈ log₂((b₀−a₀)/ε)。線形収束(誤差が毎反復で 1/2)。

二分法とは

連続関数 f(x) について f(a)·f(b)<0(区間の両端で符号が反転している)という前提のもと、区間を中点で半分ずつ縮めて根を囲み込む数値解法。「絶対に発散しない」という最大の利点をもつ、最も古典的で最も頑健な根探索アルゴリズムの一つだよ。

🙋
これ、ニュートン法と何が違うんですか? ニュートン法の方が速いって聞いたんですけど。
🎓
いい質問。速さは確かにニュートン法が圧倒的で「2次収束」(誤差が反復ごとに約2乗で縮む)。一方、二分法は「線形収束」で、毎反復で区間幅が半分になるだけ。1e−6 まで縮めるのに約 log₂(2/1e−6)≈21反復もかかる。じゃあ二分法の出番は? — それは 絶対に発散しないこと。ニュートン法は初期値が悪いと簡単に飛んでいくけど、二分法は f(a)·f(b)<0 さえ満たしていれば、必ず根に収束する保証がある。実務では、まず二分法で根の区間を絞り、近づいたところでニュートン法に渡す「ハイブリッド法」が定番だ。
🙋
区間の左端と右端で同じ符号になっちゃったら?
🎓
そのときは二分法の前提が崩れる。シミュレーターで a=1, b=2 にしてみて — f(1)=−6, f(2)=−1 で両方マイナス。「同符号エラー」が出るはず。中間値の定理は「区間内に少なくとも1つの根がある」を保証する条件で、両端の符号が同じだと根があるとも無いとも言えない(実際には偶数個ある可能性も)。これを避けるために、実装では二分法呼び出し前に f(a)·f(b)<0 をチェックするか、関数を一度ざっとプロットして根の位置を目視で当たりを付けるのが鉄則。
🙋
許容差を 1e−12 まで厳しくしたら、反復回数も2倍になっちゃいますか?
🎓
ほぼ2倍。線形収束だから、許容差を 1e−6 から 1e−12 に厳しくすると追加で log₂(10⁶)≈20反復必要になる。ニュートン法なら1〜2回しか増えないから、許容差を厳しくしたいときのコスト差はかなり大きい。とはいえ、二分法でも区間幅が 1e−15 くらいまでは安定して計算できる(倍精度浮動小数の機械イプシロンが約 2.2e−16)。実務では二分法を1e−4 〜 1e−6 くらいまで使い、それより厳しい精度が必要ならニュートン法・割線法に切り替える流れだよ。

物理モデルと主要な数式

二分法は、連続関数の中間値の定理(IVT: Intermediate Value Theorem)を直接アルゴリズムに翻訳したもの。f(a)·f(b)<0 ならば、区間 (a, b) 内に少なくとも1つの根が存在する。

$$c_n = \frac{a_n + b_n}{2}$$

中点を計算し、その符号で根のある半区間を選ぶ:

$$[a_{n+1}, b_{n+1}] = \begin{cases} [a_n, c_n] & f(a_n)\,f(c_n) < 0 \\ [c_n, b_n] & f(a_n)\,f(c_n) > 0 \end{cases}$$

誤差の上界(線形収束):

$$|c_n - x^{*}| \le \frac{b_0 - a_0}{2^{n+1}}$$

許容差 ε に達するまでの必要反復数:

$$N \ge \log_{2}\!\left(\frac{b_0 - a_0}{\varepsilon}\right)$$

つまり、毎反復で有効桁数は log₁₀(2) ≈ 0.301 桁ずつ増えていく。ニュートン法の「桁倍化」と比べると遅いが、初期値依存性がない強みがある。

実世界での応用

非線形ソルバーの安全網(CAE):Abaqus や ANSYS の非線形構造解析では、ニュートン・ラフソン反復が発散した場合のフォールバックとして二分法相当の区間縮小が使われる。アーク長法(Riks 法)の解析弧長決定でも、釣り合い経路と直交する制約方程式を二分法で解くケースがある。

状態方程式の逆解き(CFD・熱流体):気体・液体の密度から圧力を求めるとき、p から ρ への陽な式はあっても ρ から p への逆関数が解析的に無いことが多い。SUPG/PISO/SIMPLE の各サブステップで、二分法やBrent 法で逆解きする。

接触解析の時刻刻み制御:陽解法FEMで、ある時刻ステップ中に節点が接触面を貫通した場合、貫通量がゼロになる正確な接触時刻 t* を二分法で探索する(ペナルティ法と組み合わせる場合もある)。

最適化のライン探索:勾配法やニュートン法の各反復で、ステップ幅 α を決める際に Wolfe 条件を満たす α を二分法的に探索する(黄金分割探索や Armijo 後退とセットで使われることが多い)。

よくある誤解と注意点

まず一番よくある誤解は 「線形収束だから二分法は遅くて使えない」。確かに反復回数だけ見れば不利だが、1反復あたりの計算コストは「f(x) を1回評価するだけ」と非常に軽い。ニュートン法は f と f' を毎回計算し、CAE のような高次元問題ではヤコビ(剛性行列)の組立コストが圧倒的に高い。1反復あたりのコストで比べると、二分法の方が安いケースもある。

次に 「中間値の定理は単一の根を保証する」 という誤解。f(a)·f(b)<0 が保証するのは「区間内に 奇数個 の根がある」だけ。3個あるかもしれない。二分法は毎反復でその奇数を1つに絞っていくが、最初に取った区間にどの根が含まれていたかで最終的に収束する根が変わる。シミュレーターで a=−2, b=3 のように広い区間を取り、徐々に狭めるとどの根に収束するかが見える。

最後に 「f が連続でない場合」 の落とし穴。中間値の定理は連続関数にしか成立しない。f が不連続点を持ち、その不連続点で符号が反転している場合、二分法は「根が無いのに収束したように見える」結果を返す。例:1/x は x=0 を境に符号が変わるが、ここに根はない。実装で連続性のチェックを入れる、または事前に関数の特性を把握することが重要。

よくある質問

代表的な停止条件は3つ:(1) 区間幅 |b−a| < 2ε(位置の精度)、(2) |f(c)| < ε(残差の精度)、(3) 最大反復数到達。実務では (1) と (3) の併用が多く、本シミュレーターも区間幅と最大反復のいずれかで停止する設計です。残差ベースは、根の近くで f'(x*) が非常に小さい場合に過早終了するリスクがあるため注意。
割線法(Secant method)は中点ではなく f(a),f(b) を結ぶ直線と x 軸の交点を次の試行点とし、超線形収束(収束次数 φ≈1.618)で二分法より速い。ただし区間囲み込みではないため発散の可能性がある。Brent 法はこれらを統合し、二分法・割線・逆二次補間を自動切替する実装で、頑健性と速度を両立する標準ルーチン(SciPy の brentq、MATLAB の fzero の中身)です。
単純な二分法は1次元に限定されます。多次元では、領域を矩形分割して符号の変化を追う「区間解析(interval analysis)」や「Krawczyk 演算子」が二分法の高次元版にあたります。ただし CAE で実用的な多次元根探索はほぼニュートン・ラフソン法(ヤコビ行列を使う)一択で、二分法的アプローチは限定的です。
事前に関数を粗くサンプリング(10〜100点)して符号変化の位置を検出し、その近傍を初期区間とします。これを「グリッドサーチ + 二分法」と呼びます。物理的な制約(例:温度は絶対零度以上)から自然な区間が定まる場合も多い。本シミュレーターのように 3次関数なら、十分広い区間 [−5, 10] を取れば実根を必ず含みます。