ニュートン法を使って、平方根を求めるアルゴリズムを書いてみよう
Goのプレイグラウンドで遊んでたら、フロー制御の章でニュートン法を使って平方根を求めましょう( A Tour of Go )と言われたので調べた。
ニュートン法とは?
ニュートン・ラフソン法(Newton-Raphson method)ともいう。
与えられた関数について
になる
の近似解を求める方法である。
例えば、の解である
は無理数(1.41421356...)である。有効桁数があるコンピューターは、この値を誤差なく持つことは不可能であるが、ニュートン法を用いて計算を繰り返すことで、型が持つ有効桁数の範囲で解に近い値を求めることができる。
やってみよう
Goの問題は、引数として与えられる数(とする)の平方根(
とする)を求めるアルゴリズム sqrt(k float64)(x float64) を書くというものである。ニュートン法を使って解いてみよう。
引数として与えられたの平方根
を求めることから、
より
という方程式を解けば平方根が求まる。
のときを例に解法を説明する。以下は
の曲線とその接線のグラフである。接線は解
(
)よりも大きな値を適当にとり(
とする)、引いた。
上の図から分かるように、接線の切片
は、
という値をとる。この性質を使い、次は
を元に曲線の接線を引き、
切片を求める。これを繰り返すことで、真の解に近づけていく。反復回数が多いほど精度が上がっていく。グラフでは下記のようになる。
この反復処理は、を
で表す漸化式を求めるとfor文で書ける。
を
で表す式を求める。
接線の傾きは微分で求められる。
の時の接線の傾きは
であり、これはyの変化量をxの変化量で割ったものと等しい。下記を参照のこと。
式にすると、
両辺にをかけて整理すると、以下の式が得られる。
(を
で表す漸化式。
is given.)
この漸化式を用いて、Goでfor文を書くと次のようになる。
関数とループを使った簡単な練習として、 ニュートン法 を使った平方根の計算を実装してみましょう。( ...
おしまい。