! オイラー法を用いて計算するプログラム
! 常備分方程式 dx/dt = 1-x^2, x(0)=0 (0<t<1.6)を求める
! 2013/11/05 村橋 究理基 新規作成

program euler1
implicit none

real(4) :: xn		! x(t(n))
real(4) :: tmin		! tの範囲の最小値
real(4) :: tmax		! tの範囲の最大値
real(4) :: split	! 刻み幅h
real(4) :: time		! tの値
real(4) :: res		! 解析解の結果
real(4) :: err		! 解析解との差
integer :: loop		! ループ回数のカウンター
real(4) :: func		! 常備分方程式

! 初期値
xn = 0.0e0

! 計算するtの範囲
tmin = 0.0e0
tmax = 1.6e0

! 刻み幅hの値
split = 0.02e0

! ループ回数のカウント
loop = 0

! 時間の初期値
time = tmin

do while(time < tmax)

	! 解析解の計算
	res = tanh(time)
	! 誤差の計算
	err = res - xn

	! 結果の出力
	write(*, *) loop, '回目', 't=', time, xn, ' 誤差', err

	! ループ回数を1増やす
	loop = loop + 1

	! x(n)を用いてx(n+1)を計算
	xn = xn + split * func(xn)

	! timeの更新
	time = time + split

enddo

endprogram

! xの値に応じてdx/dt=f(x(t))の値を求めるプログラム
real(4) function func(x)
implicit none

real(4) :: x

func = 1.0e0 - x**2

return

endfunction

