________________________________________________________________________
6.3. Método de Runge-Kutta
dy (6.3.1)
= f ( x, y )
dx
yi +1 − yi (6.3.2)
= f ( xi , y i )
xi +1 − xi
h = xi +1 − xi (6.3.3)
De esa manera, utilizando la información que nos proporciona el valor de la derivada f(xi,
yi) en el punto i, podemos estimar el valor de la función en el punto i+1,
yi +1 = yi + ( xi +1 − xi ) f ( xi , yi ) , (6.3.4)
En la sección 6.2 mostramos que podemos utilizar información acerca de los valores
conocidos o estimados de las variables, no sólo en el punto i, sino también en el punto
i+1, cuando utilizamos la ecuación
1
[ f ( xi , yi ) + f ( xi +1 , yi + hf ( xi , yi )] , (6.2.3)
2
para así recalcular, tratando de obtener una estimación más precisa para el valor de la
variable dependiente y en el punto i+1,
h
yi +1 = yi + [ f ( xi , yi ) + f ( xi +1 , yi + hf ( xi , yi )] (6.2.4)
2
Este método utiliza entonces cuatro parámetros, los cuales son calculados de la siguiente
manera:
k1 = hf ( xi , y i ) (6.3.1.1)
h 1 (6.3.1.2)
k 2 = hf ( xi + , yi + k1 )
2 2
h 1 (6.3.1.3)
k 3 = hf ( xi + , yi + k 2 )
2 2
k 3 = hf ( xi +1 , yi + k 3 ) (6.3.1.4)
Como se puede ver en las fórmulas anteriores, los cuatro parámetros son distintas
estimaciones para el valor de las diferencias finitas para la variable dependiente y, en
diferentes puntos, es decir, para diferentes valores de la variable independiente x.
(6.3.1.5)
yi +1 = yi +
1
(k1 + 2k 2 + 2k 3 + k 4 )
6
la cual, utilizada junto con un valor inicial y0 = y ( xo ) nos permitirá resolver el problema.
El error local de truncamiento que resulta de este método es del orden de la cuarta
potencia del paso de integración h, es decir el error es de O(h4).
d 2θ g (6.3.2.1)
− senθ = 0
dt 2 L
θ (0) = α (6.3.2.2)
θ ′(0) = β (6.3.2.3)
d2y g (6.3.2.4)
= sen( y )
dt 2 L
y ( 0) = y (6.3.2.5)
y (1) = y ′
dy (6.3.2.6)
y ′(0) = y ′ = = y (1)
dx
d2y g
y (1) = y = 2 = sen( y )
′ ′′
dx L
Al codificar nuestro programa en C++ para resolver el problema del péndulo usando el
método de Runge-Kutta de cuarto orden, utilizando los siguientes valores
derivada[0] = y[1];
derivada[1] = -9.806 * sin (y[0]);
/*
runge-k.cpp
Programa para simular movimiento de un péndulo
Integración por Método de Runge-Kutta
Ricardo E. Ávila, 2 Noviembre 2001
Longitud del péndulo = 1 m
Aceleración de la gravedad = -9.806 m/s2
*/
#include <stdlib.h>
#include <math.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdio.h>
const int N = 2;
// Este programa puede resolver hasta un maximo de N = 2
// ecuaciones diferenciales ordinarias simultaneas
// de primer orden. Cambiar el valor de N segun sea necesario.
derivada[0] = y[1];
derivada[1] = -9.806 * sin (y[0]);
// Paso 1
funcion(t, f, y);
for (indice = 0; indice < N; indice++)
f1[indice] = dt * f[indice];
// Paso 2
double tt = t + half_dt;
for (indice = 0; indice < N; indice++)
yy[indice] = y[indice] + 0.5 * f1[indice];
funcion(tt, f, yy);
// Paso 3
for (indice = 0; indice < N; indice++)
{
f2[indice] = dt * f[indice];
yy[indice] = y[indice] + 0.5 * f2[indice];
}
funcion(tt, f, yy);
// Paso 4
double next_time_step = t + dt;
for (indice = 0; indice < N; indice++)
{
f3[indice] = dt * f[indice];
yy[indice] = y[indice] + f3[indice];
}
funcion(next_time_step, f, yy);
// Condiciones iniciales:
y[0] = 0.392699081; // Posicion inicial del pendulo, en radianes
int i = 10;
// i: contador para guardar resultados cada 10 ciclos de while
if (i == 10)
{
position << y[0] << endl;
speed << y[1] << endl;
i = 1;
}
} // Termina while