付録2 !newton法の計算2 !f(kai) = x^5 - 7x^4 + 16x^3 - 8x^2 -16x +16 = 0 program newton implicit none integer :: i !ループ回数 real :: kai !初期値-4.5e0の解 real :: kai2 !初期値5.0e0の解 real :: f !方程式f(kai) real :: df !fの微分 real :: deruta !kai2の計算誤差 read(5,*) kai, kai2 i = 0 ! -----------------------無限ループ:ここから ------------------------------ 18 continue write(*,*) i, '|', kai, '|', f(kai), '|', kai2, '|', f(kai2),& '|', deruta kai = kai - f(kai)/df(kai) !kaiに対する反復法 kai2 = kai2 - f(kai2)/df(kai2) !kai2に対する反復法 i = i + 1 deruta = 3.0e0*abs(16.0e0*(kai2**3.0e0))*0.5e0*(10.0e0**(-6.0e0)) !kai2 ~ 2の時の計算誤差 if(abs(f(kai2)).lt.deruta) then !f(kai2)の絶対値が計算誤差 !より小さいとき無限ループを脱出する goto 32 !無限ループの脱出32へ行く endif goto 18 !18へ行く ! ----------------------無限ループ:ここまで----------------------------- 32 continue !無限ループからの脱出 write(*,*) i, '|', kai, '|', f(kai), '|', kai2, '|', f(kai2),& !最後の書き出し '|', deruta stop end program newton ! ---------------------関数の設定----------------------------------- real function f(x) !関数fkaiの設定 real :: f !方程式f(x) = x^5 - 7x^4 + 16x^3 - 8x^2 -16x +16 = 0 real :: x !引数 f = (x**5.0e0) - ((7.0e0)*(x**4.0e0)) + (16.0e0)*(x**3.0e0) -& ((8.0e0)*(x**2.0e0)) - (16.0e0)*x + 16.0e0 return end function f real function df(dx) !fkaiのkaiに対する微分関数 real :: df !f(kai)のkai微分 real :: dx !dfの引数 df = (5.0e0)*(dx**4.0e0) - ((28.0e0)*(dx**3.0e0)) +& (48.0e0)*(dx**2) - ((16.0e0)*dx) - 16.0e0 return end function df