      program newton
      !newton法の計算１
      !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
