Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programas Fortan 3
Programas Fortan 3
Antes de ver la solución numérica de la ecuación diferencial, debemos notar que este diferencial
particular se puede resolver analíticamente:
, donde: y
El método de Euler para resolver la ecuación diferencial numéricamente consiste en reemplazar
la derivada en el lado izquierdo lado con su cociente de Newton, e igual esto con el lado
derecho tal como está. Después de un reordenamiento de los términos, obtenemos
program para
implicit none
real, parameter :: g = 9.8
real k, h, t, t0, tend, v, v0, x
integer i, n
print*, "enter k, h, t0, v(t0), tend:"
read*, k, h, t0, v0, tend
x = (tend - t0) / h
n = int( x + spacing(x)) + 1 ! trip count
t = t0
v = v0
print "(3a10)", "time", "euler", "exact"
do i = 1, n
print "(3f10.2)", t, v, vexact(t, v0, g, k)
v = v + h * (g - k * v * v)
t=t+h
end do
contains
function vexact(t, v0, g, k)
real vexact
real, intent(in) :: g, k, t, v0
real a, c
a = sqrt( g / k )
c = (a + v0) / (a - v0)
vexact = a * (c - exp(-2*a*k*t))/(c + exp(-2*a*k*t))
end function vexact
end program para
Métodos de Runge-Kutta
Hay una variedad de algoritmos, bajo el nombre general de Runge-Kutta, que pueden ser
utilizado para integrar sistemas de ecuaciones diferenciales ordinarias. La fórmula de cuarto
orden es dada a continuación, como referencia. Una derivación de esta y otras fórmulas de
Runge-Kutta puede ser se encuentra en la mayoría de los libros sobre análisis numérico.
Donde
Sistemas de ecuaciones diferenciales: un modelo depredador-presa
donde x (t) y y (t) son el tamaño de la población de las presas y los depredadores
respectivamente, en el momento t, y p, q, r y s son parámetros determinados biológicamente.
Definimos f (x, y) y g (x, y) como los lados derechos de las ecuaciones arriba y abajo,
respectivamente. En este caso, Runge-Kutta estima x * y y * en el tiempo (t + h) se puede
encontrar a partir de x e y en el tiempo t con las fórmulas
Cabe señalar que en este ejemplo x e y son las variables dependientes, y t (que no aparece
explícitamente en las ecuaciones) es la variable independiente.
module drglobal
! global declarations for driver
type vartype ! type for model variables
character(4) name ! name
real inval ! initial value
real val ! current value
end type vartype
subroutine deqs( f )
! evaluates rhs of des
use drglobal
implicit none
real, intent(out) :: f(:)
real, pointer :: prey, pred, p, q, r, s
! model equations are:
! dx/dt = f1 = px - qxy
! dy/dt = f2 = rxy - sy
prey => x(1) ! symbolic aliases ...
pred => x(2) ! ... reduce likelihood of errors
p => params(1) % val
q => params(2) % val
r => params(3) % val
s => params(4) % val
f(1) = p * prey - q * prey * pred
f(2) = r * prey * pred - s * pred
end subroutine deqs
module drutils
! driver utility subroutines
use drglobal
implicit none
interface
subroutine deqs( f ) ! defines model des
real f(:)
end subroutine deqs
end interface
contains
subroutine initialize
! all this info could be read from a disk file
numvars = 2
numparams = 4
allocate( vars(numvars), params(numparams), x(numvars) )
vars(1) % name = "prey"
vars(1) % inval = 105
vars(2) % name = "pred"
vars(2) % inval = 8
params(1) % val = 0.4
params(2) % val = 0.04
params(3) % val = 0.02
params(4) % val = 2.0
vars % val = 0 ! set current values to zero for safety
dt = 1
t=0
runtime = 10
end subroutine initialize
subroutine runge
! 4th order runge-kutta
real :: f(numvars)
real, dimension( numvars ) :: a, b, c, d, v ! working space
!real h
a = 0; b = 0; c = 0; d = 0 ! initialize
v = x ! initialize for runge-kutta
call deqs( f )
a = dt * f
x = v + a / 2 ! v has original x, update x
call deqs( f )
b = dt * f
x=v+b/2
call deqs( f )
c = dt * f
x=v+c
call deqs( f )
d = dt * f
x = v + (a + 2 * b + 2 * c + d) / 6 ! finally update x for return
end subroutine runge
subroutine tidyup
! close files, throw away dynamic storage, etc.
deallocate( vars, params, x )
end subroutine
end module drutils
program driver
! runs differential equations models
! model de must be defined in external subroutine deqs
use drglobal ! global declarations
use drutils ! driver subroutines
implicit none
call initialize
opt = ""
print*, "driver sample model"
print*
do while (opt /= "q" .and. opt /= "q")
print*, "c: tomando los valores finales"
print*, "i: con las condiciones iniciales"
print*, "q: salir"
print*
read*, opt
print*
select case (opt)
case ("c", "c")
x = vars % val
call run
case ("i", "i")
x = vars % inval
t=0
call run
end select
end do
call tidyup
end program driver