Voy a contarles un secreto.
Cuando se empieza a estudiar física, todo es como un mundo ideal: las balas de cañón viajan por el vacío y no las frena el aire, las cargas eléctricas están muy quietas en su sitio y los péndulos solo realizan pequeñas oscilaciones. Pero ese mundo ideal se acaba pronto y esas fórmulas tan sencillas de aprender empiezan a escasear. Los sistemas van complicándose y aparecen las ecuaciones diferenciales.
Una ecuación diferencial es aquella en la que su valor depende de la tasa de cambio de una de sus variables, o dicho de otra forma, es una ecuación en la que aparecen términos en forma de derivada. En el caso del muelle, la amortiguación es un factor que depende de la propia velocidad del sistema.
Ecuación de la segunda ley de Newton que describe el comportamiento de un muelle amortiguado.
También hay un mundo ideal de las ecuaciones diferenciales.
Durante un tiempo el profesor te lanza legiones de ecuaciones diferenciales. Unas pueden ser destruidas con la ayuda de la función exponencial, otras pensando en campos conservativos o en los truquitos que genios como Bernoulli, Frobenius o Laplace nos han regalado.
Pero llega un día en el que ante ti se presenta la ECUACIÓN; hasta ese día has luchado con pequeñas bestias diferenciales, pero ahora tienes en frente al DRAGÓN DIFERENCIAL.
Salón de recepción del duque de Bessel
El duque no estaba para bromas y menos para que un loco viniera a decirle que pensaba vencer al dragón.
—Y, ¿cómo han dicho que te llamas alfeñique?
El visitante intentó sacar pecho y alzarse un poco para darse notoriedad.
Hay cuerpos que están esculpidos para adoptar poses heroicas, pero la genética había sido cruel con Runge y su pose recordaba a la de un asustadizo suricato que otea el horizonte en busca de peligros.
—Mi nombre es Runge, hijo de Kutta —consiguió decir con voz temblorosa.
—Sea cual sea tu nombre, me es indiferente; solo serás uno más en la lista de muertos por el dragón. Aunque tengo curiosidad por saber cómo piensas matar a la bestia.
—Vencer, vencer al dragón, mi señor —Runge sacó de su abrigo un pergamino que desplegó en la mesa del duque—.
Verá, traigo aquí el esquema de mi plan. Si lo revisa, verá su absoluta genialidad.
Dejó al duque echar un vistazo, quien rápidamente se percató de que no estaba ante un charlatán.
—Este plan es brillante Ru, ru…
—Runge, hijo de Kutta. Es brillante, lo sé. —La genética había sido cruel con su cuerpo, pero cualquiera que hubiera entrado en la sala en ese momento habría visto la mirada cautivadora de un genio—. Solo necesitaré que me de carta blanca para campar por su despensa.
¿Y cómo resuelvo esto?
Cuando nos encontramos al dragón diferencial, no podemos resolverlo como hacíamos con las pequeñas bestias diferenciales. Hay que aplicar infinidad de trucos. Pero siempre hay otra opción, una en la que las computadoras juegan un papel importante. Y ahí es donde aparece el cálculo numérico. Dadas unas condiciones iniciales para el problema y aplicando un método numérico, podemos aproximar el comportamiento de nuestra ecuación diferencial.
¿Y esto sirve para algo? Los cálculos de posicionamiento del GPS deben tener en cuenta una gran cantidad de factores, por lo que usan métodos numéricos para resolver los sistemas de ecuaciones que acaban calculando tu posición.
Incluso estos métodos fueron importantes antes de la llegada de la primera computadora. Durante la Segunda Guerra Mundial, el ejercito americano usaba grupos de mujeres para realizar cálculos de tabla de tiro para su artillería. Estaban entrenadas para realizar cálculo numérico sobre ecuaciones diferenciales. De hecho, la primera computadora fue desarrollada para calcular tablas de tiro para el ejercito, aunque rápidamente Von Neumann le buscó otro uso.
Para demostrar el funcionamiento de uno de estos métodos, utilizaremos una ecuación diferencial bastante sencilla, de forma que podamos comparar la solución real y la obtenida mediante el cálculo numérico.
La ecuación es la siguiente:
Cuya solución teniendo la condición inicial
es:
Y el método numérico que usaremos para comparar su funcionamiento es el algoritmo de Runge-Kutta.
En la arboleda de Taylor
Este era el lugar que necesitaba. Ahora solo tenía que atraer al dragón. Se suele pensar que a los dragones hay que atraerlos con jóvenes vírgenes, a ser posible con vestidos vaporosos y atadas a una roca.
Seamos serios, ¿para qué quiere un dragón una joven sin excesiva carne en sus huesos?
Lo ideal para mantener contento a un dragón es ofrecerle algo grande, y a ser posible, grasiento. Runge tenía un método mucho mejor para atraer dragones.
La fórmula de Runge era prácticamente perfecta: se preparaba un capón, se untaba en manteca de cerdo y se metía dentro de una gallina.
Esta se untaba en manteca de cerdo, se rodeaba de panceta y se introducía dentro de un gran pavo, al que se le daba el tratamiento de manteca y panceta y se metía dentro de un cerdo.
Aunque parezca una redundancia, el cerdo se untaba con manteca y se rodeaba de nuevo con panceta. Finalmente el cerdo se usaba para rellenar una vaca que se untaba generosamente en manteca.
Todo esto se ponía en un gran espetón y un complicado sistema de poleas permitía dar vueltas al leviatán comestible encima del fuego.
Ya estaba todo preparado. Ahora solo quedaba esperar a que el humo, producido por la aberrante receta, despertara al dragón y le atrajera al campo de juego que Runge había preparado concienzudamente.

Runge-Kutta
Los métodos Runge-Kutta son una familia de métodos de cálculo iterativo de soluciones para ecuaciones diferenciales.
Podemos encontrar distintas variantes y órdenes.
El que veremos hoy es el Runge-Kutta (RK) de cuarto orden:

Cálculo de una iteración del método Runge-Kutta de cuarto grado
El método Runge-Kutta de cuarto grado realiza cuatro estimaciones (k) para el valor de y, que luego se ponderarán para obtener el valor definitivo
.
El valor de x se aumenta en cada iteración en una cantidad h, llamada tamaño de paso. Las estimaciones se van haciendo utilizando información (
) de los cálculos anteriores. f(x,y) es el valor de la derivada que queremos calcular, en nuestro caso:
Estos 6 cálculos se repiten hasta llegar al valor de x para el que queremos conocer el valor de y.
Para iniciar el algoritmo, necesitamos valores iniciales para x e y. En nuestro ejemplo, x vale 0 e y tiene el valor -1.
El tamaño del paso es muy importante.
Si utilizamos un tamaño de paso muy grande, la estimación puede ser mala, en cambio si elegimos un paso muy pequeño, el número de cálculos puede ser excesivo.

Cuando ejecutamos el algoritmo desde la condición inicial (y=-1, x=0) hasta x=10, tenemos valores muy diferentes dependiendo del tamaño de paso. Ejecutando 10 pasos(h=1) el resultado es muy bueno, en cambio con dos pasos (h=5) obtenemos un resultado totalmente erróneo.
Eligiendo bien el intervalo de cálculo y el tamaño del paso, podemos obtener valores indistinguibles del valor real de la ecuación:

En cada paso del algoritmo se aumenta x según el valor de paso elegido.RK son los valores obtenidos para distinto tamaño de paso con el método Runge-Kutta. y es el valor real de la función que queremos aproximar.
En la tabla se puede ver cómo a medida que aumenta el valor de x, se van obteniendo estimaciones mediante el método Runge-Kutta con tamaño de paso 0.01, 0.1 y 0.5.
La última columna son los valores reales de la función. Se puede ver que un menor tamaño de paso favorece la precisión del algoritmo. Por otro lado, tendríamos 100 iteraciones para el tamaño de paso h=0.01 y solo 2 para el tamaño de paso h=0.5.
Al final la ejecución de un método de cálculo numérico debe alcanzar un equilibrio entre velocidad y precisión, según las necesidades.
A continuación se puede ver cómo los valores calculados para un tamaño de paso 0.1 son indistinguibles del valor real de la función:

En rojo se puede ver el valor real de la función, las cruces negras son los valores que se han calculado mediante Runge-Kutta con tamaño de paso h=0.1.
Iterando dragones
“Una siesta, eso es lo que necesito”. Pensó el dragón después de semejante banquete. Había intentado alzar el vuelo, pero se sentía muy pesado.
De repente oyó un ruido en el bosque y apareció un hombrecillo en el claro.
—Menuda basura de dragón, no eres capaz ni de levantar el vuelo.
En lugar de dragón, debería llamarte lagarto.
La bestia rugió y se lanzó a por el hombrecito.
El problema es que cuando llevas en el estómago una vaca que ha sido rellenada como una matrioska con otros animales, manteca y panceta, tu cerebro envía la órdenes a una velocidad mayor que la que puede permitirse tu cuerpo.
Runge era rápido, había que reconocerlo, parecía un pequeño roedor saltando por mitad del bosque, hasta que se adentró en una cueva.
El dragón emitió un rugido de triunfo y entró tras él.
Una gran ventaja de los dragones en las cuevas es su visión, pueden verlo prácticamente todo. Pero esa ventaja también puede ser una debilidad; en cuanto el dragón habitúo su vista a la oscuridad, Runge activó su bomba luminosa.
Muchos podrían pensar que Runge era un mago, pero era un simple truco de alquimia aprendido en sus viajes.
El dragón quedó cegado, pero seguía oyendo la voz del hombrecillo.
La rabia se apoderó de él, su olfato y su oído eran suficientes para darle caza. Hasta que llegó a una pequeña galería en la que un minúsculo agujero dejaba ver la luz del día. Su presa había escapado.
La bestia no podía seguir hacia delante, no había espacio suficiente para acomodar su cuerpo, así que decidió ir hacia atrás.
En ese momento, oyó un estruendo y notó cómo sus cuartos traseros quedaban inmovilizados.
Horas después, y tras asegurarse de que era cierto que la fiera estaba controlada, el duque se acercó y felicitó efusivamente a Runge.
—Lo que ha hecho es impresionante.
—Simplemente había que buscar las condiciones idóneas y ser conocedor del comportamiento de los dragones.
El resto, ejecutar los pasos en el orden correcto. Ahora está en su mano el destino de esta bestia, mi trabajo aquí ha terminado.
Más información
Análisis numérico con aplicaciones, 6ª edición. Gerald – Wheatley. Pearson, Prentice Hall.
Ecuaciones diferenciales y problemas con valores en la frontera, 4ª edición. Nagle, Saff, Snider. Pearson, Prentice Hall.
Código fuente usado para realizar los ejemplos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import math
import sys
def rk4(x, y, f, h):
k1 = h * f(x, y)
k2 = h * f(x + (h / 2 ) , y + (k1 / 2 ))
k3 = h * f(x + (h / 2 ), y + (k2 / 2 ))
k4 = h * f(x + h, y + k3)
y2 = y + ((k1 + ( 2 * k2) + ( 2 * k3) + k4) / 6 )
x2 = x + h
return x2, y2
def funciontest(x, y):
return ( - 2 * x) - y
def funcionreal(x):
return ( - 2 * x - 3 * math.exp( - x) + 2 )
dt = 0.5
final = 5
state = 0.0 , - 1.0
if ( len (sys.argv)> = 5 ):
dt = float (sys.argv[ 1 ])
final = float (sys.argv[ 2 ])
state = float (sys.argv[ 3 ]), float (sys.argv[ 4 ])
res = state[ 0 ], state[ 1 ]
print ( "%6.2f %6.2f" % state)
while state[ 0 ] < final:
state = rk4(state[ 0 ], state[ 1 ], funciontest, dt)
res = state[ 0 ], state[ 1 ], funcionreal(state[ 0 ])
print ( "%6.7f %6.7f %6.7f" % res)
|
Ejemplo de llamada al código para h=1, parar con x=10, valor inicial y(x=0)=-1: python rk.py 1 10 0 -1