Runge-Kutta method: Difference between revisions
Content added Content deleted
m (→{{header|Fortran}}: slightly cleaner) |
|||
Line 696: | Line 696: | ||
=={{header|Fortran}}== |
=={{header|Fortran}}== |
||
<lang fortran>program rungekutta |
<lang fortran>program rungekutta |
||
implicit none |
|||
real(kind=kind(1.0D0)) :: t,dt,tstart,tstop |
|||
⚫ | |||
tstart =0.0D0 ; tstop =10.0D0 ; dt = 0.1D0 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
do; if ( t .ge. tstop ) exit |
|||
k1 = f (t , y ) |
|||
k2 = f (t+0.5D0 * dt, y +0.5D0 * dt * k1) |
|||
k3 = f (t+0.5D0 * dt, y +0.5D0 * dt * k2) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end do |
|||
⚫ | |||
⚫ | |||
implicit none |
implicit none |
||
integer, parameter :: dp = kind(1d0) |
|||
⚫ | |||
real( |
real(dp) :: t, dt, tstart, tstop |
||
⚫ | |||
⚫ | |||
tstart = 0.0d0 |
|||
⚫ | |||
tstop = 10.0d0 |
|||
</lang> |
|||
dt = 0.1d0 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
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 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
real(dp) :: f |
|||
⚫ | |||
end function f |
|||
⚫ | |||
{{out}} |
{{out}} |
||
<pre> |
<pre> |