Métodos de Runge-Kutta

Introducción

Los métodos de Taylor de orden \(k\) tienen el inconveniente de tener expresiones más complejas a medida que va aumentando \(k\) debido a que las expresiones de la derivada \(k\)-ésima de la solución del problema de valores iniciales \(y^{(k)}\) es cada vez es más compleja y va aumentado de forma exponencial debido a la aplicación de la regla de la cadena.

Esto hace que los métodos de Taylor sean computancionalmente costosos para valores de \(k\) relativamente grandes y usualmente no se usen en la práctica.

Sin embargo, no hemos de olvidar que sabemos que el método de Taylor de orden \(k\) es consistente de orden \(k\), conocimiento que no siempre es tan sencillo de obtener en otro tipo de métodos.

Método de Euler modificado

En esta sección vamos a introducir los métodos de Runge-Kutta.

Veamos primero un ejemplo de método de Runge-Kutta introductorio: el método de Euler modificado: \[ \hat{y}_{i+1}=\hat{y}_i+h f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{h}{2}f(t_i,\hat{y}_i)\right),\ \hat{y}_0 =y_0. \]

Observamos que no usamos las derivadas sucesivas de la función \(f(t,y(t))\) tal como hacíamos en los métodos de Taylor.

En este caso usamos el valor \(t_i+\frac{h}{2}\) y \(\hat{y}_i+\frac{h}{2}f(t_i,\hat{y}_i)\) como valores “cercanos” a \(t_i\) y \(\hat{y}_i\).

Método de Euler modificado

Calculemos el orden de consistencia del método anterior.

El error local de truncamiento será donde recordemos que \(y_i=y(t_i)\) es el valor de la solución exacta en el punto del mallado \(t_i\): \[ \begin{align*} \tau_{i+1} & =\frac{y_{i+1}-y_i}{h}-f\left(t_i+\frac{h}{2},y_i+\frac{h}{2}f(t_i,y_i)\right)\\ & =\frac{y_i+h y'(t_i)+\frac{h^2}{2}y''(t_i)+O(h^3)-y_i}{h}\\ &\quad -\left(f(t_i,y_i)+\frac{h}{2}\frac{\partial f}{\partial t}(t_i,y_i)+\frac{h}{2}\frac{\partial f}{\partial y}(t_i,y_i)f(t_i,y_i)+O(h^2)\right)\\ & = y'(t_i)+\frac{h}{2}y''(t_i)-f(t_i,y_i)-\frac{h}{2}\left(\frac{\partial f}{\partial t}(t_i,y_i)+\frac{\partial f}{\partial y}(t_i,y_i)f(t_i,y_i)\right)\\ & \quad +O(h^2) \end{align*} \]

Método de Euler modificado

Ahora, usando que \[ \begin{align*} y'(t_i) & =f(t_i,y_i),\\ y''(t_i) & =\frac{\partial f}{\partial t}(t_i,y_i)+\frac{\partial f}{\partial y}(t_i,y_i)y'(t_i) =\frac{\partial f}{\partial t}(t_i,y_i)+\frac{\partial f}{\partial y}(t_i,y_i)f(t_i,y_i), \end{align*} \] tenemos que \(\tau_{i+1}(h)=O(h^2)\).

Por tanto, el método de Euler modificado tiene orden de consistencia \(2\).

Método de Euler modificado. Pseudocódigo

  • INPUT valores inicial y final \(a\), \(b\), entero \(n\), condición inicial \(y_0\) y función \(f(t,y)\)
  • Set \(h=\frac{b-a}{n}\).
  • Set \(t=a\).
  • Set \(\mathbf{\hat{y}}=\mathbf{0}\). (Definimos inicialmente el vector de aproximaciones como \(0\))
  • Set \(\hat{y}_1=y_0\). (Definimos la primera componente del vector de aproximaciones como la condición inicial)

Método de Euler modificado. Pseudocódigo

  • For i=1,...,n
    • Set \(\hat{y}_{i+1} =\hat{y}_{i}+h f\left(t+\frac{h}{2},\hat{y}_{i}+\frac{h}{2}f(t,\hat{y}_{i})\right)\) (Hallamos el valor \(\hat{y}(t_{i})=\hat{y}(a+ih)\))
    • Set \(t=t+h\). (actualizamos el tiempo \(t\))
  • Print \(\mathbf{\hat{y}}\) (Damos el vector de aproximaciones).

Ejemplo anterior

Recordemos que se trataba de aproximar la solución del siguiente problema de valores iniciales: \[ y'=f(t,y)=\frac{1+t}{1+y},\ 1\leq t\leq 3,\ y(1)=2, \] de solución exacta \(y(t)=\sqrt{t^2+2t+6}-1\).

Vamos a aplicarle el método de Euler modificado para hallar una solución aproximada en el mallado siguiente usando \(h=0.1\).

La ecuación en diferencias a resolver es la siguiente: \[ \begin{align*} \hat{y}_{i+1} & =\hat{y}_i+h f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{h}{2}f(t_i,\hat{y}_i)\right)=\hat{y}_i +h\cdot \frac{\left(1+t_i+\frac{h}{2}\right)}{\left(1+\hat{y}_i+\frac{h}{2}f(t_i,\hat{y}_i)\right)}=\hat{y}_i +h\cdot \frac{\left(1+t_i+\frac{h}{2}\right)}{\left(1+\hat{y}_i+\frac{h}{2}\frac{(1+t_i)}{(1+\hat{y}_i)}\right)}\\ & =\hat{y}_i+\frac{h (\hat{y}_i+1) (h+2 t_i+2)}{h (t_i+1)+2 (\hat{y}_i+1)^2},\ \hat{y}_0=2. \end{align*} \]

Ejemplo (continuación)

Vamos a aplicarle el método de Euler modificado para hallar una solución aproximada en el mallado siguiente usando \(h=0.1\): \[ t_i=1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. \] \[ \begin{align*} \hat{y}(1.1) & = \hat{y}(1)+\frac{h\cdot (\hat{y}(1)+1)\cdot (h+2\cdot1+2)}{h\cdot (1+1)+2\cdot (\hat{y}(1)+1)^2}=2+\frac{0.1\cdot (2+1)\cdot (0.1+2\cdot1+2)}{0.1\cdot (1+1)+2\cdot (2+1)^2}= 2.0675824,\\ \hat{y}(1.2) & = \hat{y}(1.1)+\frac{h\cdot (\hat{y}(1.1)+1)\cdot (h+2\cdot1.1+2)}{h\cdot (1.1+1)+2\cdot (\hat{y}(1.1)+1)^2}\\ & =2.0675824+\frac{0.1\cdot (2.0675824+1)\cdot (0.1+2\cdot1.1+2)}{0.1\cdot (1.1+1)+2\cdot (2.0675824+1)^2}= 2.1368968,\\ \hat{y}(1.3) & = \hat{y}(1.2)+\frac{h\cdot (\hat{y}(1.2)+1)\cdot (h+2\cdot1.2+2)}{h\cdot (1.2+1)+2\cdot (\hat{y}(1.2)+1)^2}\\ & =2.1368968+\frac{0.1\cdot (2.1368968+1)\cdot (0.1+2\cdot1.2+2)}{0.1\cdot (1.2+1)+2\cdot (2.1368968+1)^2}= 2.2078307,\\ & \vdots \end{align*} \]

Ejemplo (continuación)

La siguiente tabla muestra los valores de las soluciones aproximada y exacta en los puntos del mallado:

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
1 2 2 0
1.1 2.0675824 2.0675723 0.0000101
1.2 2.1368968 2.1368774 0.0000193
1.3 2.2078307 2.207803 0.0000278
1.4 2.2802793 2.2802439 0.0000354
1.5 2.3541443 2.354102 0.0000423
1.6 2.4293342 2.4292856 0.0000486

Ejemplo (continuación)

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
1.7 2.5057639 2.5057096 0.0000542
1.8 2.5833538 2.5832946 0.0000593
1.9 2.6620305 2.6619667 0.0000638
2 2.7417252 2.7416574 0.0000678
2.1 2.8223743 2.822303 0.0000713
2.2 2.9039187 2.9038443 0.0000745
2.3 2.9863035 2.9862263 0.0000772

Ejemplo (continuación)

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
2.4 3.0694776 3.069398 0.0000796
2.5 3.1533937 3.1533119 0.0000817
2.6 3.2380076 3.237924 0.0000836
2.7 3.3232784 3.3231933 0.0000851
2.8 3.409168 3.4090815 0.0000864
2.9 3.4956409 3.4955534 0.0000876
3 3.5826642 3.5825757 0.0000885

Ejemplo (continuación)

El método de Euler modificado está implementado en:

Método de Runge-Kutta 4

Uno de los métodos más usados es el método de Runge-Kutta 4 cuya expresión es la siguiente: \[ \begin{align*} \hat{y}_{i+1} & = \hat{y}_i +\frac{h}{6}(k_1+2k_2+2k_3+k_4),\\ k_1 & = f(t_i,\hat{y}_i),\\ k_2 & = f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{h k_1}{2}\right),\\ k_3 & = f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{h k_2}{2}\right),\\ k_4 & = f(t_i+h,\hat{y}_i + h k_3),\ \hat{y}_0=y_0 \end{align*} \] Observemos que sigue la filosofía de los métodos de Runge-Kutta, es decir, está definido en función de valores “cercanos” al valor “actual” \((t_i,\hat{y}_i)\) sin que intervengan las derivadas \(k\)-ésimas de la función \(f(t,y(t))\).

Método de Runge-Kutta 4

Proposición.

El orden de consistencia del método de Runge-Kutta 4 es \(4\).

La proposición anterior es la razón que el método se denomine método de Runge-Kutta 4.

Demostración de la proposición

Hemos de demostrar que: \[ \tau_{i+1}(h)=\frac{y_{i+1} - y_i}{h} -\frac{1}{6}(k_1+2k_2+2k_3+k_4)=O(h^4), \] donde recordemos que \(y_i=y(t_i)\).

La expresión anterior es equivalente a: \[ h\tau_{i+1}(h)=y_{i+1} - y_i -\frac{h}{6}(k_1+2k_2+2k_3+k_4)=O(h^5). \] En primer lugar desarrollamos \(y_{i+1}=y(t_{i+1})=y(t_i+h)\) usando el desarrollo de Taylor alrededor de \(t=t_i\): \[ \begin{align*} y_{i+1} & =y_i+h y'(t_i)+\frac{h^2}{2} y''(t_i)+\frac{h^3}{6} y'''(t_i)+\frac{h^4}{24} y^{(iv)}(t_i)+O(h^5),\\ &= y_i +h f(t_i,y_i)+\frac{h^2}{2} f'(t_i,y_i)+\frac{h^3}{6} f''(t_i, y_i)+\frac{h^4}{24} f'''(t_i,y_i)+O(h^5) \end{align*} \]

Demostración de la proposición (continuación)

donde recordemos que: \[ \begin{align*} y'(t_i) & =f_i,\\ y''(t_i) & =f'(t_i,y_i) =f_{t,i}^{(1)}+f_{y,i}^{(1)}f_i,\\ y'''(t_i) & =f''(t_i,y_i) = f_{t,i}^{(2)}+2 f_{t,y,i}^{(1,1)}f_i+f_{y,i}^{(2)}f_i^2+f_{y,i}^{(1)}f_{t,i}^{(1)}+\left(f_{y,i}^{(1)}\right)^2 f_i,\\ y^{(iv)}(t_i) & = f'''(t_i,y_i) = f_{y,i}^{(3)} f_i^3+\left(4 f_{y,i}^{(1)} f_{y,i}^{(2)} +3 f_{t,y,i}^{(1,2)}\right)f_i^2\\ &\quad +\left((f_{y,i}^{(1)})^3+5 f_{t,y,i}^{(1,1)} f_{y,i}^{(1)}+3\left(f_{y,i}^{(2)} f_{t,i}^{(1)} + f_{t,y,i}^{(2,1)}\right)\right) f_i\\ & \quad +f_{t,i}^{(1)}\left((f_{y,i}^{(1)})^2+3 f_{t,y,i}^{(1,1)}\right)+f_{y,i}^{(1)} f_{t,i}^{(2)}+f_{t,i}^{(3)}. \end{align*} \] usando la notación: \[ \begin{align*} f(t_i,y_i) & =f_i,\\ \frac{\partial^j f}{\partial t^j}(t_i,y_i) & =f_{t,i}^{(j)},\\ \frac{\partial^j f}{\partial y^j}(t_i,y_i)& =f_{y,i}^{(j)},\\ \frac{\partial^{j+l} f}{\partial t^j\partial y^l}(t_i,y_i) & =f_{t,y,i}^{(j,l)} \end{align*} \]

Demostración de la proposición (continuación)

Por tanto, \[ \begin{align*} y_{i+1} & = y_i +h f_i +\frac{h^2}{2} (f_{t,i}^{(1)}+f_{y,i}^{(1)}f_i)\\ & \quad +\frac{h^3}{6} \left(f_{t,i}^{(2)}+2 f_{t,y,i}^{(1,1)}f_i+f_{y,i}^{(2)}f_i^2+f_{y,i}^{(1)}f_{t,i}^{(1)}+\left(f_{y,i}^{(1)}\right)^2 f_i\right)\\ & \quad +\frac{h^4}{24} \left(f_{y,i}^{(3)} f_i^3+\left(4 f_{y,i}^{(1)} f_{y,i}^{(2)} +3 f_{t,y,i}^{(1,2)}\right)f_i^2 +\left((f_{y,i}^{(1)})^3+5 f_{t,y,i}^{(1,1)} f_{y,i}^{(1)}+3\left(f_{y,i}^{(2)} f_{t,i}^{(1)} + f_{t,y,i}^{(2,1)}\right)\right) f_i\right.\\ & \quad \left. +f_{t,i}^{(1)}\left((f_{y,i}^{(1)})^2+3 f_{t,y,i}^{(1,1)}\right)+f_{y,i}^{(1)} f_{t,i}^{(2)}+f_{t,i}^{(3)}\right)+O(h^5) \end{align*} \]

A continuación desarrollemos las funciones \(k_i\), \(i=1,2,3,4\) usando el desarrollo de Taylor de dos variables en un entorno del punto \((t_i,y_i)\):

Demostración de la proposición (continuación)

\[ \begin{align*} k_1 & = f_i,\\ k_2 & = f\left(t_i+\frac{h}{2},y_i+\frac{h k_1}{2}\right)= f_i+\frac{h}{2}\left(f_{t,i}^{(1)}+f_i f_{y,i}^{(1)}\right) +\frac{h^2}{8}\left(f_{t,i}^{(2)}+2 f_i f_{t,y,i}^{(1,1)}+f_i^2 f_{y,i}^{(2)}\right)\\ & \quad +\frac{h^3}{48}\left(f_{t,i}^{(3)}+3 f_i^2 f_{t,y,i}^{(1,2)}+3 f_i f_{t,y,i}^{(2,1)}+f_i^3 f_{y,i}^{(3)}\right)+O(h^4),\\ k_3 & = f\left(t_i+\frac{h}{2},y_i+\frac{hk_2}{2}\right) = f_i + \frac{h}{2}\left(f_{t,i}^{(1)}+f_i f_{y,i}^{(1)}\right)\\ &\quad +\frac{h^2}{8}\left(f_{t,i}^{(2)}+2 f_i ((f_{y,i}^{(1)})^2+f_{t,y,i}^{(1,1)})+2 f_{t,i}^{(1)} f_{y,i}^{(1)}+f_i^2 f_{y,i}^{(2)}\right)\\ & \quad + \frac{h^3}{48}\left(f_{t,i}^{(3)}+3 f_i (2f_{y,i}^{(2)} f_{t,i}^{(1)}+4 f_{y,i}^{(1)} f_{t,y,i}^{(1,1)}+f_{t,y,i}^{(2,1)})+3 f_{y,i}^{(1)} f_{t,i}^{(2)}+3 f_i^2 \left(3f_{y,i}^{(1)} f_{y,i}^{(2)}+f_{t,y,i}^{(1,2)}\right)+6 f_{t,i}^{(1)} f_{t,y,i}^{(1,1)}+f_i^3 f_{y,i}^{(3)}\right)\\ & \quad + O(h^4),\\ k_4 & = f(t_i+h,y_i + hk_3)=f_i + h\left(f_{t,i}^{(1)}+f_i f_{y,i}^{(1)}\right)\\ & \quad + \frac{h^2}{2}\left(f_{t,i}^{(2)}+ f_i ((f_{y,i}^{(1)})^2+2f_{t,y,i}^{(1,1)})+f_{t,i}^{(1)} f_{y,i}^{(1)}+f_i^2 f_{y,i}^{(2)}\right)\\ & \quad + \frac{h^3}{24}\left(4f_{t,i}^{(3)}+6 f_i ((f_{y,i}^{(2)})^3 f_{t,i}^{(1)}+3 f_{y,i}^{(1)} f_{t,y,i}^{(1,1)}+2(f_{y,i}^{(2)}f_{t,i}^{(1)}+f_{t,y,i}^{(2,1)}))+3 f_{y,i}^{(1)} f_{t,i}^{(2)}+3 f_i^2 \left(5f_{y,i}^{(1)} f_{y,i}^{(2)}+4f_{t,y,i}^{(1,2)}\right)\right. \\ & \quad\ \left.+6 f_{t,i}^{(1)} ((f_{y,i}^{(1)})^2 +2f_{t,y,i}^{(1,1)})+4f_i^3 f_{y,i}^{(3)}\right)+ O(h^4) \end{align*} \]

Demostración de la proposición (continuación)

Calculemos la expresión de \(\frac{h}{6}(k_1+2k_2+2k_3+k_4)\): \[ \begin{align*} \frac{h}{6}(k_1+2k_2+2k_3+k_4) & = h f_i +\frac{h^2}{2}\left(f_{t,i}^{(1)}+f_i f_{y,i}^{(1)}\right)+\frac{h^3}{6}\left(f_{t,i}^{(2)}+2 f_{t,y,i}^{(1,1)}f_i+f_{y,i}^{(2)}f_i^2+f_{y,i}^{(1)}f_{t,i}^{(1)}+\left(f_{y,i}^{(1)}\right)^2 f_i\right) \\ & +\frac{h^4}{24} \left(f_{y,i}^{(3)} f_i^3+\left(4 f_{y,i}^{(1)} f_{y,i}^{(2)} +3 f_{t,y,i}^{(1,2)}\right)f_i^2 +\left((f_{y,i}^{(1)})^3+5 f_{t,y,i}^{(1,1)} f_{y,i}^{(1)}+3\left(f_{y,i}^{(2)} f_{t,i}^{(1)} + f_{t,y,i}^{(2,1)}\right)\right) f_i\right.\\ & \quad \left. +f_{t,i}^{(1)}\left((f_{y,i}^{(1)})^2+3 f_{t,y,i}^{(1,1)}\right)+f_{y,i}^{(1)} f_{t,i}^{(2)}+f_{t,i}^{(3)}\right)+O(h^5). \end{align*} \] Observamos que los coeficientes de \(h\), \(h^2\), \(h^3\) y \(h^4\) coinciden con el desarrollo de Taylor de la función \(y_{i+1}=y(t_i+h)\). Por tanto, \[ h\tau_{i+1}(h)=y_{i+1} - y_i -\frac{h}{6}(k_1+2k_2+2k_3+k_4)=O(h^5), \] tal como queríamos ver.

Método de Runge-Kutta 4. Pseudocódigo

  • INPUT valores inicial y final \(a\), \(b\), entero \(n\), condición inicial \(y_0\) y función \(f(t,y)\)
  • Set \(h=\frac{b-a}{n}\).
  • Set \(t=a\).
  • Set \(\mathbf{\hat{y}}=\mathbf{0}\). (Definimos inicialmente el vector de aproximaciones como \(0\))
  • Set \(\hat{y}_1=y_0\). (Definimos la primera componente del vector de aproximaciones como la condición inicial)

Método de Runge-Kutta 4. Pseudocódigo

  • For i=1,...,n
    • Set \(k_1=f(t,\hat{y}_{i})\) (definimos los \(k_i, i=1,2,3,4\))
    • Set \(k_2=f\left(t+\frac{h}{2},\hat{y}_{i}+\frac{hk_1}{2}\right)\)
    • Set \(k_3=f\left(t+\frac{h}{2},\hat{y}_{i}+\frac{hk_2}{2}\right)\)
    • Set \(k_4=f\left(t+h,\hat{y}_{i}+h k_3\right)\)
    • Set \(\hat{y}_{i+1} =\hat{y}_{i}+\frac{h}{6}(k_1+2k_2+2k_3+k_4)\) (Hallamos el valor \(\hat{y}(t_i)=\hat{y}(a+ih)\))
    • Set \(t=t+h\). (actualizamos el tiempo \(t\))
  • Print \(\mathbf{\hat{y}}\) (Damos el vector de aproximaciones).

Ejemplo anterior

Recordemos que se trataba de aproximar la solución del siguiente problema de valores iniciales: \[ y'=f(t,y)=\frac{1+t}{1+y},\ 1\leq t\leq 3,\ y(1)=2, \] de solución exacta \(y(t)=\sqrt{t^2+2t+6}-1\).

Vamos a aplicarle el método de Runge-Kutta 4 para hallar una solución aproximada en el mallado siguiente usando \(h=0.1\).

La ecuación en diferencias a resolver es la siguiente: \(\hat{y}_{i+1} =\hat{y}_i+\frac{h}{6}(k_1+2k_2+2k_3+k_4)\), con: \[ \begin{align*} k_1 & = f(t_i,\hat{y}_i)=\frac{1+t_i}{1+\hat{y}_i},\\ k_2 & = f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{hk_1}{2}\right)=\frac{1+t_i+\frac{h}{2}}{1+\hat{y}_i+\frac{hk_1}{2}},\\ \\ k_3 & = f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{hk_2}{2}\right)=\frac{1+t_i+\frac{h}{2}}{1+\hat{y}_i+\frac{hk_2}{2}},\\ \\ k_4 & = f\left(t_i+h,\hat{y}_i+hk_3\right)=\frac{1+t_i+h}{1+\hat{y}_i+hk_3},\ \hat{y}_0=2. \end{align*} \]

Ejemplo (continuación)

Vamos a aplicarle el método de Runge-Kutta 4 para hallar una solución aproximada en el mallado siguiente usando \(h=0.1\): \[ t_i=1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. \] * \(\hat{y}(1.1)\):

\[ \begin{align*} k_1 & = f(1,\hat{y}_0)=f(1,2)=\frac{1+1}{1+2}=0.6666667,\\ k_2 & = f\left(1+\frac{h}{2},\hat{y}_0+\frac{hk_1}{2}\right)=f\left(1+\frac{0.1}{2},2+\frac{0.1\cdot 0.6666667}{2}\right)=\frac{1+1+\frac{0.1}{2}}{1+2+\frac{0.1\cdot 0.6666667}{2}}=0.6758242,\\ \\ k_3 & =f\left(1+\frac{h}{2},\hat{y}_0+\frac{hk_2}{2}\right)= f\left(1+\frac{0.1}{2},2+\frac{0.1\cdot 0.6758242}{2}\right)=\frac{1+1+\frac{0.1}{2}}{1+2+\frac{0.1\cdot 0.6758242}{2}}=0.6757222,\\ \\ k_4 & = f(1+h,\hat{y}_0+h k_3)=f\left(1+0.1,2+0.1\cdot 0.6757222\right)=\frac{1+1+0.1}{1+2+0.1\cdot 0.6757222}=0.6845805,\\ \hat{y}(1.1) & =\hat{y}(1)+\frac{h}{6}(k_1+2k_2+2k_3+k_4)=2+\frac{0.1}{6}(0.6666667+2\cdot 0.6758242+2\cdot0.6757222+0.6845805)\\ & =2.0675723. \end{align*} \]

Ejemplo (continuación)

  • \(\hat{y}(1.2)\): \[ \begin{align*} k_1 & = f(1.1,\hat{y}_1)=f(1.1,2.0675723)=\frac{1+1.1}{1+2.0675723}=0.6845804,\\ k_2 & = f\left(1.1+\frac{h}{2},\hat{y}_1+\frac{hk_1}{2}\right)=f\left(1.1+\frac{0.1}{2},2.0675723+\frac{0.1\cdot 0.6845804}{2}\right)\\ & =\frac{1+1.1+\frac{0.1}{2}}{1+2.0675723+\frac{0.1\cdot 0.6845804}{2}}=0.6931456,\\ \\ k_3 & =f\left(1.1+\frac{h}{2},\hat{y}_1+\frac{hk_2}{2}\right)= f\left(1.1+\frac{0.1}{2},2.0675723+\frac{0.1\cdot 0.6931456}{2}\right)\\ & =\frac{1+1.1+\frac{0.1}{2}}{1+2.0675723+\frac{0.1\cdot 0.6931456}{2}} =0.6930499,\\ \\ k_4 & = f(1.1+h,\hat{y}_1+h k_3)=f\left(1.1+0.1,2.0675723+0.1\cdot 0.6930499\right)\\ & =\frac{1+1.1+0.1}{1+2.0675723+0.1\cdot 0.6930499}=0.7013344, \end{align*} \]

Ejemplo (continuación)

  • \(\hat{y}(1.2)\) (continuación): \[ \begin{align*} \hat{y}(1.2) & =\hat{y}(1.1)+\frac{h}{6}(k_1+2k_2+2k_3+k_4)\\ & =2.0675723+\frac{0.1}{6}(0.6845804+2\cdot 0.6931456+2\cdot0.6930499+0.7013344)\\ & =2.1368774. \end{align*} \]

Y así sucesivamente.

Ejemplo (continuación)

La siguiente tabla muestra los valores de las soluciones aproximada y exacta en los puntos del mallado:

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
1 2 2 0
1.1 2.0675723 2.0675723 \(5\cdot 10^{-10}\)
1.2 2.1368774 2.1368774 \(9.2\cdot 10^{-10}\)
1.3 2.207803 2.207803 \(1.3\cdot 10^{-9}\)
1.4 2.2802439 2.2802439 \(1.6\cdot 10^{-9}\)
1.5 2.354102 2.354102 \(1.8\cdot 10^{-9}\)
1.6 2.4292856 2.4292856 \(2\cdot 10^{-9}\)

Ejemplo (continuación)

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
1.7 2.5057096 2.5057096 \(2.1\cdot 10^{-9}\)
1.8 2.5832946 2.5832946 \(2.3\cdot 10^{-9}\)
1.9 2.6619667 2.6619667 \(2.3\cdot 10^{-9}\)
2 2.7416574 2.7416574 \(2.4\cdot 10^{-9}\)
2.1 2.822303 2.822303 \(2.5\cdot 10^{-9}\)
2.2 2.9038443 2.9038443 \(2.5\cdot 10^{-9}\)
2.3 2.9862263 2.9862263 \(2.5\cdot 10^{-9}\)

Ejemplo (continuación)

\(t_i\) \(\hat{y}_i\) \(y_{i}\) \(|y_i-\hat{y}_i|\)
2.4 3.069398 3.069398 \(2.5\cdot 10^{-9}\)
2.5 3.1533119 3.1533119 \(2.5\cdot 10^{-9}\)
2.6 3.237924 3.237924 \(2.5\cdot 10^{-9}\)
2.7 3.3231933 3.3231933 \(2.5\cdot 10^{-9}\)
2.8 3.4090815 3.4090815 \(2.5\cdot 10^{-9}\)
2.9 3.4955534 3.4955534 \(2.5\cdot 10^{-9}\)
3 3.5825757 3.5825757 \(2.5\cdot 10^{-9}\)

Ejemplo (continuación)

El método de Runge-Kutta 4 se encuentra implementado en:

Métodos de Runge-Kutta

Vamos a generalizar el método de Runge Kutta 4 visto anteriormente.

Un método de Runge-Kutta general es un método de un paso donde la expresión de la ecuación en diferencias tiene la expresión siguiente: \(\hat{y}_{i+1}=\hat{y}_i+h\varphi(t_i,\hat{y}_i),\) donde \[ \begin{align*} \varphi(t_i,\hat{y}_i) & =\sum_{j=1}^J c_j k_j,\\ k_j & = f\left(t_i+h a_j,\hat{y}_i+h\sum_{l=1}^J b_{jl} k_l\right),\ j=1,\ldots,J. \end{align*} \] También suponemos que \(\displaystyle\sum_{l=1}^J b_{jl}=a_j\) de cara a simplificar los cálculos a la hora de calcular el orden de consistencia del método.

Métodos de Runge-Kutta

Analicemos la expresión anterior:

  • Los métodos de Runge-Kutta dependen de valores “cercanos” a \(t_i\): \(t_i+ha_j\), \(j=1,\ldots,J\) donde las \(a_j\) se han de determinar.
  • Un método de Runge-Kutta se suele representar mediante el denominado tablero de Butcher:
\(a_1\) \(b_{11}\) \(b_{12}\) \(\ldots\) \(b_{1J}\)
\(a_2\) \(b_{21}\) \(b_{22}\) \(\ldots\) \(b_{2J}\)
\(\vdots\) \(\vdots\) \(\vdots\) \(\vdots\) \(\vdots\)
\(a_J\) \(b_{J1}\) \(b_{J2}\) \(\ldots\) \(b_{JJ}\)
\(c_{1}\) \(c_{2}\) \(\ldots\) \(c_{J}\)

Métodos de Runge-Kutta

  • donde
    • en la primera columna aparece el vector \(\mathbf{a}=(a_1,\ldots,a_J)\) de coeficientes de \(h\) en la definición de las \(k_j\), \(j=1,\ldots,J\),
    • en la última fila aparece el vector \(\mathbf{c}=(c_1,\ldots,c_J)\) de coeficientes de \(k_j\) en la definición de \(\varphi(t_i,\hat{y}_i)\) y
    • en la tabla aparece la matriz \(\mathbf{B}=\begin{bmatrix}b_{11} & b_{12} & \ldots & b_{1J}\\ b_{21} & b_{22} & \ldots & b_{2J}\\ b_{J1} & b_{J2} & \ldots & b_{JJ}\end{bmatrix}\) de coeficientes de \(k_l\) en la definición de las \(k_j\), \(j=1,\ldots,J\).
  • Si la matriz \(\mathbf{B}\) anterior de dimensiones \(J\times J\) es estrictamente triangular inferior con ceros en la diagonal, el método será explícito y, en caso contrario, será implícito.

Métodos de Euler modificado

  • Recordemos que la suma de todas las filas excepto la primera componente nos da la primera columna: \(\displaystyle\sum_{l=1}^J b_{jl}=a_j\)

Vamos a escribir el método de Euler modificado según la notación anterior: \(\hat{y}_{i+1}=\hat{y}_i+h\varphi(t_i,\hat{y}_i),\) con \[ \begin{align*} \varphi(t_i,\hat{y}_i) & =k_2,\\ k_1 & = f(t_i,\hat{y}_i),\\ k_2 & = f\left(t_i+\frac{h}{2},\hat{y}_i+\frac{h}{2}k_1\right). \end{align*} \]

Métodos de Euler modificado

Por tanto, el valor de \(J\) vale \(J=2\) y el tablero de Butcher vale en este caso:

\(0\) \(0\) \(0\)
\(\frac{1}{2}\) \(\frac{1}{2}\) \(0\)
\(0\) \(1\)

Como la matriz \(\mathbf{B}\) es triangular inferior con ceros en la diagonal, el método es explícito.

Métodos de Runge-Kutta 4

En el caso del método de Runge-Kutta 4, el valor de \(J\) vale \(J=4\) y el tablero de Butcher vale en este caso:

\(0\) \(0\) \(0\) \(0\) \(0\)
\(\frac{1}{2}\) \(\frac{1}{2}\) \(0\) \(0\) \(0\)
\(\frac{1}{2}\) \(0\) \(\frac{1}{2}\) \(0\) \(0\)
\(1\) \(0\) \(0\) \(1\) \(0\)
\(\frac{1}{6}\) \(\frac{1}{3}\) \(\frac{1}{3}\) \(\frac{1}{6}\)

Como la matriz \(\mathbf{B}\) es triangular inferior con ceros en la diagonal, el método es explícito.

Métodos de Runge-Kutta

  • Si uno quiere usar un método implícito de Runge-Kutta, el valor de \(J\) es pequeño debido a la complejidad del algoritmo.
  • La ventaja de los métodos de Runge-Kutta es que no requieren el cálculo de las derivadas de la función \(f(t,y(t))\) tal como pasaba en los métodos de Taylor.
  • La desventaja de dichos métodos es el cálculo del orden de la consistencia que suele ser bastante tedioso tal como hemos visto en el caso del método de Runge-Kutta 4.
  • Para calcular el orden de la consistencia de un método de Runge-Kutta se tiene que aplicar el desarrollo de Taylor de una función de dos variables.

Consistencia en los métodos de Runge-Kutta

Si nos fijamos en los métodos de Euler modificado y de Runge-Kutta 4, la suma de las componentes del vector \(\mathbf{c}\) vale \(1\). La proposición siguiente nos dice que siempre suman \(1\) si queremos que el método sea consistente:

Consistencia en los métodos de Runge-Kutta.

Un método de Runge-Kutta es consistente si, y sólo si, \(\displaystyle\sum_{j=1}^J c_j=1\).

Demostración de la proposición

Recordemos que un método numérico \[ \hat{y}_{i+1}=\hat{y}_i +h\varphi(t_i,\hat{y}_i),\ \hat{y}_0=y_0, \] es consistente si \[ \lim_{h\to 0}\tau_{i+1}(h)=\lim_{h\to 0}\frac{\hat{y}_{i+1}-\hat{y}_i}{h}-\varphi(t_i,\hat{y}_i)=0. \] para todo \(i=0,\ldots,n\).

En el caso de un métode de Runge-Kutta, obtenemos: \[ \begin{align*} \lim_{h\to 0}\tau_{i+1}(h) & =\lim_{h\to 0}\frac{y_{i+1}-y_i}{h}-\varphi(t_i,y_i)=\lim_{h\to 0}\frac{y_{i+1}-y_i}{h}-\sum_{j=1}^J c_j k_j\\ & =\lim_{h\to 0}f(\xi_i,y(\xi_i))-\sum_{j=1}^J c_j f\left(t_i+h a_j,\hat{y}_i+h\sum_{l=1}^J b_{jl} k_l\right), \end{align*} \] donde recordemos que \(y_i=y(t_i)\) y \(\xi_i\in (t_i,t_{i+1})\). Por tanto, si \(h\to 0\), \(\xi_i\to t_i\).

Demostración de la proposición (continuación)

Calculando el límite anterior, obtenemos: \[ \lim_{h\to 0}\tau_{i+1}(h)= f(t_i,y_i)-\left(\sum_{j=1}^J c_j\right)f(t_i,y_i)=f(t_i,y_i)\left(1-\sum_{j=1}^J c_j\right). \] Por tanto, el método es consistente, o \(\displaystyle\lim_{h\to 0}\tau_{i+1}(h)=0\) si, y sólo si \(\displaystyle 1-\sum_{j=1}^J c_j=0\), o \(\displaystyle\sum_{j=1}^J c_j=1\), tal como queríamos ver.

Convergencia en los métodos de Runge-Kutta

En el caso de los métodos de Runge-Kutta, la convergencia y la consistencia son equivalentes:

Proposición: convergencia en los métodos de Runge-Kutta.

Si un método de Runge-Kutta es convergente, es consistente.

Si un método de Runge-Kutta es consistente, explícito y además la función \(f\) del problema de valores iniciales \(y'=f(t,y),\ a\leq t\leq b,\ y(a)=y_0\) verifica la condición de Lipschitz respecto la segunda variable con constante de Lipschitz \(L\) para valores de \(h\) suficientemente pequeños, el método es convergente con el mismo orden que el orden de consistencia.

Demostración de la proposición

Veamos que si el método es convergente, entonces es consistente.

Si el método de Runge-Kutta es convergente, en particular lo será para el problema de valores inicial trivial: \[ y'=1,\ 0\leq t\leq b,\ y(0)=0, \] cuya solución exacta es \(y(t)=t\).

Si aplicamos un método de Runge-Kutta al problema anterior, la ecuación en diferencias será la siguiente: \[ \hat{y}_{i+1}=\hat{y}_i + h\sum_{j=1}^J c_j, \] ya que \(f(t,y)=1\) para todo valor de \(t\) e \(y\).

Usando que \(\hat{y}_0 =0\), se puede demostrar por inducción de forma facil que \(\displaystyle\hat{y}_i =i h\sum_{j=1}^J c_j = t_i\sum_{j=1}^J c_j\).

Demostración de la proposición (continuación)

Como el método es convergente, \[ \lim_{h\to 0}\hat{y}_i-y_i =\lim_{h\to 0}\hat{y}_i-t_i =\lim_{h\to 0}t_i\sum_{j=1}^J c_j-t_i=\lim_{h\to 0}t_i\left(1-\sum_{j=1}^J c_j\right)=0, \] para todo valor de \(t_i\).

En particular, tiene que ser cierto para \(t_n=b\): \[ \lim_{h\to 0}t_n\left(1-\sum_{j=1}^J c_j\right)=b \lim_{h\to 0}\left(1-\sum_{j=1}^J c_j\right)=0, \] lo que implica que \(\displaystyle 1-\sum_{j=1}^J c_j=0\), o \(\displaystyle\sum_{j=1}^J c_j=1\) y, usando la proposición anterior, tenemos que el método es consistente.

Demostración de la proposición (continuación)

Supongamos que el método es consistente, explícito y que la función \(f\) del problema de valores iniciales \(y'=f(t,y),\ a\leq t\leq b,\ y(a)=y_0\) verifica la condición de Lipschitz respecto la segunda variable con constante de Lipschitz \(L\).

Entonces el método de Runge-Kutta tendrá la forma siguiente: \(\hat{y}_{i+1}=\hat{y}_i+h\varphi(t_i,\hat{y}_i),\) donde \[ \begin{align*} \varphi(t_i,\hat{y}_i) & =\sum_{j=1}^J c_j k_j,\\ k_1 & = f(t,\hat{y}_i),\\ k_j & = f\left(t_i+h a_j,\hat{y}_i+h\sum_{l=1}^{j-1} b_{jl} k_l\right),\ j=2,\ldots,J. \end{align*} \] Veamos que las funciones \(k_j\) verifican la condición de Lipschitz respecto la segunda variable con una constante de Lipschit \(L_j\):

  • \(j=1\): \(k_1=f\) y como \(f\) verifica la condición de Lispchitz respecto la segunda variable con constante de Lipschitz \(L\), \(k_1\) también lo verifica con \(L_1=L\).

Demostración de la proposición (continuación)

  • \(j=2\): sean \(y_i,\tilde{y}_i\). Entonces: \[ \begin{align*} |k_2(t_i,y_i)-k_2(t_i,\tilde{y}_i)| & =\left|f\left(t_i+h a_1,y_i+h b_{11} k_1(t_i,y_i)\right)-f\left(t_i+h a_1,\tilde{y}_i+h b_{11} k_1(t_i,\tilde{y}_i\right)\right|\\ & \leq L\left|y_i+h b_{11} k_1(t_i,y_i)-\tilde{y}_i-h b_{11} k_1(t_i,\tilde{y}_i)\right|\\ & \leq L(|y_i-\tilde{y}_i|+h L |b_{11}||y_i-\tilde{y}_i|)=L(1+hL|b_{11}|)|y_i-\tilde{y}_i|. \end{align*} \] Por tanto, \(k_2\) verifica la condición de Lipschitz respecto la segunda variable con constante de Lipschitz \(L_2=L(1+hL|b_{11}|)\).

  • \(j\). Supongamos, siguiendo un proceso inductivo, que las funciones \(k_l\) verifican la condición de Lipschitz respecto la segunda variable con constante de Lipschitz \(L_l\), \(l=1,\ldots,j-1\). Entonces: \[ \begin{align*} |k_j(t_i,y_i)-k_j(t_i,\tilde{y}_i)| & =\left|f\left(t_i+h a_j,y_i+h\sum_{l=1}^{j-1} b_{jl} k_l(t_i,y_i)\right)-f\left(t_i+h a_j,\tilde{y}_i+h\sum_{l=1}^{j-1} b_{jl} k_l(t_i,\tilde{y}_i)\right)\right|\\ & \leq L\left|y_i+h\sum_{l=1}^{j-1} b_{jl} k_l(t_i,y_i)-\tilde{y}_i-h\sum_{l=1}^{j-1} b_{jl} k_l(t_i,\tilde{y}_i)\right| \\ & \leq L |y_i-\tilde{y}_i| \left(1+h\sum_{l=1}^{j-1} |b_{jl}| L_l\right), \end{align*} \] es decir la función \(k_j\) verifica la condición de Lipschitz respecto la segunda variable con constante de Lipschitz \(\displaystyle L_j= L\left(1+h\sum_{l=1}^{j-1} |b_{jl}| L_l\right)\).

Demostración de la proposición (continuación)

Veamos por último que la función \(\varphi(t_i,y_i)\) verifica la condición de Lipschitz respecto la segunda variable: \[ |\varphi(t_i,y_i)-\varphi(t_i,\tilde{y}_i)|=\left|\sum_{j=1}^{J} c_j k_j(t_i,y_i)-\sum_{j=1}^{J} c_j k_j(t_i,\tilde{y}_i)\right|\leq \left(\sum_{j=1}^J |c_j| L_j\right) |y_i-\tilde{y}_i|. \] La constante de Lipschitz de la función \(\varphi\) vale \(\displaystyle\sum_{j=1}^J |c_j| L_j\).

Usando el Teorema que nos daba la relación entre la consistencia y la convergencia de un método de un paso, podemos afirmar que, tomando un valor de \(h\) suficientemente pequeño, el valor \(\displaystyle h\sum_{j=1}^J |c_j| L_j<1\), y por tanto, como el método de Runge-Kutta es consistente, será convergente y además del mismo orden que el orden de consistencia.

Condiciones de consistencia de orden \(k\)

Hemos visto que un método de Runge-Kutta es consistente si, y sólo si, \(\displaystyle\sum_{j=1}^J c_j=1\).

Veamos qué condiciones aparecen si queremos consistencia de un determinado orden. Concretamente, veamos el resultado siguiente:

Condiciones de consistencia de orden \(k\)

Proposición. Condiciones de consistencia para un método de Runge-Kutta.

Consideremos un método de Runge-Kutta \(\hat{y}_{i+1}=\hat{y}_i+h\varphi(t_i,\hat{y}_i),\) donde \[ \begin{align*} \varphi(t_i,\hat{y}_i) & =\sum_{j=1}^J c_j k_j,\\ k_j & = f\left(t_i+h a_j,\hat{y}_i+h\sum_{l=1}^{J} b_{jl} k_l\right),\ j=1,\ldots,J, \end{align*} \] con \(\displaystyle a_j=\sum_{l=1}^J b_{jl}\) para resolver el problema de valores iniciales \[ y'=f(t,y),\ a\leq t\leq b,\ y(a)=y_0. \]

Condiciones de consistencia de orden \(k\)

Proposición. Condiciones de consistencia para un método de Runge-Kutta. (continuación)

Entonces,

  1. si \(\displaystyle\sum_{j=1}^J c_j=1\), el método es consistente de orden como mínimo \(1\),
  2. si además \(\displaystyle\sum_{j=1}^J a_j c_{j}=\frac{1}{2}\), el método tiene orden de consistencia como mínimo \(2\) y
  3. si además \(\displaystyle\sum_{j=1}^J a_j^2 c_j = \frac{1}{3}\), \(\displaystyle\sum_{j,l=1}^J b_{jl}a_l c_j=\frac{1}{6}\), el método tiene orden de consistencia como mínimo \(3\).

Demostración de la proposición

La condición 1. ya está demostrada en una proposición anterior.

Supongamos ahora que el método de Runge-Kutta tiene un orden de convergencia \(k\), con \(k\geq 2\).

Entonces: \[ \tau_{i+1}=\frac{y_{i+1}-y_i}{h}-\sum_{j=1}^J c_j k_j = O(h^k), \] donde recordemos que \(y_i=y(t_i)\) siendo \(y(t)\) la solución exacta del problema de valores iniciales.

Si desarrollamos por Taylor la función \(y_{i+1}=y(t_{i+1})=y(t_i+h)\) alrededor de \(t=t_i\) obtenemos lo siguiente (ver la demostración de que el método de Runge-Kutta 4 tiene orden \(4\):) \[ \begin{align*} y_{i+1} & = y_i +h f_i +\frac{h^2}{2} (f_{t,i}^{(1)}+f_{y,i}^{(1)}f_i)\\ & \quad +\frac{h^3}{6} \left(f_{t,i}^{(2)}+2 f_{t,y,i}^{(1,1)}f_i+f_{y,i}^{(2)}f_i^2+f_{y,i}^{(1)}f_{t,i}^{(1)}+\left(f_{y,i}^{(1)}\right)^2 f_i\right)+O(h^4) \end{align*} \]

Entonces: \[ \frac{y_{i+1}-y_i}{h} =f_i +\frac{h}{2} (f_{t,i}^{(1)}+f_{y,i}^{(1)}f_i) +\frac{h^2}{6} \left(f_{t,i}^{(2)}+2 f_{t,y,i}^{(1,1)}f_i+f_{y,i}^{(2)}f_i^2+f_{y,i}^{(1)}f_{t,i}^{(1)}+\left(f_{y,i}^{(1)}\right)^2 f_i\right)+O(h^3) \]

Demostración de la proposición (continuación)

Si desarrollamos por Taylor la función de dos variables \(\displaystyle\sum_{j=1}^J c_j k_j\) alrededor del punto \((t_i,y_i)\) obtenemos: \[ \begin{align*} \sum_{j=1}^J c_j k_j & = \sum_{j=1}^J c_j f\left(t_i+h a_j,y_i+h\sum_{l=1}^{J} b_{jl} k_l\right)=\sum_{j=1}^J c_j \left(f_i+f_{t,i}^{(1)} h a_j+f_{y,i}^{(1)} h \sum_{l=1}^J b_{jl} k_l\right.\\ & \left. +\frac{1}{2} h^2 f_{t,i}^{(2)} a_j^2+h^2 f_{t,y,i}^{(1,1)} a_j\sum_{l=1}^J b_{jl}k_l+\frac{1}{2}h^2 f_{y,i}^{(2)}\left(\sum_{l=1}^J b_{jl}k_l\right)^2 \right)+O(h^3) \\ & =\sum_{j=1}^J c_j \left(f_i+f_{t,i}^{(1)} h a_j+f_{y,i}^{(1)} h \sum_{l=1}^J b_{jl} \left(f_i+f_{t,i}^{(1)} h a_l+f_{y,i}^{(1)} h\sum_{s=1}^J b_{ls} k_s\right) \right.\\ &\left.+\frac{1}{2} h^2 f_{t,i}^{(2)} a_j^2+h^2 f_{t,y,i}^{(1,1)} a_j\sum_{l=1}^J b_{jl}f_i+\frac{1}{2}h^2f_{y,i}^{(2)}\left(\sum_{l=1}^J b_{jl}f_i\right)^2 \right)+O(h^3)\\ & =\left(\sum_{j=1}^J c_j\right) f_i+f_{t,i}^{(1)} h \sum_{j=1}^J a_j c_j+f_{y,i}^{(1)} h f_i \sum_{j=1}^J a_j c_j +f_{t,i}^{(1)} f_{y,i}^{(1)} h^2 \sum_{j,l=1}^J b_{jl}a_l c_j +(f_{y,i}^{(1)})^2 f_i h^2\sum_{j,l=1}^J b_{jl} a_l c_j \\ &+\frac{1}{2} h^2 f_{t,i}^{(2)} \sum_{j=1}^J a_j^2 c_j +h^2 f_{t,y,i}^{(1,1)} f_i\sum_{j=1}^J a_j^2 c_j +\frac{1}{2}h^2f_{y,i}^{(2)}f_i^2\sum_{j=1}^J a_j^2 c_j+O(h^3) \end{align*} \]

Demostración de la proposición (continuación)

Igualamos los términos de \(h^k\), para \(k=0,1,2\):

  • Consistencia de orden \(1\): el coeficiente de \(h^0\) se debe anular: \(\displaystyle\sum_{j=1}^J c_j =1\), condición que ya conocíamos.

  • Consistencia de orden \(k=2\): el coeficiente de \(h\) se debe anular:

    • términos en \(f_{t,i}^{(1)}h\): \(\displaystyle \sum_{j=1}^J a_j c_j=\frac{1}{2}\).
    • términos en \(f_{y,i}^{(1)} f_i h\): \(\displaystyle \sum_{j=1}^J a_j c_j=\frac{1}{2}\).
    • Por tanto, para tener consistencia de orden \(2\) se tiene que verificar además que \(\displaystyle \sum_{j=1}^J a_j c_j=\frac{1}{2}\).

Demostración de la proposición (continuación)

  • Consistencia de orden \(k=3\): el coeficiente de \(h^2\) se debe anular:
    • términos en \(f_{t,i}^{(1)}f_{(y,i)}^{(1)}h^2\): \(\displaystyle\sum_{j,l=1}^J b_{jl}a_l c_j=\frac{1}{6}\).
    • términos en \((f_{y,i}^{(1)})^2 f_i h^2\): \(\displaystyle\sum_{j,l=1}^J b_{jl}a_l c_j=\frac{1}{6}\).
    • términos en \(f_{t,i}^{(2)} h^2\): \(\displaystyle\frac{1}{2}\sum_{j=1}^J a_j^2 c_j=\frac{1}{6},\ \Rightarrow \sum_{j=1}^J a_j^2 c_j=\frac{1}{3}\).
    • términos en \(f_{t,y,i}^{(1,1)}f_i h^2\): \(\displaystyle\sum_{j=1}^J a_j^2 c_j=\frac{2}{6}=\frac{1}{3}\).
    • términos en \(f_{y,i}^{(2)}f_i^2 h^2\): \(\displaystyle\frac{1}{2}\sum_{j=1}^J a_j^2 c_j=\frac{1}{6},\ \Rightarrow \sum_{j=1}^J a_j^2 c_j=\frac{1}{3}\).
    • En resumen, para tener orden de consistencia \(k=3\), se tiene que verificar además que \(\displaystyle \sum_{j=1}^J a_j^2 c_j=\frac{1}{3},\ \sum_{j,l=1}^J b_{jl}a_l c_j=\frac{1}{6}\).

Condiciones de consistencia de orden \(k\)

Observaciones.

  • La demostración anterior nos da un algoritmo para verificar órdenes de consistencia mayores. Sin embargo, la complejidad va aumentando a medida que el órden a verificar es mayor.

  • La condición de orden de consistencia \(2\), \(\displaystyle \sum_{j=1}^J a_j c_j=\frac{1}{2}\), puede escribirse matricialmente \(\mathbf{c}^\top\mathbf{a}=\frac{1}{2}\), donde \(\mathbf{a}\) sería la primera columna del tablero de Butcher y \(\mathbf{c}\), la última fila de dicho tablero.

Condiciones de consistencia de orden \(k\)

Observaciones. (continuación)

  • Condiciones de orden de consistencia \(3\):
    • \(\displaystyle \sum_{j=1}^J a_j^2 c_j=\frac{1}{3}\) puede escribirse matricialmente como \(\mathbf{c}^\top\mathbf{a^2}=\frac{1}{3}\), donde \(\mathbf{a^2}=(a_1^2,\ldots,a_J^2)\) y el vector \(\mathbf{c}\) está indicado en la observación anterior.
    • \(\displaystyle\sum_{j,l=1}^J b_{jl}a_l c_j=\frac{1}{6}\), puede escribirse matricialmente \(\mathbf{c}^\top\cdot\mathbf{B}\cdot\mathbf{a}=\frac{1}{6}\) donde \(\mathbf{B}\) la matriz del tablero de Butcher y los vectores \(\mathbf{a}\) y \(\mathbf{c}\) están indicados en la observación anterior.

Ejemplo: Runge-Kutta 4

Apliquemos la proposición anterior al método de Runge-Kutta 4 para verificar que dicho método tiene órden de convergencia como mínimo \(3\).

Recordemos el tablero de Butcher de dicho método:
\(0\) \(0\) \(0\) \(0\) \(0\)
\(\frac{1}{2}\) \(\frac{1}{2}\) \(0\) \(0\) \(0\)
\(\frac{1}{2}\) \(0\) \(\frac{1}{2}\) \(0\) \(0\)
\(1\) \(0\) \(0\) \(1\) \(0\)
\(\frac{1}{6}\) \(\frac{1}{3}\) \(\frac{1}{3}\) \(\frac{1}{6}\)

Ejemplo: Runge-Kutta 4 (continuación)

  • Es consistente ya que: \[ \sum_{j=1}^4 c_j = \frac{1}{6}+\frac{1}{3}+\frac{1}{3}+\frac{1}{6}=1. \]
  • Tiene como mínimo orden de consistencia \(2\) ya que: \[ \sum_{j=1}^4 a_j c_j = \mathbf{c}^\top\mathbf{a}=\frac{1}{6}\cdot 0+ \frac{1}{3}\cdot\frac{1}{2}+\frac{1}{3}\cdot \frac{1}{2}+\frac{1}{6}\cdot 1=\frac{1}{6}+\frac{1}{6}+\frac{1}{6}=\frac{1}{2}. \]
  • Tiene como mínimo orden de consistencia \(3\) ya que:

\[ \begin{align*} \sum_{j=1}^4 a_j^2 c_j & = \mathbf{c}^\top\mathbf{a}^2=\frac{1}{6}\cdot 0^2+ \frac{1}{3}\cdot \left(\frac{1}{2}\right)^2+\frac{1}{3}\cdot \left(\frac{1}{2}\right)^2+\frac{1}{6}\cdot 1^2=\frac{1}{12}+\frac{1}{12}+\frac{1}{6}=\frac{1}{3},\\ \sum_{j,l=1}^J b_{jl}a_l c_j & = \mathbf{c}^T\mathbf{B}\mathbf{a}=\begin{bmatrix}\frac{1}{6}&\frac{1}{3}&\frac{1}{3}&\frac{1}{6} \\\end{bmatrix}\cdot\begin{bmatrix}0&0&0&0 \\\frac{1}{2}&0&0&0 \\0&\frac{1}{2}&0&0 \\0&0&1&0 \\\end{bmatrix}\cdot\begin{bmatrix}0 \\\frac{1}{2} \\\frac{1}{2} \\1 \\\end{bmatrix}=\begin{bmatrix}\frac{1}{6}&\frac{1}{3}&\frac{1}{3}&\frac{1}{6} \\\end{bmatrix}\cdot\begin{bmatrix}0 \\0 \\\frac{1}{4} \\\frac{1}{2} \\\end{bmatrix}\\ & =\frac{1}{6}\cdot 0+\frac{1}{3}\cdot 0+\frac{1}{3}\cdot \frac{1}{4}+\frac{1}{6}\cdot \frac{1}{2}=\frac{1}{12}+\frac{1}{12}=\frac{1}{6}. \end{align*} \]

Métodos de control de paso. El método de Runge-Kutta-Fehlberg

Introducción

Todos los métodos numéricos para resolver el problema de valores iniciales \(y'=f(t,y),\ a\leq t\leq b,\ y(a)=y_0\) vistos hasta ahora se basan en introducir una ecuación en diferencias \(\hat{y}_{i+1}=\hat{y}_i +h\varphi(t,\hat{y}_i)\) con \(\hat{y}_0=y_0\) y hallar las aproximaciones \(\hat{y}_i =\hat{y}(t_i)=\hat{y}(a+h i)\), donde \(h\) es el paso definido por \(h=\frac{b-a}{n}\), siendo \(n\) el número de aproximaciones a realizar.

Dicho paso es fijo para todas las aproximaciones \(\hat{y}_i\), \(i=0,\ldots,n\).

En esta nueva sección vamos a considerar que el paso \(h\) puede cambiar para cada tiempo \(t_i\) dependiendo del comportamiento que tenga la solución aproximada \(\hat{y}(t_i)\) en dicho valor del tiempo \(t_i\).

Introducción

La idea intuitiva es que si, fijado un paso \(h\), el error local de truncamiento en el tiempo \(t_i\), \(\tau_{i+1}(h)\), es grande, significa que hemos de avanzar con “pies de plomo” con pasos \(h\) pequeños; sin embargo, si el error local de truncamiento en el tiempo \(t_i\), \(\tau_{i+1}(h)\), es pequeño, podemos avanzar con pasos \(h\) relativamente grandes ya que tenemos margen para considerar dichos pasos.

Los algoritmos numéricos que tienen en cuenta el error local de truncamiento para calcular el paso \(h\) en cada tiempo \(t_i\) se denominan adaptativos y son los que introduciremos en esta sección.

Por tanto, no sabremos a priori los tiempos \(t_i\) donde vamos a calcular las aproximaciones \(\hat{y}_i\) sino que éstos se irán obteniendo dependiendo de los errores locales de truncamiento \(\tau_{i+1}(h)\) en el tiempo actual \(t_i\) calculando los pasos \(h\) “óptimos” en cada tiempo \(t_i\).

Algoritmo

Concretamente, el algoritmo para calcular la aproximación final \(\hat{y}(b)\) en el tiempo final \(t=b\) sería el siguiente:

  • Paso 0: consideramos \(t_i=a\).
  • Paso 1: consideramos un valor \(h>0\).

Algoritmo

  • Paso 2: calculamos el valor real \(q>0\) tal que el error local de truncamiento en el paso \(qh\) sea menor que la tolerancia permitida \(\epsilon\), es decir, \(|\tau_{i+1}(qh)|\leq\epsilon\).
    • si \(q<1\), cambiamos \(h\) por \(qh\) y volvemos a empezar en el paso 1.
    • si \(q\geq 1\) y \(t_i+qh\leq b\), calculamos \(\hat{y}(t_i+qh)=\hat{y}(t_i)+qh\varphi(t_i,\hat{y}(t_i))\) y aceptamos como buena la aproximación \(\hat{y}(t_i+qh)\). Cambiamos el paso \(h\) por \(qh\), cambiamos el valor \(t_i\) por \(t_i + qh\) y volvemos al paso 1.
    • si \(q\geq 1\) y \(t+qh\geq b\), hacemos \(h=b-t\), calculamos \(\hat{y}(b)=\hat{y}(t)+h\varphi(t,\hat{y}(t))\) y acabamos hallando la aproximación \(\hat{y}(b)\).

Estimación del LTE

Como podemos observar en el algoritmo anterior, el punto clave es estimar el error local de truncamiento \(|\tau_t(qh)|\) y ver si éste es o no menor que la tolerancia permitida \(\epsilon\).

Para estimar dicho error local de truncamiento consideramos dos métodos numéricos, \[ \begin{align*} \hat{y}_{i+1} & =\hat{y}_i +h\varphi(t_i,\hat{y}_i),\\ \tilde{y}_{i+1} & = \tilde{y}_i +h\tilde{\varphi}(t_i,\tilde{y}_i), \end{align*} \] el primero \(\hat{y}_i\), con un orden de consistencia \(k\) y el segundo, \(\tilde{y}_i\), con un orden de consistencia \(k+1\).

Por tanto, si \(y(t)\) es la solución exacta del problema de valores iniciales, podemos escribir: \[ \begin{align*} y(t_i+h) & =y(t_i)+h \varphi(t_i,y(t_i))+ O(h^{k+1}),\\ y(t_i+h) & =y(t_i)+h \tilde{\varphi}(t_i,y(t_i))+ O(h^{k+2}). \end{align*} \]

Estimación del LTE

Entonces, si \(\tau_{i+1}(h)\) es el error local de truncamiento del primer método y considerando que \(y(t_i)\approx \hat{y}_i\), \[ \begin{align*} \tau_{i+1}(h) & =\frac{y(t_i+h)-y(t_i)}{h}-\varphi(t_i,y(t_i))=\frac{y(t_i+h)-\hat{y}_i}{h}-\varphi(t_i,\hat{y}_i)\\ & = \frac{y(t_{i+1})-(\hat{y}_i +h\varphi(t_i,\hat{y}_i))}{h}=\frac{1}{h}(y(t_{i+1})-\hat{y}_{i+1}). \end{align*} \] De la misma manera, si \(\tilde{\tau}_{i+1}(h)\) es el error local de truncamiento del segundo método y considerando que \(y(t_i)\approx \tilde{y}_i\), \[ \tilde{\tau}_{i+1}(h)=\frac{1}{h}(y(t_{i+1})-\tilde{y}_{i+1}) \]

Estimación del LTE

Como consecuencia, \[ \begin{align*} \tau_{i+1}(h) & = \frac{1}{h}(y(t_{i+1})-\hat{y}_{i+1})=\frac{1}{h}((y(t_{i+1})-\tilde{y}_{i+1})+(\tilde{y}_{i+1}-\hat{y}_{i+1}))\\ & = \tilde{\tau}_{i+1}(h)+\frac{1}{h}(\tilde{y}_{i+1}-\hat{y}_{i+1}). \end{align*} \] Ahora bien, como \(\tau_{i+1}(h)=O(h^{k})\) y \(\tilde{\tau}_{i+1}(h)=O(h^{k+1})\) la “parte dominante” de la expresión anterior de \(\tau_{i+1}(h)\) viene de \(\frac{1}{h}(\tilde{y}_{i+1}-\hat{y}_{i+1})\) ya que el otro sumando tiene orden superior \(O(h^{k+1})\): \[ \tau_{i+1}(h)\approx \frac{1}{h}(\tilde{y}_{i+1}-\hat{y}_{i+1}). \] Fijémonos que la expresión anterior nos permite estimar el valor del error local de truncamiento del primer método ya que la parte de la derecha es computable a partir de los dos métodos considerados.

Estimación del LTE

Como \(\tau_{i+1}(h)=O(h^k)\), existe una constante \(C\) tal que \(\tau_{i+1}(h)\approx C h^k\).

A continuación consideramos el paso \(qh\). Aplicando la expresión anterior que nos da el error local de truncamiento pero ahora para \(qh\), obtenemos: \[ \tau_{i+1}(qh)\approx C (qh)^k = q^k C h^k \approx q^k\tau_{i+1}(h)\approx \frac{q^k}{h}(\tilde{y}_{i+1}-\hat{y}_{i+1}). \] Recordemos que queremos calcular \(q\) tal que \(|\tau_{i+1}(qh)|\leq \epsilon\), siendo \(\epsilon\) la tolerancia permitida: \[ |\tau_{i+1}(qh)|\leq \epsilon,\ \Rightarrow \frac{q^k}{h}|\tilde{y}_{i+1}-\hat{y}_{i+1}|\leq \epsilon,\ \Rightarrow q\leq\left(\frac{\epsilon h} {|\tilde{y}_{i+1}-\hat{y}_{i+1}|}\right)^{\frac{1}{k}}. \]

Estimación del LTE

La expresión anterior nos dice que

  • si \(|\tilde{y}_{i+1}-\hat{y}_{i+1}|\) es pequeño, significa que tenemos margen para elegir el paso \(h\), ya que dos métodos numéricos, uno de orden superior a otro, nos da una diferencia pequeña en las aproximaciones. El valor \(q\) será relativamente grande,
  • en cambio, si \(|\tilde{y}_{i+1}-\hat{y}_{i+1}|\) es grande, significa que en el tiempo \(t_i\) tenemos una diferencia grande en las aproximaciones de dos métodos numéricos de distinto orden lo que implica que el paso \(h\) elegido deber ser pequeño al haber “problemas” en las aproximaciones en zonas cercanas al tiempo \(t_i\). En este caso \(q\) será pequeño y hemos de reducir el paso \(h\) a \(qh\).

El método de Runge-Kutta-Fehlberg

Para aplicar el método descrito anteriormente, tenemos que elegir dos métodos numéricos para resolver el problema de valores iniciales \(y'=f(t,y),\ a\leq t\leq b,\ y(a)=y_0\).

Si los métodos elegidos son un método de Runge-Kutta de orden de consistencia \(4\), \(O(h^4)\) y un método de Runge-Kutta con orden de consistencia \(5\), \(O(h^5)\), el método se denomina método de Runge-Kutta-Fehlberg.

Concretamente, las ecuaciones en diferencias de los métodos numéricos considerados son las siguientes: \[ \begin{align*} \hat{y}_{i+1} & = \hat{y}_i +h\left(\frac{25}{216}k_1+\frac{1408}{2565}k_3+\frac{2197}{4104}k_4-\frac{1}{5}k_5\right),\\ \tilde{y}_{i+1} & = \hat{y}_i +h\left(\frac{16}{135}k_1+\frac{6656}{12825}k_3+\frac{28561}{56430}k_4-\frac{9}{50}k_5+\frac{2}{55}k_6\right), \end{align*} \]

El método de Runge-Kutta-Fehlberg

con \[ \begin{align*} k_1 & = f(t_i,\hat{y}_i),\\ k_2 & = f\left(t_i+\frac{h}{4},\hat{y}_i +\frac{h}{4}k_1\right),\\ k_3 & = f\left(t_i+\frac{3h}{8},\hat{y}_i + h\left(\frac{3}{32}k_1+\frac{9}{32}k_2\right)\right),\\ k_4 & = f\left(t_i +\frac{12h}{13},\hat{y}_i+h\left(\frac{1932}{2197}k_1-\frac{7200}{2197}k_2+\frac{7296}{2197}k_3\right)\right),\\ k_5 & = f\left(t_i+h,\hat{y}_i +h\left( \frac{439}{216}k_1-8k_2+\frac{3680}{513}k_3-\frac{845}{4104}k_4\right)\right),\\ k_6 & = f\left(t_i+\frac{h}{2},\hat{y}_i+h\left( -\frac{8}{27}k_1+2k_2-\frac{3544}{2565}k_3+\frac{1859}{4104}k_4-\frac{11}{40}k_5\right)\right). \end{align*} \]

El método de Runge-Kutta-Fehlberg

Observaciones.

  • Las demostraciones que los dos métodos elegidos tienen órdenes de consistencia \(4\) y \(5\) se deja como ejercicio al lector. Son demostraciones tediosas que se tienen que realizar usando el procedimiento descrito en la sección donde se introducían los métodos de Runge-Kutta.
  • Los métodos elegidos son métodos explícitos.
  • Las expresiones \(k_i\) son las mismas para los dos métodos. Por tanto, dada la aproximación en el tiempo \(t_i\), \(\hat{y}_i\), las aproximaciones \(\hat{y}_{i+1}\) y \(\tilde{y}_{i+1}\) empiezan las dos con \(\hat{y}_i +\cdots\).
  • Además, el tiempo de computación se reduce a la hora de calcular la estimación del error local de truncamiento que recordemos que vale: \[ \tau_{i+1}(h)\approx \frac{1}{h}(\tilde{y}_{i+1}-\hat{y}_{i+1}). \]

El método de Runge-Kutta-Fehlberg

Ejercicio

Demostrar que se puede obtener la siguiente expresión del valor absoluto de la estimación del error local de truncamiento que llamaremos \(R\): \[ |\tau_{i+1}(h)|\approx R=\left|\frac{1}{360}k_1-\frac{128}{4275}k_3-\frac{2197}{75240}k_4+\frac{1}{50}k_5+\frac{2}{55}k_6\right|. \]

Indicación: considerar las expresiones de \(\hat{y}_{i+1}\) y \(\tilde{y}_{i+1}\) en función de los \(k_j\), \(j=1,2,3,4,5,6\) y realizar la operación siguiente: \[ R= \frac{1}{h}|\tilde{y}_{i+1}-\hat{y}_{i+1}|. \] Como \(\hat{y}_i\) se simplifica, os quedará una combinación lineal de las \(k_j\), \(j=1,2,3,4,5,6\).

El método de Runge-Kutta-Fehlberg

Observación.

Debido a que, para deducir el algoritmo, hemos hecho las aproximaciones \(y(t_i)\approx \hat{y}_i\) y \(y(t_i)\approx \tilde{y}_i\), se considera la siguiente expresión “ajustada y conservadora” del valor de \(q\): \[ q = \left(\frac{\epsilon h} {2|\tilde{y}_{i+1}-\hat{y}_{i+1}|}\right)^{\frac{1}{4}}\approx 0.84\left(\frac{\epsilon h} {|\tilde{y}_{i+1}-\hat{y}_{i+1}|}\right)^{\frac{1}{4}}= 0.84\left(\frac{\epsilon}{R}\right)^{\frac{1}{4}}. \]

Método de Runge-Kutta-Fehlberg. Pseudocódigo

  • INPUT valores inicial y final \(a\), \(b\), paso mínimo \(h_\min\), paso máximo \(h_\max\), tolerancia permitida \(TOL\) condición inicial \(y_0\) y función \(f(t,y)\)
  • Set \(t=a\). (Definimos el valor de \(t\) como el tiempo inicial \(a\))
  • Set \(\hat{y}=y_0\). (Definimos el valor aproximado en el tiempo inicial como \(y_0\))
  • Set \(h=h_\max\). (Consideramos el valor de \(h\) como el \(h\) máximo y lo iremos ajustando)

Método de Runge-Kutta-Fehlberg. Pseudocódigo

  • While \(t\leq b\) (mientras el tiempo actual \(t\) no sobrepase el tiempo final, vamos avanzando)
    • Set \(k_1=f(t,\hat{y})\) (definimos los \(k_i, i=1,2,3,4,5,6\))
    • Set \(k_2=f\left(t+\frac{h}{4},\hat{y}+\frac{h}{4}k_1\right)\)
    • Set \(k_3=f\left(t+\frac{3h}{8},\hat{y}+ h\left(\frac{3}{32}k_1+\frac{9}{32}k_2\right)\right)\)
    • Set \(k_4=f\left(t +\frac{12h}{13},\hat{y}+h\left(\frac{1932}{2197}k_1-\frac{7200}{2197}k_2+\frac{7296}{2197}k_3\right)\right)\)
    • Set \(k_5=f\left(t+h,\hat{y}+h\left( \frac{439}{216}k_1-8k_2+\frac{3680}{513}k_3-\frac{845}{4104}k_4\right)\right)\)
    • Set \(k_6=f\left(t+\frac{h}{2},\hat{y}+h\left( -\frac{8}{27}k_1+2k_2-\frac{3544}{2565}k_3+\frac{1859}{4104}k_4-\frac{11}{40}k_5\right)\right)\)
    • Set \(R=\left|\frac{1}{360}k_1-\frac{128}{4275}k_3-\frac{2197}{75240}k_4+\frac{1}{50}k_5+\frac{2}{55}k_6\right|\) (Calculamos la estimación de \(|\tau_{i+1}(h)|\))

Método de Runge-Kutta-Fehlberg. Pseudocódigo

    • If \(R\leq TOL\) (si la estimación de \(|\tau_{i+1}(h)|\) es menor que la tolerancia, aceptamos la aproximación y avanzamos)
      • Set \(t=t+h\).
      • Set \(\hat{y}= \hat{y}+h\left(\frac{25}{216}k_1+\frac{1408}{2565}k_3+\frac{2197}{4104}k_4-\frac{1}{5}k_5\right)\).
    • Set \(q=0.84\cdot (TOL/R)^{\frac{1}{4}}\) (Vamos a ajustar el paso \(h\))

Método de Runge-Kutta-Fehlberg. Pseudocódigo

    • If \(q\leq 0.1\) (si \(q\) es muy pequeño, consideramos el paso \(h\) como \(0.1\cdot h\))
      • Set \(h=0.1\cdot h\).
    • Else
      • If \(q\geq 4\) (si \(q\) es muy grande, consideramos como \(h\), \(4h\) sin superar \(h_\max\))
        • Set \(h=\min\{4\cdot h,h_\max\}\).
      • Else
        • Set \(h=\min\{q\cdot h,h_\max\}\).

Método de Runge-Kutta-Fehlberg. Pseudocódigo

    • If \(t+h > b\) (Comprobamos si el “próximo” tiempo supera el tiempo final \(t=b\))
      • Set \(h=b-t\) (Si es el caso, ajustamos el paso \(h\) para llegar exactamente a \(t=b\))
    • Else (si el “próximo” tiempo no supera el tiempo final \(t=b\), miramos si es porque el paso \(h\) es demasiado pequeño)
      • If \(h<h_\min\)
        • Print Paso \(h\) demasiado pequeño. El algoritmo no funciona.
        • End (Acabamos).
      • If \(t=b\) (Comprobamos si hemos llegado al tiempo final \(t=b\))
        • Print \(\hat{y}\) (si es el caso damos el valor \(\hat{y}(b)\))

Ejemplo

Consideremos el siguiente problema de valores iniciales: \[ y'=f(t,y)=t\mathrm{e}^{3t}-2y,\ 0\leq t\leq 1,\ y(0)=0, \] de solución exacta \(y(t)=\frac{1}{5}t\mathrm{e}^{3t}-\frac{1}{25}\mathrm{e}^{3t}+\frac{1}{25}\mathrm{e}^{-2t}\).

Vamos a aplicar el método de Runge-Kutta-Fehlberg para calcular la solución aproximada \(\hat{y}(1)\) considerando \(h_\min =0.01\), \(h_\max=0.25\) y una tolerancia \(\epsilon =0.00001\).

  • Paso 1. Hacemos \(t=0\), \(h=0.25\) y \(\hat{y}= 0\).

  • Paso 2. Calculamos los valores \(k_i\): \[ \begin{align*} k_1 & = f(t,\hat{y})=0\cdot \mathrm{e}^{3\cdot0}-2\cdot 0=0,\\ k_2 & =f\left(t+\frac{h}{4},\hat{y}+\frac{h}{4} k_1\right)=\left(0+\frac{0.25}{4}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{0.25}{4}\right)}-2\cdot \left(0 +\frac{0.25}{4}\cdot 0\right)=0.0753894,\\ k_3 & =f\left(t+\frac{3h}{8},\hat{y}+ h\left(\frac{3}{32}k_1+\frac{9}{32}k_2\right)\right)\\ & =\left(0+\frac{3\cdot0.25}{8}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{3\cdot 0.25}{8}\right)}-2\cdot\left(0+0.25\cdot\left(\frac{3\cdot0}{32}+\frac{9\cdot0.0753894}{32}\right)\right)=0.1135969, \end{align*} \]

Ejemplo (continuación)

  • Paso 2 (continuación). \[ \begin{align*} k_4 & =f\left(t +\frac{12h}{13},\hat{y}+h\left(\frac{1932}{2197}k_1-\frac{7200}{2197}k_2+\frac{7296}{2197}k_3\right)\right)\\ & = \left(0+\frac{12\cdot0.25}{13}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{12\cdot 0.25}{13}\right)}\\ & \quad -2\cdot\left(0+0.25\cdot\left(\frac{1932\cdot0}{2197}-\frac{7200\cdot0.0753894}{2197}+\frac{7296\cdot0.1135969}{2197}\right)\right)=0.3960625,\\ k_5 & = f\left(t+h,\hat{y}+h\left( \frac{439}{216}k_1-8k_2+\frac{3680}{513}k_3-\frac{845}{4104}k_4\right)\right)\\ & =(0+0.25)\cdot \mathrm{e}^{3\cdot\left(0+0.25\right)}\\ & \quad -2\cdot \left(0+0.25\cdot\left(\frac{439\cdot0}{216}-8\cdot 0.0753894+\frac{3680\cdot0.1135969}{513}-\frac{845\cdot0.3960625}{4104}\right)\right)\\ & =0.4641383, \end{align*} \]

Ejemplo (continuación)

  • Paso 2 (continuación). \[ \begin{align*} k_6 & = f\left(t+\frac{h}{2},\hat{y}+h\left( -\frac{8}{27}k_1+2k_2-\frac{3544}{2565}k_3+\frac{1859}{4104}k_4-\frac{11}{40}k_5\right)\right) \\ & = \left(0+\frac{0.25}{2}\right)\cdot\mathrm{e}^{3\cdot\left(0+\frac{0.25}{2}\right)}-2\cdot\left(0+0.25\cdot\left( -\frac{8\cdot0}{27}+2\cdot0.0753894\right.\right.\\ &\quad \left.\left.-\frac{3544\cdot0.1135969}{2565}+\frac{1859\cdot0.3960625}{4104} -\frac{11\cdot 0.4641383}{40}\right)\right)=0.1590779. \end{align*} \]
  • Paso 3. Calculamos la estimación del error local de truncamiento \(|\tau_{i+1}(h)|\): \[ \begin{align*} R & =\left|\frac{1}{360}k_1-\frac{128}{4275}k_3-\frac{2197}{75240}k_4+\frac{1}{50}k_5+\frac{2}{55}k_6\right|\\ & = \left|\frac{0}{360}-\frac{128\cdot0.1135969}{4275}-\frac{2197\cdot0.3960625}{75240}+\frac{0.4641383}{50}+\frac{2\cdot0.1590779}{55}\right|=0.0001012. \end{align*} \]
  • Paso 4. Miramos si \(R>\epsilon =0.00001\),. Vemos que sí, ya que \(0.0001012 > 0.00001\). El paso \(h=0.25\) es demasiado grande y tenemos que ajustarlo.

Ejemplo (continuación)

  • Paso 5. Vamos a calcular el nuevo paso \(h\). En primer lugar, calculamos \(q\): \[ q=0.84\cdot\left(\frac{\epsilon}{R}\right)^{\frac{1}{4}}=0.84\cdot\left(\frac{0.00001}{0.0001012}\right)^{\frac{1}{4}}=0.4709946. \] Como \(q\) no es demasiado pequeño \(q\not\leq 0.1\), ni demasiado grande \(q\not\geq 4\), el nuevo paso \(h\) será \(q\cdot h =0.4709946\cdot 0.25=0.1177486.\)

  • Paso 6. Miramos si \(t+h>b\), supera el tiempo final \(b=1\): \[ 0+0.1177486=0.1177486 \not > 1, \] vemos que no. Entonces volvemos al paso 1 con el nuevo \(h\) y volvemos a empezar.

Ejemplo (continuación)

  • Paso 1. Hacemos \(t=0\), \(h=0.1177486\) y \(\hat{y}= 0\).

  • Paso 2. Calculamos los valores \(k_i\): \[ \begin{align*} k_1 & = f(t,\hat{y})=0\cdot \mathrm{e}^{3\cdot0}-2\cdot 0=0,\\ k_2 & =f\left(t+\frac{h}{4},\hat{y}+\frac{h}{4} k_1\right)=\left(0+\frac{0.1177486}{4}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{0.1177486}{4}\right)}-2\cdot \left(0 +\frac{0.1177486}{4}\cdot 0\right)=0.032155,\\ k_3 & =f\left(t+\frac{3h}{8},\hat{y}+ h\left(\frac{3}{32}k_1+\frac{9}{32}k_2\right)\right)\\ & =\left(0+\frac{3\cdot0.1177486}{8}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{3\cdot 0.1177486}{8}\right)}-2\cdot\left(0+0.1177486\cdot\left(\frac{3\cdot0}{32}+\frac{9\cdot0.032155}{32}\right)\right)=0.0482803,\\ k_4 & =f\left(t +\frac{12h}{13},\hat{y}+h\left(\frac{1932}{2197}k_1-\frac{7200}{2197}k_2+\frac{7296}{2197}k_3\right)\right)\\ & = \left(0+\frac{12\cdot0.1177486}{13}\right)\cdot \mathrm{e}^{3\cdot\left(0+\frac{12\cdot 0.1177486}{13}\right)}\\ & \quad -2\cdot\left(0+0.1177486\cdot\left(\frac{1932\cdot0}{2197}-\frac{7200\cdot0.032155}{2197}+\frac{7296\cdot0.0482803}{2197}\right)\right)=0.1376515, \end{align*} \]

Ejemplo (continuación)

\[ \begin{align*} k_5 & = f\left(t+h,\hat{y}+h\left( \frac{439}{216}k_1-8k_2+\frac{3680}{513}k_3-\frac{845}{4104}k_4\right)\right)\\ & =(0+0.1177486)\cdot \mathrm{e}^{3\cdot\left(0+0.1177486\right)}\\ & \quad -2\cdot \left(0+0.1177486\cdot\left(\frac{439\cdot0}{216}-8\cdot 0.032155+\frac{3680\cdot0.0482803}{513}-\frac{845\cdot0.1376515}{4104}\right)\right)\\ & =0.1533287,\\ k_6 & = f\left(t+\frac{h}{2},\hat{y}+h\left( -\frac{8}{27}k_1+2k_2-\frac{3544}{2565}k_3+\frac{1859}{4104}k_4-\frac{11}{40}k_5\right)\right) \\ & = \left(0+\frac{0.1177486}{2}\right)\cdot\mathrm{e}^{3\cdot\left(0+\frac{0.1177486}{2}\right)}-2\cdot\left(0+0.1177486\cdot\left( -\frac{8\cdot0}{27}+2\cdot0.032155\right.\right.\\ &\quad \left.\left.-\frac{3544\cdot0.0482803}{2565}+\frac{1859\cdot0.1376515}{4104} -\frac{11\cdot 0.1533287}{40}\right)\right)=0.0660584. \end{align*} \]

  • Paso 3. Calculamos la estimación del error local de truncamiento \(|\tau_{i+1}(h)|\): \[ \begin{align*} R & =\left|\frac{1}{360}k_1-\frac{128}{4275}k_3-\frac{2197}{75240}k_4+\frac{1}{50}k_5+\frac{2}{55}k_6\right|\\ & = \left|\frac{0}{360}-\frac{128\cdot0.0482803}{4275}-\frac{2197\cdot0.1376515}{75240}+\frac{0.1533287}{50}+\frac{2\cdot0.0660584}{55}\right|=0.0000037. \end{align*} \]

Ejemplo (continuación)

  • Paso 4. Miramos si \(R>\epsilon =0.00001\). Vemos que no. En este caso aumentamos el tiempo \(t\) en \(h\), considerando \(t=t+h=`0+0.1177486=0.1177486\) y calculamos la aproximación \(\hat{y}\) en el nuevo tiempo \(t=0.1177486\): \[ \begin{align*} \hat{y}& = \hat{y}+h\left(\frac{25}{216}k_1+\frac{1408}{2565}k_3+\frac{2197}{4104}k_4-\frac{1}{5}k_5\right)\\ & = 0+0.1177486\left(\frac{25\cdot0}{216}+\frac{1408\cdot0.0482803}{2565}+\frac{2197\cdot 0.1376515}{4104}-\frac{0.1533287}{5}\right)=0.0081866. \end{align*} \]

  • Paso 5. Vamos a calcular el nuevo paso \(h\). En primer lugar, calculamos \(q\): \[ q=0.84\cdot\left(\frac{\epsilon}{R}\right)^{\frac{1}{4}}=0.84\cdot\left(\frac{0.00001}{0.0000037}\right)^{\frac{1}{4}}=1.0767246. \] Como \(q\) no es demasiado pequeño \(q\not\leq 0.1\), ni demasiado grande \(q\not\geq 4\), el nuevo paso \(h\) será \(q\cdot h =1.0767246\cdot 0.1177486=0.1267829.\)

  • Paso 6. Miramos si \(t+h>b\), supera el tiempo final \(b=1\): \[ 0.1177486+0.1267829=0.2445315 \not > 1, \] vemos que no. Entonces volvemos al paso 1 con el nuevo \(h=0.1267829\), el nuevo tiempo \(t=0.1177486\), la aproximación hallada \(0.0081866\) y volvemos a empezar.

Ejemplo (continuación)

La tabla siguiente nos muestra los resultados obtenidos en este ejemplo dando los valores de los tiempos \(t_i\) hallados, las aproximaciones \(\hat{y}_i\) obtenidas, los pasos \(h_i\) obtenidos, el valorde la solución exacta en los tiempos \(t_i\), \(y_i\) y el error cometido entre las aproximaciones y la solución exacta:

\(t_i\) \(\hat{y}_i\) \(h_{i}\) \(y_i\) \(|y_i-\hat{y}_i|\)
0 0 0.1177486 0 0
0.1177486 0.0081866 0.1267829 0.0081872 0.0000006
0.2445315 0.043074 0.1123177 0.0430759 0.0000019
0.3568492 0.1110956 0.099804 0.1110983 0.0000027
0.4566533 0.2180406 0.0899486 0.2180438 0.0000032
0.5466019 0.3706911 0.0820549 0.3706946 0.0000035

Ejemplo (continuación)

\(t_i\) \(\hat{y}_i\) \(h_{i}\) \(y_i\) \(|y_i-\hat{y}_i|\)
0.6286568 0.5765784 0.0755793 0.576582 0.0000037
0.7042361 0.843845 0.0701557 0.8438488 0.0000038
0.7743918 1.1811792 0.0655348 1.181183 0.0000038
0.8399266 1.59778 0.0615418 1.5977839 0.0000039
0.9014684 2.1033372 0.0580504 2.103341 0.0000039
0.9595188 2.7080175 0.0404812 2.7080214 0.0000039
1 3.2190957 3.2190993 0.0000036

Ejemplo (continuación)

El método de Runge-Kutta-Felhberg está implementado en: