PROGRAM EXERCISE29 IMPLICIT NONE ! z方向の運動方程式を解くプログラム REAL*8 :: t, v, z, h = 1.0d-1 REAL*8 :: k1, k2, k3, k4, l1, l2, l3, l4 ! 初期値を代入 t = 0.0d0 z = 0.0d0 v = 100.0d0 ! 初期値を出力 PRINT *, t, v, z DO ! ルンゲクッタ法で計算 k1 = h*v l1 = h*f(t,v,z) k2 = h*(v + l1/2.0d0) l2 = h*f(t+h/2.0d0,v+l1/2.0d0, z+k1/2.0d0) k3 = h*(v + l2/2.0d0) l3 = h*f(t+h/2.0d0,v+l2/2.0d0, z+k2/2.0d0) k4 = h*(v + l3) l4 = h*f(t+h,v+l3, z+k3) ! 1ステップ進める t = t + h z = z + (k1+2.0d0*k2+2.0d0*k3+k4)/6.0d0 v = v + (l1+2.0d0*l2+2.0d0*l3+l4)/6.0d0 ! 1ステップ先の値を出力 PRINT *, t, v, z ! zが負(地面に接触)でDOループから抜ける IF( z < 0.0 ) EXIT END DO CONTAINS ! vの一回微分項を計算する関数副プログラム FUNCTION f(t,v,z) REAL*8, INTENT(IN) :: t,v,z REAL*8 :: f, g, km g = 9.80d0 km = 0.5d0 f = -g - km * v RETURN END FUNCTION f END PROGRAM EXERCISE29