program newton !newton法の計算1 !f(kai) = tanh(kai) + 0.2*kai + 0.3 = 0 implicit none integer :: i !ループ回数 real :: kai !初期値1.1e0の解 real :: kai2 !初期値1.3e0の解 real :: kai3, kai4 !初期値1.3e0の減速の解x^iと減速の式のx^(i+1)の解 real :: eps !マシンイプシロン値 real :: f !方程式f(kai) real :: df !fの微分 real :: mu !減速のための係数 eps = epsilon(0.0e0) read(5,*) kai, kai2 !初期値のキーボード入力 kai3 = kai2 i = 0 mu = 1.0e0 kai4 = 0.e0 ! -----------------------無限ループ:ここから ------------------------------ 23 continue write(*,*) i, '|', kai, '|', f(kai), '|', kai2, '|', f(kai2),& '|', kai3, '|', f(kai3) mu = 1.0e0 !muの初期化 kai = kai - f(kai)/df(kai) !kaiの反復法 kai2 = kai2 - f(kai2)/df(kai2) !kai2の反復法 kai4 = kai3 - mu*(f(kai3)/df(kai3)) !kai2の減速を用いた反復法 if(.not.abs(f(kai4)).lt.(1 - mu*0.25e0)*abs(f(kai3))) then !減速条件|f(x^(i+1))| < (1 - mu/4)*|f(x^i) !を満たさないときにmuを半分にして再度反復法をやってみる mu = mu*0.5e0 kai4 = kai3 - mu*(f(kai3)/df(kai3)) endif kai3 = kai4 i = i + 1 !回数に加算 if(abs(f(kai)).lt.eps) then !f(kai)の絶対値がマシンイプシロン !より小さいとき無限ループを脱出する goto 50 !無限ループの脱出50へ行く endif goto 23 ! ----------------------無限ループ:ここまで----------------------------- 50 continue !無限ループからの脱出 write(*,*) i, '|', kai, '|', f(kai), '|', kai2, '|', f(kai2),& '|', kai3, '|', f(kai3) !最後の書き出し stop end program newton ! ---------------------関数の設定--------------------------------------- real function f(x) !関数f(kai)の設定 real :: f !方程式f(kai) = tanh(kai) + 0.2*kai + 0.3 = 0 real :: x !fの引数 f = tanh(x) + 0.2e0*x + 0.3e0 return end function f real function df(dx) !fkaiのkaiに対する微分関数の設定 real :: df !f(kai)のkai微分 real :: dx !dfの引数 df = (1.0e0/(cosh(dx)**2.0e0) + 0.2e0) !f(kai)の微分した式 return end function df