概要
ニュートン法は、の解を求める数値計算法で、最急降下法に比べて収束が早い特徴があります。ニュートン・ラフソン法とも呼びます。
アルゴリズム
関数の点における接線は以下の式で与えられます。
式(1)の接線と、軸との交点は
です。接線は関数の1次近似ですから、式(3)で表される交点はを1次近似した場合におけるの解であると考えられます。その近似解はよりも真の解に近づいていると想定されます。したがって、得られた近似解において、さらに式(3)によってより確からしい近似解を得ることができます。このようにして繰り返し更新することで真の解に近づいていくことができます。図で表すと以下のようなイメージです。
青色の線が関数、オレンジが接線です。適当な初期値における接線と軸との交点が式(3)によって得られ、これを繰り返すことで解に近づいていきます。
ここで、となる点が求めたい場合は、
とすれば良いです。
の解を求めるニュートン法のアルゴリズム
- の初期値を設定する。
- によってを更新する
- 停止条件(更新量が一定値以下になるなど)が満たされるまで手順2を繰り返す
実験
試しにの解をニュートン法で求めてみまた。数回の反復で1.4142135623...
が得られました。仮に初期値を25としてみたとき、解への近づき方は以下のグラフのようになり、収束の早さが見て取れます。
テストしたコード。今回は反復回数を固定にしていますが、実際は適当な停止条件を設けて計算するようです。また、初期値が解から遠いと、収束しない場合もあるとのこと。は単純なのでどんな初期値からでも解が求められそうですが。
# ニュートン法 import numpy as np def f(x): return x**2 - 2 def newton(xn): return f(xn)/(2*xn) # 初期値 x = 3.0 # ニュートン法による更新 for i in range(10): x -= newton(x) print(x)