====== 反復演算の簡単な応用例 ======
===== ニュートン法 =====
反復計算を利用する簡単な応用例として、ニュートン法((ニュートン法の収束条件などは文献を参照))のプログラムを考える。ニュートン法は、関数f(x)の導関数f{prime}(x)を利用して、反復計算によりf(x)=0の解を求める方法である。f(x)=0の真の解をalphaとするとき、その近傍にある近似解をx_kとする。テイラー展開の1次の項まで用いると、f(alpha)は次のように近似される。
f(alpha) approx f(x_k)+f{prime}(x_k)(alpha~-~x_k)
f(alpha)=0であるので、これにより近似解x_{k+1}が得られる。
alpha approx x_{k+1} = x_k~-~{f(x_k)}/{f {prime}(x_k)}
上記の反復計算の過程は、下図のように表せる。y=f(x)とういう関係を、 \\
点(x_k~,~~f(x_k))を通る接線y=f(x_k) + f{prime}(x_k)(x~-~x_k) approx g(x)で近似する。この近似式から得られるg(x)=0の解、すなわち接線がx軸と交わる点を新しい近似解x_{k+1}とする。この演算を繰り返して、真の解alphaに十分に近い近似解を求める。ニュートン法では、f(x_0)・f{prime}{prime}(x_0)~>0となるように初期値x_0を選ぶと収束解が得られやすいとされている。
{{ :fortran:1基本:1基本プログラム:newton2.jpg?direct& |}}
;#;
ニュートン法の反復過程
;#;
==== 例題 ====
ニュートン法により正の実数alphaの平方根sqrt{alpha}を求めるプログラムを作成する。
ここでは、f(x)=x^2-alphaとして、f(x)=0の正の解を求めることになる。例題の近似解を求める関係式は次のようになる。
x_{k+1}=x_k~-~{x^2_{k}~-~alpha}/{2x_k}
x_kの初期値をalphaとすれば、反復計算により近似解はsqrt{alpha}に近づく。初期値をalphaから新しい近似解を繰り返し求めるプログラムを作成すればよい。
x_{k+1}とx_kとの差が十分に小さくなった時点で反復計算を終了し、近似解や反復回数や誤差を出力する。
* ニュートン法によりsqrt{alpha}を求めるプログラム
program newton_sqrt
impplicit none
real(8) :: x1, x2, a, er, er0=1.0d-6 !er0は許容誤差
integer :: k, km=100 !kmは最大反復回数
write(*,*) 'input a :', !入力を促す表示
read(*,*) a !入力されたデータを変数aに格納
if ( a<= 0.0d0) stop 'a<=0.0d0' !a>0の時計算実行
x1 = a !近似解の初期値をaとする
do k = 1, km !最大km回ループを回す
x2 = x1 - 0.5d0 * ((x1 * x1) - a) / x1 !新しい近似解x2の計算
er = abs(x2 - x1) !x1とx2の差を計算
if ( er < er0) exit !許容誤差以下ならば計算終了
x1 = x2 !x1にx2を入れ替える
end do !doループ終了
write(*,*) 'kai, k, er = ',x2, k, er !近似解,反復回数,誤差の出力
end program newton_sqrt
宣言文中で初期値を指定する場合には、2連コロン「**::**」を入れる。