割線法とは
方程式 f(x)=0 の解を、過去2点 (x_{n−1}, f(x_{n−1})) と (x_n, f(x_n)) を結ぶ「割線」が x 軸と交わる点を次の推定値とする反復解法。ニュートン・ラフソン法から導関数を取り除いた、導関数不要のシンプルな数値手法だよ。
🙋
ニュートン法と割線法、どっちを使えばいいんですか?数式を見るとほとんど同じに見えるんですが。
🎓
本質は同じで、ニュートン法の f'(x_n) を「過去2点から作った傾き (f(x_n)−f(x_{n−1}))/(x_n−x_{n−1})」に置き換えただけ。だから f' を解析的に書けない関数(例えば数値積分の結果や実験データの補間関数)でも使えるのが割線法の最大の強み。一方、収束は「超線形」で次数 φ≈1.618(黄金比)。ニュートン法の2次よりは遅いんだけど、1反復あたりの関数評価が1回(ニュートンは f と f' で2回)だから、計算量で割ると実は割と互角なんだ。
🙋
なるほど。シミュレーターで x_0=1, x_1=3 にすると7反復で根が見つかりました。これを x_0=−2, x_1=−1 にしたらおかしな方向に飛びますね。
🎓
いいところに気付いた。f(x)=x³−2x−5 の実根は x≈2.0946 の1つだけで、左半分(x<0)から出発すると割線が右上を指して、根を一気に飛び越えたり別の局所構造を彷徨ったりする。これは「割線法は局所収束」だから。実装上のセーフガードとして、初期2点で f(x_0)·f(x_1)<0(つまり根を挟む)ように選ぶと、多くの場合安定する。これは二分法の発想だね。両者を組み合わせたのが Brent 法で、scipy.optimize.brentq の中身もこれ。
🙋
許容差を 1e^−12 にしたら反復回数が劇的に増えますか?ニュートン法より遅いんですよね?
🎓
それが意外で、超線形収束(次数 φ≈1.618)も十分強い。1e^−6 から 1e^−12 へは追加で2〜3反復程度しか増えない。ニュートン法(2次)なら1〜2反復だから、ほぼ匹敵する。CAE の準ニュートン法(Broyden, BFGS)はこの「過去の情報からヤコビを近似する」アイデアを多次元に拡張したもので、ANSYS や Abaqus の非線形構造解析の中で剛性行列を毎ステップ再構築しないために使われている。
物理モデルと主要な数式
割線法は、ニュートン・ラフソン法 x_{n+1}=x_n−f(x_n)/f'(x_n) の f'(x_n) を、過去2点による有限差分商で近似したもの。
$$f'(x_n) \approx \frac{f(x_n) - f(x_{n-1})}{x_n - x_{n-1}}$$
これを代入して整理すると、割線法の反復式が得られる:
$$x_{n+1} = x_n - f(x_n)\,\frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}$$
幾何学的には、(x_{n−1}, f(x_{n−1})) と (x_n, f(x_n)) を結ぶ直線(割線)が x 軸と交わる点を次の推定値とする。
収束次数(誤差 e_n = x_n − x* について):
$$|e_{n+1}| \approx \left|\frac{f''(x^{*})}{2f'(x^{*})}\right|\,|e_{n}|\,|e_{n-1}|, \quad \text{次数} = \varphi = \frac{1+\sqrt{5}}{2} \approx 1.618$$
つまり「黄金比」が自然と現れる。これが超線形収束(線形より速いが2次より遅い)の正体。
実世界での応用
準ニュートン法(最適化・CAE): 多次元の F(x)=0 や ∇f(x)=0 を解くとき、ヤコビ行列やヘッセ行列を毎反復組み立てるのは高コスト。Broyden 法(求根用)と BFGS・L-BFGS(最適化用)は、過去の更新から J⁻¹ や H⁻¹ を漸近的に近似する。この発想は1次元の割線法の自然な多次元拡張。
Brent 法(汎用求根ルーチン): scipy.optimize.brentq, MATLAB の fzero, Boost の brent_find_minima など、現代の汎用求根関数のデフォルトは Brent 法。これは二分法の確実性と割線法・逆二次補間の高速性を組み合わせたハイブリッド法で、根を挟む区間を入力すれば必ず収束する。
非線形構造解析(修正ニュートン法): Abaqus や ANSYS の非線形 FEA では、剛性行列 K=∂R/∂u の組立とLU分解が支配的コスト。「修正ニュートン法」は K を数ステップ間使い回し、内部的には割線法に近い動作になる。BFGS 修正もよく使われる。
金融工学・暗黙のボラティリティ: Black-Scholes 式から市場価格に合うボラティリティ σ を逆算するとき、∂C/∂σ(Vega)を解析的に避けたい実装では割線法が使われる。多くのトレーディングシステムが内部でこのループを毎秒数千回回している。
よくある誤解と注意点
まず多いのが 「割線法はニュートン法の劣化版」 という誤解。確かに収束次数は 1.618 vs 2 で割線法のほうが遅いが、1反復あたりの関数評価回数を考慮した「実効収束率」は割線法 ≈ φ ≈ 1.618、ニュートン法 ≈ √2 ≈ 1.414(f と f' を別々に評価する場合)で、なんと割線法のほうが速い。f の評価コストが f' と同等以上なら、割線法を選ぶ理由が十分ある。
次に 「2つの初期点なら根を挟むべき」 という早合点。割線法は f(x_0)·f(x_1)<0(根を挟む)を要求しない。しかし挟まないと、割線が根を超えて遠くに飛び、不安定な挙動になることが多い。シミュレーターで x_0=−2, x_1=−1 にしてみると、両方とも f<0 なので割線が下から右上方向を指し、いきなり遠くにジャンプする様子が観察できる。安全に使うなら、二分法で根を挟んだ後で割線法に切り替える Brent 法的な発想がベスト。
最後に 分母 f(x_n)−f(x_{n−1}) のゼロ除算 。連続する2点で f の値がほぼ等しいと、分母が0に近づき更新量が爆発する。実装では分母の絶対値が閾値(例: 1e−14)を下回ったら反復を停止する、または2点の x をリセットする等の対策が必要。CAE の準ニュートン法でも、ヤコビ近似が悪化したら「再起動」する仕組みが組み込まれている。
よくある質問
割線法とニュートン法の違いは何ですか?
割線法は、ニュートン法 x_{n+1}=x_n−f(x_n)/f'(x_n) の f'(x_n) を、過去2点による差分商 (f(x_n)−f(x_{n−1}))/(x_n−x_{n−1}) で置き換えたものです。導関数の解析的な式や数値微分が不要で、関数 f の評価のみで反復が進みます。収束は超線形(次数 φ≈1.618)で、ニュートン法の2次収束よりやや遅いものの、1反復あたりの計算量が小さいため実効的にはほぼ匹敵します。
割線法と二分法はどう違いますか?
二分法は f(a)·f(b)<0 の区間 [a,b] で必ず収束し、線形収束(次数1、誤差が反復ごとに半分)です。割線法は2つの初期点を必要としますが、根を挟む保証は要求されず、収束は超線形(次数 φ≈1.618)と速いです。代わりに発散リスクがあります。両者を組み合わせて確実性と速度を両立させたのが Brent 法(scipy.optimize.brentq の中身)です。
多変数(連立非線形方程式)に拡張できますか?
はい。1次元の割線法の多次元拡張は「Broyden 法」と呼ばれ、F(x)=0 のヤコビ行列 J を過去の更新から漸近的に近似します。最適化問題(∇f(x)=0)でも、ヘッセ行列 H を近似する BFGS 法・L-BFGS 法が同じアイデアで、Adam や SciPy の minimize の標準的な選択肢として広く使われています。
分母 f(x_n)−f(x_{n−1}) が0になったらどうしますか?
分母の絶対値が機械イプシロン(約 2.2e−16)に近い閾値を下回ったら、反復を停止し「収束失敗」を返すのが標準的な実装です。あるいは、2点を別の場所からリセットして再起動する方法、または二分法に切り替えるフォールバックも一般的です。本シミュレーターでも分母 |f(x_n)−f(x_{n−1})| < 1e−14 を停止条件としています。