無理数を求める — ニュートン法

第5章 No.3 / 接線が x 軸を切る点を繰り返し求める

無理数の値を求めてみよう。例えば √2 を求めてみよう。無理数は有理数と違い規則性のない無限小数として表現されるので何らかの工夫が必要である。

√2 は方程式 x² − 2 = 0 の解として与えられる。

x = a における接線の方程式は

y - (a² - 2) = 2a (x - a)

であり、これと x 軸との交点は

x = a - (a² - 2) / (2a) = (a² + 2) / (2a)

となる。この x 座標について再び接線を求めて、新たな x 軸との交点を求める。これを繰り返すと √2 に収束する。

JavaScript で動かしてみる

Newton's Method — LiveJS

仕組み

一般に、方程式 f(x) = 0 の解を求めるには x = a における接線が x 軸と交わる点を新しい a として繰り返せばよい:

xn+1 = xn - f(xn) / f'(xn)

このアルゴリズムは ニュートン法 として知られる。導関数 f'(x) は、ここでは数値微分 (f(x+h) - f(x-h)) / (2h) で計算している。

function newton(f, x0, eps) {
  const h = 1e-7;
  let x = x0;
  const trace = [];
  for (let i = 0; i < 100; i++) {
    const fx  = f(x);
    const dfx = (f(x + h) - f(x - h)) / (2 * h);
    if (Math.abs(dfx) < 1e-15) break;
    const nx = x - fx / dfx;
    trace.push({ i, x, fx, nx });
    if (Math.abs(nx - x) < eps) { x = nx; break; }
    x = nx;
  }
  return { root: x, trace };
}