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