Runge-Kutta method: Difference between revisions
m
→{{header|Fortran}}: slightly cleaner
m (→{{header|Fortran}}: slightly cleaner) |
|||
Line 696:
=={{header|Fortran}}==
<lang fortran>program rungekutta
real(kind=kind(1.0D0)) :: y,k1,k2,k3,k4▼
y = 1.0D0▼
t = tstart▼
write(6,'(A,f4.1,A,f12.8,A,es13.6)') 'y(',t,') = ',y,' Error = '&▼
&,abs(y-(t**2+4.0d0)**2/16.0d0)▼
k4 = f (t+ dt, y + dt * k3)▼
y = y + dt *( k1 + 2.0D0 *( k2 + k3 ) + k4 )/6.0D0▼
t = t + dt▼
if(abs(real(nint(t))-t) .le. 1.0D-12) then▼
write(6,'(A,f4.1,A,f12.8,A,es13.6)') 'y(',t,') = ',y,' Error = '&▼
&,abs(y-(t**2+4.0d0)**2/16.0d0)▼
end if▼
contains▼
function f (t,y)▼
implicit none
integer, parameter :: dp = kind(1d0)
real(kind=kind(1.0D0)),intent(in) :: y,t▼
real(
f = t*sqrt(y)▼
tstart = 0.0d0
end program rungekutta▼
tstop = 10.0d0
dt = 0.1d0
▲ t = tstart
do while (t < tstop)
k1 = dt*f(t, y)
k2 = dt*f(t+dt/2, y+k1/2)
k3 = dt*f(t+dt/2, y+k2/2)
end if
▲contains
real(dp) :: f
▲ f = t*sqrt(y)
end function f
▲end program rungekutta</lang>
{{out}}
<pre>
|