El dragón diferencial

posada

Posada de los dos caminos

El posadero lo había llamado estofado, pero su verdadero nombre debería ser sopa de grasa con tropezón de carne sospechosa. Para mejorar todavía más la cena, seguía molestándole con esa horrible voz nasal:

—Así que decís que habéis venido para matar al dragón —dijo mientras se aguantaba la risa.

Runge levantó la mirada y contestó entre dientes:

—No, he dicho vencer al dragón. —Su intento de parecer duro quedó arruinado al ser incapaz de partir el trozo de pan que acompañaba al estofado. Si pudiera hacerse una armadura con ese pan, el dragón no tendría ninguna posibilidad contra él. El posadero seguía con su espectáculo para alegría de la parroquia.

—Un alfeñique como vos no serviría ni para rellenar el hueco de una muela de ese horrible monstruo. ¿Conocéis al caballero Bernoulli? —Runge palideció, no podía ser, ¿se le había adelantado otra vez ese presuntuoso? La familia Bernoulli siempre se cruzaba en su camino.

El posadero se cansó de esperar la respuesta de su cliente y siguió con su monólogo.

—El dragón lo partió por la mitad con un golpe de su cola antes de que pudiera sacar su espada. Luego chupó las dos mitades como si fueran la cabeza de una gamba.

Un escalofrío mezcla de pavor y de placer recorrió la espina dorsal de Runge. Para evitar que los clientes vieran su irónica sonrisa, contestó con un simple gruñido mientras seguía centrado en su plato. El dueño de la posada tenía carrete para rato, así que siguió poniéndole al día.

—Por vuestro aspecto no sois un guerrero como Bernoulli ¿no seréis uno de esos magos? El gran Frobenius vino aquí jactándose de sus poderes y aseguró que, sin despeinarse, mataría al dragón con una serie de sus potentes conjuros.  Antes de que hiciera su primer pase mágico, el dragón le había atravesado el pecho con una de sus garras.

—No me gusta la magia. Pero empieza a caerme bien ese dragón.

—¿Entonces cómo demonios queréis matarlo?

Runge miró hacia arriba con gesto de desesperación, pidiendo paciencia a los dioses.

—He dicho que venceré al dragón, no que vaya a matarlo. Solo necesito mi ingenio y encontrar las condiciones ideales.

dragonLiso

La verdad sobre la física

Voy a contaros 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.

m\frac{d^2x}{dt^2} = -k x - b\frac{dx}{dt}

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 habéis dicho que os llamabais, 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? Tu GPS te lo demuestra a diario. 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:

\frac{dy}{dx} = -2x -y

Cuya solución teniendo la condición inicial y(0)=-1 es:

y(x) = -3e^{-x} -2x +2

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.

dragon

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:

metodork2

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 y_{n+1}. 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 (k_i) de los cálculos anteriores. f(x,y) es el valor de la derivada que queremos calcular, en nuestro caso:

f(x,y) = -2x -y

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 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.

rkpasolargo

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:

rkres

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:

graficaRK

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 hombrecillo. 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.

dragmuerto
Esta entrada participa en la edición 4.123105 del Carnaval de Matemáticas, cuyo anfitrión es cifrasyteclas. Y de paso, acabó ganando el premio al mejor post de la edición:
Es tan bonico y tan brillante, ains. Seguro que la guarida de un dragón está llena de trofeos como éste.

Es tan bonico y tan brillante, ains. Seguro que la guarida de un dragón está llena de trofeos como éste.

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:
import math
import sys

def rk4(x, y, f, h):
    """Iteracion metodo Runge-Kutta orden 4

    x: valor de x actual
    y: valor de y actual
    f: funcion a calcular con parametros x e y
    h: tamano del paso"""

    #obtener los cuatro valores aproximados de y (k_i)
    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)

    #nuevo valor de y a partir de los valores k calculados
    y2 = y + ((k1 + (2*k2) + (2*k3) + k4)/6)
    #nuevo valor de x
    x2 = x + h
    return x2, y2

def funciontest(x, y):
    """funcion a calcular dy/dx = -2x -y"""
    return (-2*x) - y

def funcionreal(x):
    """funcion resultado de resolver la ecuacion diferencial de prueba"""
    return (-2*x -3*math.exp(-x) + 2)

dt = 0.5 #tamano del paso
final = 5 #final de la iteracion
state = 0.0, -1.0 # x, y valores iniciales

if (len(sys.argv)>=5): #paso por parametros de los valores iniciales del calculo
    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) #mostrar estado inicial

while state[0] < final:#realizar iteraciones
    #calcular siguiente valor de la iteracion
    state = rk4(state[0], state[1], funciontest, dt)
    #preparar resultado a mostrar en pantalla, con el valor de la funcion real
    res = state[0], state[1], funcionreal(state[0])
    #mostrar resultado de la iteracion y valor real de la funcion
    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
Anuncios

Publicado el 29 septiembre, 2013 en Carnaval de matemáticas, Ciencia gamberra, Relatos, Uncategorized y etiquetado en , , . Guarda el enlace permanente. 21 comentarios.

  1. Precioso articulo

  2. Sencillamente genial , enhorabuena.
    Este es el tipo de textos que me gustaría que mi hijo leyera en un libro en el colegio

  3. Frau Sonnenblume

    puff simplemente genial!

  4. ¡Brillante! Por cierto, a manera de anécdota: pensaba que Kutta sonama muy parecido a p… así que sonaría a “hijo de p…” 😀 xDDD

  5. ¡Muy bueno!
    Me ha recordado a los libros de los maestros Pratchett, Stewart y Cohen.

  1. Pingback: El dragón diferencial

  2. Pingback: El dragón diferencial | El zombi de Schrödinger

  3. Pingback: Bitacoras.com

  4. Pingback: El dragón diferencial | Los antisistema son:

  5. Pingback: Resumen de la edición 4.123105 del Carnaval de Matemáticas | Cifras y Teclas

  6. Pingback: Lo Mejor de la Semana (29 de septiembre-5 de octubre) | Hablando de Ciencia | Artículos

  7. Pingback: Anónimo

  8. Pingback: We are in it only for the ego | El zombi de Schrödinger

  9. Pingback: Anónimo

¡Un comentario para un ex-leproso!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: