Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cap10 - Integración de EDOs - Problema de Valor Inicial
Cap10 - Integración de EDOs - Problema de Valor Inicial
Jesús Cardenal
28-04-2020
Capítulo 10
10.1. Introducción
Sistema de ecuaciones diferenciales ordinarias: ecuaciones simultáneas en las que aparecen relacio-
nadas algebraicamente varias funciones de la misma variable y sus derivadas respecto a la variable.
Problema de valor inicial: son conocidos los valores iniciales de la función y sus derivadas. No se conocen
otros valores intermedios de la función o sus derivadas. Es distinto por ejemplo del problema de extremos o de
contorno en donde además del valor inicial de la función y sus derivadas se conocen los valores de la función en
el contorno. Son problemas diferentes y tienen tratamientos diversos. Para aclarar la diferencia, considérese
el problema de calcular la deformada de una viga. Si la viga está en voladizo (un extremo empotrado y
otro libre) hay que integrar la ecuación de la elástica desde el empotramiento a lo largo de x con condiciones
iniciales (se conoce que el desplazamiento y los giros en el empotramiento, cuando x = 0 son nulos). Si la viga
estuviese biempotrada (los dos extremos empotrados), se conocen los valores de la función y sus derivadas
en un extremo, pero la integración de la elástica tiene que dar como resultado en el otro extremo los valores
conocidos. El primer caso es un problema de valor inicial; el segundo, un problema de extremos.
La solución analítica de esta ecuación es complicada porque es no lineal en ϕ (la función no aparece
explícitamente, sino dentro de la función seno).
En torno a la posición de equilibro estático (posición vertical), el ángulo ϕ es cero o muy pequeño. En
esta situación, el seno y el ángulo son infinitésimos equivalentes. Entonces la ecuación (10.1) se reescribe
como:
lϕ̈ + gϕ = 0 (10.2)
Esta última ecuación sí se puede integrar analíticamente. En concreto, si se prueban soluciones armónicas
de la forma,
ϕ = cest
se llega a obtener la solución
ϕ(t) = k cos (ωt + θ)
con
g
r
ω=
l
Los valores de ϕ y ϕ̇ en el instante inicial (deben ser conocidos puesto que es un problema de valor
inicial), permiten calcular el valor de las constantes k y θ.
En todo caso, como se ha dicho, esta sería la solución del problema de pequeñas oscilaciones en torno
a la posición de equilibrio, pero no resolvería la posición del péndulo en el caso general de la ecuación
(10.1).
Caída de un paracaidista
Se considera el paracaidista de la figura 10.2. Sobre él actúa la
fuerza de la gravedad y la de retención del paracaídas. Se supone Cv2+Kx
que esta última tiene un término proporcional al cuadrado de la
velocidad de avance y otro que depende de la altura.
El modelo matemático de la caída de un objeto sometido a la
acción del campo gravitatorio, se puede formular estableciendo el
equilibrio de fuerzas. En este caso,
mg − Cv 2 + Kx = ma (10.3)
donde x es el espacio, v la velocidad, a la aceleración, m la masa
y C y K dos constantes que dependen de la forma del paracaídas
y del medio en que se realiza el lanzamiento.
Teniendo en cuenta que la velocidad y la aceleración son la prime-
ra y segunda derivadas del espacio respecto al tiempo, la ecuación
(10.3) se escribe de nuevo:
mg − C ẋ2 + Kx = mẍ (10.4)
mg
Que es una ecuación diferencial ordinaria de segundo orden cuya
integración analítica también puede complicarse.
Figura 10.2: Caída del paracaidista
Los procedimientos funcionan indistintamente para ecuaciones o para sistemas de ecuaciones diferen-
ciales ordinarias de primer orden.
Las ecuaciones diferenciales, (10.1) y (10.4) que modelan matemáticamente el comportamiento del péndulo
y la caída del paracaidista son ordinarias. Ambos problemas pueden clasificarse también como problemas de
valor inicial porque se suponen conocidas las funciones en el origen: habrá unos valores concretos para la
posición y velocidad en el instante inicial t = 0.
Sin embargo, son de segundo orden y, por tanto, no cumplen uno de los supuestos que se han hecho y así
no se pueden integrar.
En general, cualquier ecuación o sistema de ecuaciones de orden superior al primero se puede reducir
a un sistema de ecuaciones de primer orden con tal de introducir cuantas funciones nuevas sean necesarias
para rebajar el orden. Por ejemplo, la ecuación del péndulo (10.1), se puede transformar en un sistema de
primer orden si se introduce la función ω(t), velocidad angular que, como se sabe es w(t) = ϕ̇(t). Entonces
la ecuación lϕ̈ + gϕ = 0 se transforma en un sistema:
ω − ϕ̇ = 0
(10.7)
lω̇ + g sen ϕ = 0
En esta última expresión, además de la función ϕ y sus derivadas, aparece la función ω y las suyas. Con el
resultado de que una ecuación diferencial de segundo orden se ha transformado en un sistema de ecuaciones
diferenciales de primer orden. Entonces ya se cumple la primera de las condiciones para aplicar un integrador
numérico.
Para cumplir la segunda condición, y adaptar el sistema a la expresión general de la ecuación (10.6), se
reescribe de la siguiente forma:
ϕ̇ = ω
g (10.8)
ω̇ = − g sen ϕ
l
Donde las derivadas de las funciones se escriben en función de las propias funciones y de la variable inde-
pendiente (en este caso la variable independiente no aparece explícitamente). En un caso general, ω̇ y ϕ̇
dependerían de ω, ϕ y t.
Para reducir el orden de la ecuación (10.4) de la caída del paracaidista, hay que introducir la función
v = ẋ. Entonces, se llegaría al sistema de primer orden:
v − ẋ = 0
2 (10.9)
mv̇ + Cv + Kx = mg
ẋ = v
C 2 K (10.10)
v̇ = g − v − x
m m
En ambos casos, las derivadas de las funciones están desacopladas y es posible despejarlas explícitamente.
No siempre ocurre así. En la práctica es más común encontrar sistemas donde las variables están acopladas.
Para completar la explicación de la reducción del orden ecuaciones se introduce otro caso de estudio que
lleva a un planteamiento más general.
Movimiento ideal de un péndulo doble en un plano vertical sometido al campo gravitatorio
El péndulo doble de la figura 10.3 evoluciona libremente por la acción de su propio peso en un plano
vertical. Se pretende conocer su posición en cada instante de tiempo durante los 5 segundos que siguen
al abandono de la posición inicial. Son conocidas sus magnitudes físicas y el estado inicial.
Si se eligen como grados de libertad los ángulos ϕ1 y ϕ2 , la aplicación de las ecuaciones de Lagrange
para definir el movimiento del mecanismo, conduce a un sistema de ecuaciones diferenciales que tiene
la siguiente forma:
m1 L21 + I1 + 4m2 L21 2m2 L1 L2 cos (ϕ1 − ϕ2 ) ϕ̈1
=
2m2 L1 L2 cos (ϕ1 − ϕ2 ) m2 L22 + I2 ϕ̈
2
(10.11)
−2m 2
2 L1 L2 ϕ̇2 sen (ϕ1 − ϕ2 ) − (m1 + 2m2 ) gL1 sen ϕ1
=
2m2 L1 L2 ϕ̇21 sen (ϕ1 − ϕ2 ) − m2 gL2 sen ϕ2
O
2L1
ϕ1 1
m1 g
2
ϕ2
m2g
2L2
Nuevamente las ecuaciones del movimiento contienen derivadas segundas. Por tanto, habrá que introducir
alguna función nueva que permita reducir el orden del sistema de ecuaciones (10.11). Como en los casos
anteriores, se introducen las funcines ω1 = ϕ̇1 y ω2 = ϕ̇2 . Entonces, ϕ̈1 = ω̇1 y ϕ̈2 = ω̇2 . Y así, el sistema de
ecuaciones se reescribe, una vez reducido el orden, de la siguiente manera:
m1 L21 + I1 + 4m2 L21 2m2 L1 L2 cos (ϕ1 − ϕ2 ) 0 0 ω̇1
2
2m2 L1 L2 cos (ϕ1 − ϕ2 ) m L + I 0 0 ω̇2
2 2 2
=
0 0 1 0 ϕ̇1
0 0 0 1 ϕ̇2
(10.12)
−2m2 L1 L2 ω22 sen (ϕ1 − ϕ2 ) − (m1 + 2m2 ) gL1 sen ϕ1
2
2m2 L1 L2 ω1 sen (ϕ1 − ϕ2 ) − m2 gL2 sen ϕ2
=
ω1
ω2
Este sistema de ecuaciones relaciona un vector de derivadas con los valores de las funciones y la variable
independiente. Si se llama R a la matriz de los coeficientes, ẏ al vector de incógnitas y b al de los términos
independientes, se puede escribir,
ẏ = R−1 b (10.13)
que tiene la forma de la expresión general de la segunda condición (10.6).
Las derivadas de las funciones no se pueden despejar explícitamente. Cada vez que haya que calcularlas a
partir de los valores de las funciones y la variable independiente habrá que resolver el sistema de ecuaciones
lineales (10.12).
Aclaradas las condiciones preliminares para abordar la integración numérica, antes de pasar a la expli-
cación de los métodos, es conveniente tener presente que todos ellos son fórmulas de recurrencia que van
obteniendo sucesivos valores de la función o funciones para valores crecientes de la variable independiente1 a
partir de los valores anteriores.
Por ejemplo, si se toma el problema del péndulo simple, la variable independiente es el tiempo. Al tratarse
de un problema de valor inicial, deben ser conocidos los valores de la función o funciones en el instante
inicial. En ese caso, supóngase que para t = 0, ϕ = π/2 y ω = 0. Esto es, el péndulo parte del reposo y está
inicialmente en situación horizontal. A partir de esa situación, los métodos de integración van obteniendo
nuevos valores de la función o funciones (en este caso nuevos valores del ángulo ϕ y velocidad angular ω) a
medida que se va incrementando la variable (el tiempo).
Cada nuevo valor se obtiene a partir de los anteriores y no es posible saber cuánto vale la función en un
instante determinado si no se ha calculado su valor en todos los anteriores. Así, si se quisiese saber dónde está
el péndulo y qué velocidad angular tiene 5 s después de comenzar a evolucionar libremente, habría que partir
de la posición en t = 0 que es dato, después calcular la posición en ∆t, 2∆t, . . . hasta llegar a 5 segundos.
Cada uno de los instantes que se suceden se denomina etapa y el salto entre una y otra es el tamaño del
1
Es común que la variable independiente sea el tiempo, pero no es exclusivo. Hay fenómenos que dependen del espacio,
la temperatura, la concentración de un reactivo, ... A lo largo de este capítulo se emplea el tiempo como variable indepen-
diente porque hablar de instantes consecutivos es más intituitivo que refereirse al incremento de otras posibles variables. Esta
particularización no resta generalidad a los planteamientos o métodos.
paso de integración o tamaño de etapa. La elección de este tamaño de etapa que se denotará en adelante como
h, tiene mucha trascendencia en el funcionamiento del método: un tamaño demasiado grande puede hacer que
el proceso de integración no funcione (diverja) y un tamaño demasiado pequeño ralentizaría innecesariamente
los cálculos.
Como se verá, todas las fórmulas de recurrencia de los métodos que se exponen a continuación proceden de
desarrollos matemáticos en los que en algún momento se introduce una aproximación. Estas aproximaciones
pueden ser tratadas como errores de truncamiento. En definitiva, cada vez que se aplica la fórmula se introduce
un error. Además, como las fórmulas obtienen los valores de la función en una etapa a partir de los valores en
las etapas anteriores (que supuestamente han sido calculados con cierto error), a ese error de truncamiento
inherente a las fórmulas de integración, se añade el acumulado de aplicarlas de forma recurrente.
Esta es la razón por la que a cada método se le atribuye un error de truncamiento local (el de cada paso de
integración) y otro error de truncamiento global (el acumulado al aplicar sucesivamente las fórmulas) hasta
llegar al valor final de la variable independiente.
ÿξ 2
yi+1 = yi + f (yi , ti )h + h (10.17)
2 yi
Identificando términos entre las expresiones (10.15) y
(10.17) se puede afirmar que el error de truncamiento lo-
cal es proporcional al cuadrado del tamaño del paso de y(t)
integración, O(h2 ). Se puede demostrar2 que el error de h
truncamiento global es proporcional a h, O(h).
La interpretación geométrica de la integración se re-
presenta en la figura 10.4.
Desde un punto de vista práctico, la integración por
este método exige aplicar la fórmula (10.15) una vez tras
ti ti+1
otra (método recursivo) hasta alcanzar el valor de la va-
riable independiente que se proponga en el estudio.
Figura 10.4: Representación gráfica Euler adelante.
El código de Matlab para la aplicación de este proce-
dimiento podría ser el siguiente:
2
Brice Carnahan, H. A. Luther y James O. Wilkes. Applied numerical methods. New York: Wiley, 1969.
function y = eulerAdelante(deriv,param,y0,xFin,h)
% y = eulerAdelante(deriv,param,y0,xFin,h)
%
% Calcula el valor de la función o funciones desde el valor inicial de la
% variable hasta el valor final xFin mediante el procedimiento de Euler
% adelante.
% Son datos de entrada el nombre de la función que evalúa la derivada o
% derivadas, los valores inciales de la función o funciones, el valor final
% de la variable independiente (hasta dónde se quiere integrar la solución),
% el tamaño del paso de integración y los posible parámetros del problema
% (masas, longitudes, etc) que se pasarán como tercer argumento a la
% función que evalúa las derivadas.
if nargin < 5, h=0.01; end % Valor por defecto del paso de integración
if nargin < 4
error('Faltan parámetros. Los cuatro primeros son obligatorios');
end
end
Nótese que, por generalidad, la llamada a la función que evalúa las derivadas con feval(), pasa los
valores de la función o funciones en el estado actual, el valor de la variable independiente y los parámetros
característicos del problema. En los ejemplos que se han propuesto las expresiones del modelo matemático no
dependen explícitamente de la variable independiente (el tiempo) así que ese parámetro no tendrá utilidad,
pero sí será necesario en otros casos más generales.
Para integrar una ecuación diferencial por este método con el código que se propone, hay que escribir
un fichero que calcule las derivadas en función de las funciones y la variable independiente. En el caso del
péndulo simple del primer ejemplo de la sección 10.1.2, la función podría ser la que se muestra a continuación,
que se encarga de calcular los valores de ϕ̇ y ω̇ de acuerdo con la expresión (10.8):
function der = penduloSimple (y,t,param)
% der = penduloSimple (y,t,param)
% Calcula el vector de derivadas del péndulo simple (sistema de ec.
% diferenciales) a partir de los valores de y, de t (no aparace en la
% fórmula del trapecio) y de los parámetros del problema.
% El vector y de entrada contiene los valores de
% y = [angulo phi
% velocidad angular omega]
der=[y(2)
-9.81/L*sin(y(1))];
end
Entonces, si la longitud del péndulo es 1 m, la situación inicial viene dada por ϕ0 = π/2 rad, ω0 = 0 rad s−1 ,
se quiere conocer la evolución del péndulo durante 5 s a partir del momento inicial y se emplea un paso de
integración h = 0.01 s, hay que llamar al integrador de la siguiente manera:
>> y=eulerAdelante('penduloSimple',[pi/2;0],5,0.01,1);
El vector y de salida contiene los valores de ϕ y ω a lo largo del tiempo. Se puede comprobar de forma gráfica
la evolución del péndulo dibujando las sucesivas posiciones que va ocupando. Para ello solo hace falta conocer
ϕ (primera fila de la matriz y). La llamada a la función de dibujo es:
>> dibujoPenduloSimple(y(1,:))
function dibujoPenduloSimple(phi,fig,L)
% dibujoPenduloSimple(phi,fig,L)
% Dibuja todas las posiciones del péndulo simple a partir de los valores de
% phi calculados y la longitud del péndulo L. Lo "pinta" en la figura fig
for i=1:posiciones
plot([0 L*sin(phi(i))],[0 -L*cos(phi(i))]);
axis([-1.5*L,1.5*L,-1.5*L,0.5]);
drawnow;
end
end
Si se hace la prueba se comprobará que lo que debería ser un movimiento armónico, con variaciones
del ángulo entre π/2 y −π/2, según lo calculado es un movimiento con amplitud creciente (el péndulo va
ganando energía y llega cada vez más alto). Se recomienda repetir la prueba con diferentes valores del paso
de integración h.
Más adelante se proporcionan las funciones para calcular las derivadas en el caso del ejemplo del péndulo
doble. Podría ser un buen ejercicio tratar de adelantarse, escribir la función penduloDoble análoga a la que
se propone para el péndulo simple y probarla con el integrador de Euler adelante.
Mientras el error relativo aproximado sea mayor que un cierto valor prefijado, calcular sucesivos valores
(j)
yi+1 mediante la expresión recursiva,
(j) (j−1)
yi+1 ' yi + hf (yi+1 , ti+1 ) (10.20)
Al finalizar esta iteración se habrá obtenido el valor de yi+1 y se podrá comenzar con la siguiente etapa
en el proceso de integración. Es importante recalcar que en la ecuación (10.20) yi permanece invariable.
En general, se puede afirmar (más adelante en este capítulo se ilustrará con un ejemplo) que los métodos
implícitos son más estables (más robustos) que los explícitos del mismo orden. Además, los implícitos tienden
a introducir amortiguamiento en el sistema.
La función de Matlab para efectuar la integración por este procedimiento sería:
function y = eulerAtras(deriv,param,y0,xFin,h,tol,maxite)
% y = eulerAtras(deriv,param,y0,xFin,h,tol,maxite)
%
% Calcula el valor de la función o funciones desde el valor inicial de la
% variable hasta el valor final xFin mediante el procedimiento de Euler
% atrás.
% Son datos de entrada el nombre de la función que evalúa la derivada o
% derivadas, los valores inciales de la función o funciones, el valor final
% de la variable independiente (hasta dónde se quiere integrar la solución),
% el tamaño del paso de integración y los posible parámetros del problema
% (masas, longitudes, etc) que se pasarán como tercer argumento a la
% función que evalúa las derivadas.
% Euler atrás
y(:,i+1)=y(:,i)+h*feval(deriv,yNew,x,param);
era=norm(y(:,i+1)-yNew)/norm(y(:,i+1));
yNew=y(:,i+1);
ite=ite+1;
end
i=i+1;
end
end
>> y=eulerAtras('penduloSimple',1,[pi/2;0],5);
>> dibujoPenduloSimple(y(1,:),2)
En este caso se ha llamado a la función de dibujo con un 2 como segundo parámetro para que represente la
evolución del péndulo en una ventana nueva (la simulación con Euler adelante se representó en la ventana
1). Si se conservan las ventanas de dibujo de Matlab se pueden comparar los resultados finales de ambas
simulaciones para comprobar que la posición al cabo de 5 s es muy diferente en uno y otro caso (se parecen
más si el tamaño del paso de integración h es muy pequeño). Además es notorio cómo en este último caso,
el péndulo va perdiendo energía. Esta es la manifestación de ese efecto de introducir amortiguamiento en el
sistema que es común a los métodos implícitos.
function y = heun(deriv,param,y0,xFin,h)
% y = heun(deriv,param,y0,xFin,h)
%
% Calcula el valor de la función o funciones desde el valor inicial de la
% variable hasta el valor final xFin mediante el procedimiento de Heun.
% Son datos de entrada el nombre de la función que evalúa la derivada o
% derivadas, los valores inciales de la función o funciones, el valor final
% de la variable independiente (hasta dónde se quiere integrar la solución),
% el tamaño del paso de integración y los posible parámetros del problema
% (masas, longitudes, etc) que se pasarán como tercer argumento a la
% función que evalúa las derivadas.
if nargin < 5, h=0.01; end % Valor por defecto del paso de integración
if nargin < 4
error('Faltan parámetros. Los cuatro primeros son obligatorios');
end
nstep=xFin/h+1;
end
La integración por este método del sistema de EDO’s del péndulo simple conduce a otro resultado (se
puede compara con los anteriores si se dibuja en una tercera ventana pasando un 3 como segundo argumento
a la función de dibujo). En este caso, la impresión es de mayor estabilidad: el péndulo quizá pierde un poco
h
yi+1 = yi +
[f (yi , ti ) + f (yi+1 , ti+1 )] (10.24)
2
Como en el caso de la fórmula de Euler Atrás, para conocer el valor de las funciones yi+1 en la etapa i + 1
hay que iterar en j hasta la convergencia con la fórmula recurrente:
(j) hh
(j−1)
i
yi+1 = yi + f (yi , ti ) + f yi+1 , ti+1 (10.25)
2
(0)
La primera estimación para iniciar esta iteración en j se hace por la formula de Euler adelante: yi+1 =
yi + hf (yi , ti ).
La Regla del Trapecio es A-estable4 . Como en el caso del método de Heun, el error de truncamiento local
es proporcional a h3 , O(h3 ) y el global a h2 , O(h2 ). En la medida en que es un método implícito, introducirá
amortiguamiento en el sistema.
4
El comportamiento de un método de integración numérica en un problema rígido (stiff ) se puede analizar aplicando ese
método a la integración de la ecuación diferencial y 0 = λy sujeta a la condición inicial y(0) = 1 con λ ∈ C. La solución analítica
de la ecuación diferencial es y(t) = eλt . Esta solución tiende a cero cuando t → ∞ para valores de k tal que <(λ) < 0. Si el
método numérico se comporta de la misma manera (la solución tiende a cero cuando la variable tiende a infinito) al integrar la
ecuación empleando un tamaño de etapa fijo, entonces se dice que el método es A-estable.
[m,n]=size(y0);
if n > m
y0=y0';
m=n;
end
% trapecio
era=2; ite=0;
while era > tol && ite < maxite
% Trapecio
y(:,i+1)=y(:,i)+h/2*(derivi+feval(deriv,yNew,x,param));
era=norm(y(:,i+1)-yNew)/norm(y(:,i+1));
yNew=y(:,i+1);
ite=ite+1;
end
i=i+1;
end
end
Se puede comprobar que, como en el caso de Heun, la apariencia de la oscilación del péndulo es buena:
no pierde ni gana energía. Al ser la regla del trapecio un método implícito introduce amortiguamiento, pero
no es apreciable.
I2=m2/12*(2*L2)^2;
% Término independiente
tind=[-2*m2*L1*L2*y(2)^2*sin(y(3)-y(4))-(m1+2*m2)*9.81*L1*sin(y(3));
2*m2*L1*L2*y(1)^2*sin(y(3)-y(4))-m2*9.81*L2*sin(y(4))];
end
Los parámetros del problema son: masas, m1 = 3.0 kg y m2 = 5.0 kg; semilongitudes, L1 = 0.5 m y
L2 = 0.5 m. Condiciones iniciales: ω1 = −5 rad s−1 , ω2 = 1 rad s−1 , ϕ1 = π/2 rad, ϕ2 = π/2 rad. Entonces,
para integrar 5 s por la regla del trapecio, habrá que ejecutar:
>> y=trapecio('penduloDoble',[3;5;0.5;0.5],[-5;1;pi/2;pi/2],5);
Téngase en cuenta el orden en que se proporcionan los parámetros del problema y las condiciones iniciales.
En el vector de salida y, cada columna contiene ordenados los valores de ω1 , ω2 , ϕ1 y ϕ2 porque es el
orden en el que se ha escrito el sistema de ecuaciones de la expresión (10.12).
A la función de dibujo hay que pasarle los valores de los ángulos:
>> dibujoPenduloDoble(y(3,:),y(4,:),5)
function dibujoPenduloDoble(phi1,phi2,fig,l1,l2)
% dibujoPenduloDoble(phi1,phi2,fig,l1,l2)
% Dibuja las posiciones del péndulo doble dadas por los angulos phi1 y
% phi2. La representación se hace en la figura fig. l1 y l2 son las
% semilongitudes de las barras.
end
Donde Φ(yi , ti , h) es una evaluación compleja de la derivada que combina las derivadas en varios puntos
intermedios entre i e i + 1. En concreto esta función tiene la forma siguiente:
Φ(yi , ti , h) = a1 k1 + a2 k2 + . . . + an kn (10.27)
En la ecuación anterior, los valores de a1 , a2 , ..., an son constantes y k1 , k2 , ..., kn corresponden a evaluaciones
de la derivada conforme a las expresiones:
k1 = f (yi , ti )
k2 = f (yi + q11 hk1 , ti + p1 h)
k3 = f (yi + q21 hk1 + q22 hk2 , ti + p2 h)
k4 = f (yi + q31 hk1 + q32 hk2 + q33 hk3 , ti + p3 h) (10.28)
..
.
kn = f (yi + qn−1,1 hk1 + qn−1,2 hk2 + qn−1,3 hk3 + . . . + qn−1,n−1 hkn−1 , ti + pn−1 h)
Donde los parámetros qjm y pj son constantes.
Puede entenderse entonces que la expresión (10.27) corresponde a un promedio especial de derivadas en
el intervalo [i, i + 1].
A continuación se van a deducir los coeficientes del método de Runge–Kutta explícito de orden 2.
Para poder aplicar esta fórmula de integración hay que determinar los valores de a1 , a2 , q11 , y p1 . El
procedimiento para deducir el valor de estas constantes se basa en identificar los términos de la expresión
(10.32) con los que provienen de realizar el desarrollo en serie de la función y sus derivadas.
En concreto, la serie de Taylor para los valores de la función y en la etapa i + 1 se escribe como:
1
yi+1 = yi + f (yi , ti )h + f 0 (yi , ti )h2 + O(h3 ) (10.33)
2
Teniendo en cuenta por una lado que la derivada de la función y, f (y, t) depende de y y de t y, por otro
que y(t) es una función del tiempo, entonces, aplicando la regla de derivación en cadena, la derivada de f (y, t)
será:
∂f (yi , ti ) dy(ti ) ∂f (yi , ti ) ∂f (yi , ti ) ∂f (yi , ti )
f 0 (yi , ti ) = + = f (yi , ti ) + (10.34)
∂y dt ∂t ∂y ∂t
Sustituyendo este valor de f 0 (yi , ti ) en el lugar que ocupa en la expresión (10.33), se llega a:
!
1 ∂f (yi , ti ) ∂f (yi , ti ) 2
yi+1 = yi + f (yi , ti )h + f (yi , ti ) + h + O(h3 ) =
2 ∂y ∂t
(10.35)
1 ∂f (yi , ti ) 1 ∂f (yi , ti ) 2
= yi + f (yi , ti )h + f (yi , ti )h2 + h + O(h3 )
2 ∂y 2 ∂t
Esta forma de expresar yi+1 a partir del desarrollo en serie se va a comparar con la fórmula de Runge-
Kutta de orden 2 de la expresión (10.32) para identificar términos y poder determinar los valores de los
parámetros.
Antes de efectuar la comparación es preciso expresar el valor de k2 de la fórmula (10.31) de otra manera.
En concreto, dado que k2 = f (yi + ∆yi , ti + ∆t), donde ∆yi = q11 hk1 y ∆t = p1 h, se podrá escribir el
desarrollo en serie:
∂f (yi , ti ) ∂f (yi , ti )
k2 = f (yi , ti ) + q11 hk1 + p1 h + O(h2 ) (10.36)
∂y ∂t
Introduciendo esta expresión de k2 en la fórmula (10.32) de Runge–Kutta de orden 2, donde se ha tenido
en cuenta que k1 = f (yi , ti ), se llega a:
" !#
∂f (yi , ti ) ∂f (yi , ti )
yi+1 = yi + h a1 f (yi , ti ) + a2 f (yi , ti ) + q11 hf (yi , ti ) + p1 h + O(h2 ) (10.37)
∂y ∂t
function y = RK2(deriv,param,y0,xFin,h,factores)
% y = RK2(deriv,param,y0,xFin,h,factores)
%
% Calcula el valor de la función o funciones desde el valor inicial de la
% variable hasta el valor final xFin mediante el procedimiento de
% Runge-Kutta de orden 2.
% Son datos de entrada el nombre de la función que evalúa la derivada o
% derivadas, los valores inciales de la función o funciones, el valor final
% de la variable independiente (hasta dónde se quiere integrar la solución),
% el tamaño del paso de integración y los posible parámetros del problema
% (masas, longitudes, etc) que se pasarán como tercer argumento a la
% función que evalúa las derivadas. Además, en el vector factores se
% proporcionan los propios del método.
if nargin < 4
error('Faltan parámetros. Los cuatro primeros son obligatorios');
end
for x=h:h:xFin
k1=feval(deriv,y(:,i),x,param);
k2=feval(deriv,y(:,i)+q11*h*k1,x+p1*h,param);
y(:,i+1)=y(:,i)+h*(a1*k1+a2*k2);
i=i+1;
end
end
h
yi+1 = yi + (k1 + 4k2 + k3 ) (10.46)
6
Con
k1 = f (yi , ti )
1 1
k2 = f yi + hk1 , ti + h (10.47)
2 2
k3 = f (yi − hk1 + 2hk2 , ti + h)
El método de Runge-Kutta de orden 3 se usa con mucha frecuencia. El error de truncamiento local es
proporcional a la cuarta potencia del tamaño del paso de integración, O(h4 ) y el global al cubo de ese paso,
O(h3 ).
Debe resultar casi trivial elaborar una función de Matlab para implementar este método a partir de la
que se propone para el procedimiento de Runge–Kutta de orden 2.
h
yi+1 = yi + (k1 + 2k2 + 2k3 + k4 ) (10.48)
6
Con,
k1 = f (yi , ti )
1 1
k2 = f yi + hk1 , ti + h
2 2 (10.49)
1 1
k3 = f yi + hk2 , ti + h
2 2
k4 = f (yi + hk3 , ti + h)
La implementación de este método en Matlab es trivial a partir de la función que se propone para el
método explícito de orden 2.
Existen otras fórmulas de Runge-Kutta explícitas de orden superior, de dos etapas, implícitas, etc. que
pueden consultarse en cualquier texto apropiado.
donde los βkB son coeficientes cuyo valor se determina por el procedimiento que se explica más adelante7 .
Dependiendo del número de términos en el sumatorio de la expresión (10.50); esto es, del valor de n, se
tendrá una fórmula de orden 2, 3, ...
6
Prediction-correction en la bibliografía en inglés.
7
El superíndice B indica que son coeficientes de Bashforth. Más adelante se empleará superíndice M para los de Moulton.
fi − fi−1 fi00
fi0 = + h + O(h2 ) (10.56)
h 2
Sustituyendo esta expresión de fi0 en la fórmula (10.54), se tiene:
1 fi − fi−1 fi00
" ! #
1
yi+1 = y i + h fi + + h + O(h2 ) h + fi00 h2 + . . . =
2 h 2 3!
(10.57)
3 1 5
= yi + h fi − fi−1 + fi00 h2 + O(h3 )
2 2 12
Ordenando y agrupando, se llega a la fórmula de Adams–Bashforth de segundo orden:
3 1 5
yi+1 = yi + h fi − fi−1 + fξ00 h3 (10.58)
2 2 12
Esta fórmula es explícita, tiene un error de truncamiento local O(h3 ) y global O(h2 ). Si se compara esta
última expresión con la que se ha propuesto como fórmula general de segundo orden en la ecuación (10.51),
se identifican los valores de β0B = 23 y β1B = − 12 .
Si en vez de tomar tres términos, el desarrollo en serie se truncase a partir del cuarto, se obtendrían los
coeficientes para la fórmula de orden 3 de la expresión (10.52). El cuadro 10.1 compendia los valores de estos
coeficientes para las fórmulas de Adams-Bashforth hasta el orden 6. Es importante hacer notar que en este
caso los coeficientes son fijos (no existen indeterminaciones como en las fórmulas de Runge–Kutta)
Órden β0B β1B β2B β3B β4B β5B Truncamiento local O(hn+1 )
1 0
1 1 2
f (ξ)h2
3 5 00
2 2
− 12 12
f (ξ)h3
23 9 000
3 12
− 16
12
5
12 24
f (ξ)h4
55
4 24
− 59
24
37
24
9
− 24 251 (4)
720
f (ξ)h5
1901
5 720
− 2774
720
2616
720
− 1274
720
251
720
475 (5)
1440
f (ξ)h6
4277
6 1440
− 7923
1440
9982
1440
− 7298
1440
2877
1440
475
− 1440 19087 (6)
60480
f (ξ)h7
n−1
βkM f (yi+1−k , ti+1−k ) + O(hn+1 )
X
yi+1 = yi + h (10.59)
k=0
donde los βkM son coeficientes cuyo valor se determina por un procedimiento análogo al que se ha explicado
en la sección 10.3.1.
La fórmula (10.59) es implícita. Para verlo con más claridad se particulariza para n = 2 y entonces se
obtiene: h i
yi+1 = yi + h β0M f (yi+1 , ti+1 ) + β1M f (yi , ti ) + O(h3 ) (10.60)
Así, para calcular el valor de yi+1 se emplean las derivadas en el instante i+1 e i. Pero para calcular f (yi+1 , ti+1 )
es preciso conocer yi+1 que es precisamente lo que se pretende calcular ... La fórmula es implícita: hará falta
una estimación de yi+1 para comenzar una iteración de punto fijo hasta la convergencia.
En general para todas las fórmulas de Adams–Moulton, la estimación inicial se hace con una fórmula de
Adams–Bashforth del mismo orden.
El planteamiento general para la obtención de los coeficientes es similar al del Adams–Bashforth: a partir
de un desarrollo en serie en el que se introducen las expresiones de las derivadas obtenidas a partir de otros
desarrollos en serie.
Por ejemplo, para la fórmula de orden 2 se parte del desarrollo en serie de Taylor,
1 0 2 1 00 3
yi = yi+1 − fi+1 h + fi+1 h − fi+1 h + ... (10.61)
2 3!
Despejando yi+1 ,
1 0 1 00 2
yi+1 = yi + h fi+1 − fi+1 h + fi+1 h + ... (10.62)
2 3!
0
Para aproximar el valor de la derivada fi+1 se recurre al desarrollo en serie de fi ,
0 1 00 2
fi = fi+1 − fi+1 h + fi+1 h + ... (10.63)
2
0
De donde se despeja fi+1 ,
0 fi+1 − fi 1 00
fi+1 = + fi+1 h + . . . (10.64)
h 2
0
Introduciendo el valor de fi+1 en el desarrollo de la expresión 10.62 se tiene:
" ! #
1 fi+1 − fi 1 00 1 00 2
yi+1 = yi + h fi+1 − + fi+1 h + . . . h + fi+1 h + ... =
2 h 2 3!
(10.65)
1 1 1 00 2 1 00 2
= yi + h fi+1 − fi+1 + fi − fi+1 h + fi+1 h + O(h3 )
2 2 4 3!
Operando y agrupando los términos a partir del segundo orden en el resto correspondiente, se obtiene la
fórmula de Adams–Moulton de segundo orden.
1 1 1
yi+1 = yi + h fi+1 + fi − fξ00 h3 (10.66)
2 2 12
El cuadro 10.2 recoge los valores para las fórmulas de Adams–Moulton de órdenes 2 a 6.
Órden β0M β1M β2M β3M β4M β5M Truncamiento local O(hn+1 )
1 1 1 00
2 2 2
− 12 f (ξ)h3
5 8 1 1 000
3 12 12
− 12 − 24 f (ξ)h4
9 19 5 1 19 (4)
4 24 24
− 24 24
− 720 f (ξ)h5
251 646
5 720 720
− 264
720
106
720
19
− 720 27
− 1440 f (5) (ξ)h6
475 1427 798 482 173 27 863
6 1440 1440
− 1440 1440
− 1440 1440
− 60480 f (6) (ξ)h7
Se puede constatar que, a igualdad de orden del método, Adams–Bashforth y Adams–Moulton tienen el
mismo orden de magnitud en el error de truncamiento, aunque Adams–Moulton, por ser implícito, es más
estable.
Tal como se decía en la introducción, es práctica común emplear los métodos de Adams en combinación:
Adams–Bashforth (explícito) para predecir el nuevo valor de la función o funciones en la etapa i + 1 y
Adams–Moulton para corregir, en lo que se denomina un proceso de predicción–corrección.
Tal como se ha explicado, la aplicación de cualquier método multietapa exige conocer la función o funciones
para varios valores de la variable independiente (no basta con el instante inicial). De ahí que para arrancar
un método multietapa sea necesario emplear un método monoetapa. Para este cometido se suele escoger un
método de Runge–Kutta del mismo orden.
Por ejemplo, si se quisiese emplear un integrador predicción–corrección para alguno de los ejemplos pro-
23 16 5
yi+1 = yi + h f (yi , ti ) − f (yi−1 , ti−1 ) + f (yi−2 , ti−2 ) (10.67)
12 12 12
y corrigiendo con la expresión de Adams–Moulton equivalente,
5 8 1
yi+1 = yi + h f (yi+1 , ti+1 ) + f (yi , ti ) − f (yi−1 , ti−1 ) (10.68)
12 12 12
Se puede comprobar que, para aplicar la fórmula de predicción (10.67), es necesario conocer fi , fi−1 y fi−2 .
Si se trata de un problema de valor inicial, serán calculables las derivadas en el instante inicial, f0 = f (y0 , t0 )
porque y0 es dato. Este valor de f0 se hará corresponder con fi−2 en la fórmula. Por tanto, la primera vez
que se evalúe la expresión de Adams–Bashforth de orden 3 a partir del estado inicial, se concretará en:
23 16 5
yi+1 = yi + h f (y2 , t2 ) − f (y1 , t1 ) + f (y0 , t0 )
12 12 12
Así, resulta patente que para comenzar la integración, además del dato inicial, f0 = f (y0 , t0 ), es imprescin-
dible conocer f1 = f (y1 , t1 ) y f2 = f (y2 , t2 ). Los valores de estas derivadas se calculan a partir de los valores
de la función y estos deben ser obtenidos por un método de integración monoetapa. Tal como se decía, es
común escoger el Runge-Kutta explícito del mismo orden. En el caso del ejemplo, sería un Runge–Kutta de
orden 3 con el que se calculará y1 a partir de y0 e y2 a partir de y1 .
Entonces, para generalizar el supuesto, si se pretende resolver una ecuación o sistema de ecuaciones
diferenciales ordinarias (problema de valor inicial) por un método multietapa de orden n, antes de comenzar
a aplicar las fórmulas propias del método multietapa, hay que calcular n − 1 valores de la función o funciones
por un método monoetapa que tenga un error de truncamiento equivalente (Runge–Kutta del mismo orden).
10.4. Estabilidad
Cualquiera de los métodos expuestos se caracteriza por unos errores de truncamiento local y global. Si el
tamaño del paso de integración no es adecuado, esos errores pueden crecer de tal manera que provoquen el
fallo del proceso y se impida alcanzar el resultado.
Este efecto es particularmente acusado cuando la ecuación o el sistema son rígidos 8 . Para ilustrar cómo
afecta el tamaño de etapa en el proceso de integración se va a estudiar el caso de la ecuación diferencial,
y 0 = λy (10.69)
con λ ∈ C e y(0) = 1.
Suponiendo que la variable independiente sea t, la solución analítica de esta ecuación para t > 0 es:
y(t) = eλt (10.70)
8
En matemáticas, una ecuación es stiff si ciertos métodos de integración son numéricamente inestables (devergen), salvo que
se escoja un tamaño del paso de integración h extremadamente pequeño. Es difícil definir de manera precisa la rigidez en este
contexto, pero la idea es que la ecuación tiene algunos términos (exponentes con un valor grande, por ejemplo) que hacen que
el valor de la solución varíe rápidamente (gran pendiente).
Si se considera que h es el tamaño del paso de integración, para un cierto tn = n · h, la función solución
valdrá,
y(tn ) = yn = eλnh (10.71)
Para comprobar el comportamiento de los métodos numéricos de integración, se va a comparar este
resultado analítico con el que se obtendría si la ecuación diferencial se integrase por los métodos de Euler
adelante y Euler Atrás.
n(n − 1) 2 2
(1 + λh)n = 1 + nλh + λ h + ... (10.79)
2
A su vez, el desarrollo en serie de la solución exacta de la expresión (10.70) es:
1 1
enλh = 1 + nλh + n2 λ2 h2 + n3 λ3 h3 + . . . (10.80)
2 6
Comparando las expresiones (10.79) y (10.80), se constata que solo coinciden exactamente los dos primeros
términos. A partir del tercero, son del mismo orden, pero no iguales.
Teniendo en cuenta que Euler Adelante es un método con un error de truncamiento global proporcional
a h, O(h), se puede garantizar que si h tiende a cero, la solución en tn converge. Sin embargo, ¿cuánto se
puede aumentar el valor de h manteniendo la estabilidad del método?
Para estudiarlo, se va a imponer la condición de que tanto la solución analítica como la numérica conduzcan
al mismo valor con tn suficientemente grande.
En concreto, la solución analítica cumple10 :
10
Si λ es complejo, basta con que su parte real sea menor que la unidad, ya que: eat eiωt = eat (cos ωt + i sen ωt), donde
(cos ωt + i sen ωt) está acotado.
para que (10.86) converja a cero cuando el tiempo crece suficientemente es:
1
lı́m = 0, con |1 − λh| > 1 (10.87)
n→∞ (1 − λh)n
En este caso, el círculo de radio 1, centrado en el valor 1 de la parte real, marca la región de inestabilidad
(figura 10.8). Esto muestra que la estabilidad del método no depende de una manera tan crítica del valor de h.
En todo caso, hay valores del paso de integración compatibles con la estabilidad, que producen un resultado
numérico idéntico al analítico cuando la variable tiende a infinito, pero que pueden no ofrecer resultados tan
buenos en valores intermedios de la variable.
De este estudio de la estabilidad, se puede concluir que Euler atrás es más estable (su región de estabilidad
es mucho mayor) que Euler adelante. Esta conclusión es extrapolable para afirmar que, en general, los métodos
implícitos son más estables que los explícitos.
También se puede afirmar (sin demostración) que cuanto mayor es el orden de un método, cabe esperar
una mayor precisión para un mismo valor del paso de integración, pero también hay una tendencia mayor a
la inestabilidad (es más crítica la elección de un tamaño de etapa adecuado).
verdadero (diferencia entre la solución exacta y la solución aproximada) aunque sí es posible hacer una
valoración aproximada, comparando dos soluciones. En este sentido, los métodos de integración no son una
excepción: no hay una forma directa de calcular el error verdadero cometido en un paso de integración o en
la integración global de un problema.
Para hacer una estimación del error en cada paso (error de truncamiento local) hay básicamente dos
opciones:
efectuar la integración con un determinado tamaño de etapa mediante dos procedimientos con distinto
orden de error (por ejemplo un método de orden tres y otro de orden cuatro) y comparar los resultados
por uno y otro procedimiento (error relativo aproximado),
efectuar la integración por un mismo método dos veces. La primera con un determinado tamaño del
paso de integración h y la segunda con un paso más pequeño. La forma típica de proceder es reducir a
la mitad el tamaño de etapa. De esta manera, en un caso se calcularía el valor de la función en t + h con
un solo salto de tamaño h y en el otro habría que dar dos saltos de tamaño h/2 para llegar a obtener
yt+h .
Con cualquiera de estas dos estrategias, la comparación del resultado mejor con el resultado peor permite
evaluar un error aproximado.
En algún caso, la cuantificación de este error hace posible corregir el resultado mejor para que sea aún
más preciso. Considérese, por ejemplo, un método cuyo error de truncamiento local sea proporcional a h4 . La
integración desde ti hasta ti+1 se hace dos veces. En primer lugar con un solo salto de tamaño h y después,
con dos saltos de tamaño h/2.
(1)
Si se llama yi+1 al resultado obtenido en el primer caso (con
(2)
un solo salto de tamaño h) e yi+1 al obtenido cuando se dan dos yi +1
saltos de tamaño h/2, al haber reducido el tamaño de etapa a la 1
mitad y depender el error de truncamiento local de h4 , el error yi(2)
+1
se habrá reducido a la dieciseisava parte.
16
La figura 10.9 representa tanto el valor real de la función en 15
ti+1 como los aproximados siguiendo el esquema de integración
descrito. Según el razonamiento que se ha hecho relativo a la
proporción entre los errores de truncamiento local en uno y otro y i(1)
+1
caso, se puede escribir:
(1) (2) (1)
(2)
yi+1 − yi+1 yi+1 − yi+1
yi+1 − yi+1 ' ' (10.88)
16 15
Por eso, si se llama E a la diferencia entre los dos valores
(2) (1)
calculados = yi+1 − yi+1 (téngase en cuenta que el valor real ti ti +1 2 ti +1
de yi+1 no es conocido), se puede estimar que el error cometido
en la mejor aproximación es la quinceava parte de E. Una vez Figura 10.9: Corrección en base a la estimación del
estimado el error es posible corregir esta mejor aproximación: error
(2) (2) E
ȳi+1 = yi+1 + (10.89)
15
La corrección del error produce una mejora en el error de truncamiento local que cambia en uno el orden
del método. Esto es, con la corrección, el error de truncamiento local pasaría de O(h4 ) a O(h5 ).
Respecto a la otra estrategia de evaluar el error, la que consiste en emplear dos métodos con órdenes
diferentes, los casos más típicos se refieren a particularizaciones de fórmulas de Runge–Kutta explícitas.
Recuérdese que la determinación de los coeficientes de estas fórmulas (ver sección 10.2.5) conducían a un
sistema indeterminado y, por tanto, había grados de libertad para elegir los coeficientes de una manera u
otra. Esta circunstancia se aprovecha para conseguir que algunos valores de las derivadas ki de una y otra
fórmulas que se combinan sean comunes y se reduzca así el número de veces que hay que evaluar la derivada.
Un caso concreto es la combinación de una fórmula de Runge–Kutta de orden 4 con otra de orden 5. En
principio, la de orden 4 necesita cuatro derivadas: k41 , k42 , k43 y k44 . La de orden 5 necesita 6: k51 , k52 , k53 ,
k54 , k55 y k56 . En total son 10 derivadas, aunque una de ellas, la primera, es común: k41 ≡ k51 . Así pues, serían
9 derivadas diferentes. Sin embargo, teniendo en cuenta la libertad para escoger los coeficientes, el método
de Runge–Kutta–Fehlberg reduce a 6 el número de evaluaciones de la derivada con arreglo a las siguientes
expresiones11 :
25 1408 2197 1
(4)
yi+1 = yi + h k1 + k3 + k4 − k5 (10.90)
216 2565 4104 5
16 6656 28561 9 2
(5)
yi+1 = yi + h k1 + k3 + k4 − k5 + k6 (10.91)
135 12825 56430 50 55
11
Hay otros métodos similares que combinan las fórmulas de Runge–Kutta de orden 4 y 5. Por ejemplo los de Dormand–
Prince (J Dormand y P. Prince. “A family of embedded Runge–Kutta formulae”. En: Journal of Computational and Applied
Mathematics 6.1 [1980], págs. 19-26. doi: https://doi.org/10.1016/0771-050X(80)90013-3) o Cash–Karpque que dan lugar
a unos coeficientes diferentes a los que se muestran en estas páginas, pero que en síntesis son equivalentes. Fehlberg escoge los
coeficientes para minizar el error del método de orden 4, mientras en Dormand–Prince se escogen para minimizar el de orden 5.
El integrador ode45 de Octave y Matlab implementa las fórmulas de Norman–Prince.
Con:
k1 = f (yi , ti )
1 1
k2 = f (yi + hk1 , ti + h)
4 4
3 9 3
k3 = f (yi + hk1 + hk2 , ti + h)
32 32 8
1932 7200 7296 12 (10.92)
k4 = f (yi + hk1 − hk2 + hk3 , ti + h)
2197 2197 2197 13
439 3680 845
k5 = f (yi + hk1 − 8hk2 + hk3 − hk4 , ti + h)
216 513 4104
8 3544 1859 11 1
k6 = f (yi − hk1 + 2hk2 − hk3 + hk4 − hk5 , ti + h)
27 2565 4104 40 2
Una estrategia para adaptar el tamaño del paso h en el caso de integradores de Runge–Kutta podría ser12 :
α
∆deseada
hnuevo = hactual (10.93)
∆actual
Donde ∆ es la precisión (deseada o actual) y α toma los valores: 0,2, cuando hay que aumentar el tamaño
de h (∆actual ≤ ∆deseada ) y 0,25, cuando hay que reducirlo.
Los parámetros de estas funciones se consultan y cambian con las funciones odeget y odeset.
Se recomienda mirar el help para conocer su utilidad y manejo.
12
William Press y col. Numerical recipes in FORTRAN 77: the art of scientific computing. Fortran Numerical Recipes 1.
Cambridge, England: Cambridge University Press, 1992.
13
Ver https://www.mathworks.com/help/matlab/ordinary-differential-equations.html