ニュートン法(数値解法)
接線を使って方程式の解に高速収束する反復アルゴリズム
- 1
- ニュートン法は関数 の根( となる )を、接線と 軸の交点を繰り返し求めることで高速に近似する反復アルゴリズム
- 2
- 更新式 を繰り返すと、初期値が適切であれば正解付近で反復ごとに正しい桁数がほぼ倍になる「2次収束」が起こる
- 3
- 多くのプログラミング言語の `sqrt()` 関数や機械学習の最適化アルゴリズムは、内部でニュートン法(またはその派生法)を使って高速に解へ収束させている
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
ニュートン法は関数 $f(x)$ の根($f(x)=0$ となる $x$)を、接線と $x$ 軸の交点を繰り返し求めることで高速に近似する反復アルゴリズム
身につく武器・思考力
更新式 $x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$ を繰り返すと、初期値が適切であれば正解付近で反復ごとに正しい桁数がほぼ倍になる「2次収束」が起こる
実社会・ITでの活躍現場
- •sqrt() 関数と数値ソルバーにおけるニュートン法の実装
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
対象の関数 をボタンで選び(例: で を求める)、初期値 をスライダーで設定してから「1ステップ進める」を押してみよう。現在の点における接線が描かれ、その接線と 軸との交点が次の近似値 になる様子と、反復のたびに真の解へ急速に近づいていく数列 を確認できる。
↑ 緑の点が現在の近似値 xn の位置(x軸上)、赤い直線が点 (xn, f(xn)) における接線です。「1ステップ進める」を押すたびに、この接線と x 軸の交点が次の近似値 xn+1 になり、反復のたびに急速に根へ近づく様子(2次収束)を確認できます。
( を求める)にニュートン法を適用するとき、更新式 はどれになるか?
Layer 2 — 定義・受験・証明
定義
ニュートン法(ニュートン・ラフソン法)は、微分可能な関数 の方程式 の解(根)を数値的に求める反復アルゴリズムである。現在の近似解 における関数の接線
と 軸()との交点を次の近似解 とする、という操作を繰り返す。
初期値 が真の解に十分近く、 であれば、この数列は急速に真の解に収束する。
公式・数理モデル
証明・導出
接線交点としての導出: 点 における接線の傾きは微分係数 であるから、接線の方程式は
この直線が 軸()と交わる点を とすると、
が得られる。
2次収束性の直感:真の解を 、誤差を とする。テイラー展開 ( は と の間のある点)を更新式に代入すると、
となり、誤差 が前の誤差 の2乗にほぼ比例することが分かる。これは反復のたびに正しい桁数がおよそ倍増する「2次収束」を意味し、収束が保証される範囲では非常に高速である。
押さえておきたいポイント
- 接線の傾き が0に近いと分母が0に近づき、次の近似値が大きく飛んでしまい発散することがある
- 初期値 が真の解から遠い、または関数が変曲点を持つ場合は収束せず振動・発散することがある(大域収束性は保証されない)
- に適用すると更新式は となり、これは古代から知られる平方根の近似法(バビロニア法・ヘロンの公式)と一致する
- 多変数関数の最適化(勾配が0になる点を探す)にニュートン法を適用したものが「ニュートン法による最適化」であり、勾配降下法よりも収束が速い場合がある
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
sqrt() 関数と数値ソルバーにおけるニュートン法の実装
多くの数値計算ライブラリやCPUの高速逆平方根命令、非線形方程式ソルバー(Newton-Raphsonソルバー)は、ニュートン法の反復更新を内部で用いている。以下は に対するニュートン法で平方根を計算する実装。
1// ニュートン法による f(x) = 0 の根の探索(汎用実装)2function newtonMethod(3 f: (x: number) => number,4 fPrime: (x: number) => number,5 x0: number,6 tolerance = 1e-10,7 maxIterations = 1008): { root: number; iterations: number; history: number[] } {9 let x = x0;10 const history: number[] = [x];1112 for (let i = 0; i < maxIterations; i++) {13 const fx = f(x);14 if (Math.abs(fx) < tolerance) break;1516 const dfx = fPrime(x);17 if (Math.abs(dfx) < 1e-14) {18 throw new Error("導関数がゼロに近く、これ以上反復できません");19 }2021 x = x - fx / dfx; // 接線と x 軸の交点へ更新22 history.push(x);23 }2425 return { root: x, iterations: history.length - 1, history };26}2728// 例: f(x) = x^2 - 2 の根(= √2)をニュートン法で求める29const result = newtonMethod(30 (x) => x * x - 2,31 (x) => 2 * x,32 1.0 // 初期値33);3435console.log(`√2 の近似値: ${result.root}`); // 1.4142135623730951 に急速収束36console.log(`反復回数: ${result.iterations}`); // わずか4〜5回程度37console.log(`収束過程: ${result.history.join(" → ")}`);
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元