目次

反復演算の簡単な応用例

ニュートン法

反復計算を利用する簡単な応用例として、ニュートン法1)のプログラムを考える。ニュートン法は、関数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を選ぶと収束解が得られやすいとされている。

ニュートン法の反復過程

例題

ニュートン法により正の実数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との差が十分に小さくなった時点で反復計算を終了し、近似解や反復回数や誤差を出力する。

list1_8.f90
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連コロン「::」を入れる。
1) ニュートン法の収束条件などは文献を参照