!    2011/06/16
!    euler法
!
!    dx/dt=1-x**2
!    x(0)=0
!    (0<=t<=1.6)


!---------------メインプログラム-------------------
program euler1
  implicit none
  integer :: loop ! ループカウンター
  integer :: in   ! ループ変数
  integer :: hh   ! 刻み回数
  real :: min     ! 時間の始端
  real :: max     ! 時間の終端
  real :: time    ! 変数t
  real :: xx      ! x_nの値
  real :: xn      ! x_(n+1)の値
  real :: error   ! 数値解と解析解の誤差

  ! x(0)=0であると設定
  xx=0.0e0

  !時間の始端と終端を設定
  min=0.0e0
  max=1.60e0

  !刻み回数hhを決める
  write(*,*) '刻み回数を入力 >'
  read(*,*) hh

  ! ループ変数の初期値を設定
  loop=0

  ! timeが1.6になるまで
  do in=0,hh

     !時間の設定
     time=(max-min)*real(in)/real(hh)

     ! ループ変数を更新
     loop=loop+1

     ! xnを求める
     xn=xx+(max-min)/real(hh)*(1.0e0-xx**2.0e0)

     ! 誤差の更新
     error=abs(xx-tanh(time))

     ! ループ回数と解を表示
     write(*,*) loop,time,xx,error

     ! xxの更新
     xx=xn

  end do

end program euler1
