Bifurcaciones

15/09/2014 6 comentarios
Menear

La ruta hacia el caos

"Vivimos en un arcoíris de caos" —Paul Cézanne—

Soluciones estables...

La última entrada de este blog nos llevó a considerar la aplicación logística como un modelo demográfico sencillo donde la tendencia a un crecimiento exponencial se ve limitada por los recursos. Esta aplicación nos dice la población en la generación enésima (xn) en función de la población de la generación anterior (xn-1).


xn = rxn-1(1-xn-1)

El parámetro r (relacionado con la tasa de reproducción), caracteriza nuestro modelo. Distintos valores de r se corresponden con distintos modelos de población. Por ejemplo, usando el valor r = 1.5, y con una población inicial x= 0.1, obtenemos los valores


0.1
0.135
0.1751625
0.216720897891
0.254629425462
0.284689921726
0.305462355291
0.318232657186
0.32544094963
0.329293706901
0.331289042244

Como podemos observar la población tiende a estabilizarse en el valor x*= 0.33. Además este valor parece independiente del valor inicial de la población, tal y como nos muestra la gráfica de la derecha (donde el valor inicial de la población es x= 0.0000001). Pero distintos valores del parámetro r producen comportamientos muy distintos. Por ejemplo, comprobamos que cuando r = 3.8 la población fluctúa de una generación a la siguiente de una manera en apariencia impredecible.

Para comprender este comportamiento, primero tenemos que entender el caso más sencillo. ¿Por qué se estabiliza la población en x = 0.33 cuando r = 1.5? El truco es darse cuanta de que la población se estabiliza cuando


x = rx(1-x).

El miembro de la derecha de la ecuación de arriba es la población que tendremos una generación más tarde si ahora tenemos una población igual a x. Como en el miembro de la izquierda estamos diciendo que la población es también x, la ecuación de arriba expresa exactamente la condición de que la población no cambie de una generación a la siguiente. El que se acuerde de resolver ecuaciones de segundo grado puede llegar a la solución


x = 1 - 1/r.

Los matemáticos dicen que este valor de x es un punto fijo de la aplicación logística. Esta ecuación parece explicar por qué la población se estabiliza en x = 1/3 = 0.33333... cuando r  = 1.5. Pero la misma ecuación nos dice que cuando r = 3.8 el punto fijo de la aplicación es x = 1-1/3.8 = 0.73684... Sin embargo esto no coincide con lo que observamos. Ni siquiera si empezamos la simulación (usad el programa generaciones.py de la entrada anterior) muy cerca de este valor. Al principio la población parece estable, pero tras unas pocas generaciones la población muestra un comportamiento impredecible, tal y como podemos ver a la derecha.

... y soluciones periódicas

Antes hemos demostrado que si la población es exactamente igual a x*= 1-1/r, entonces una generación más tarde la población también será x*= 1-1/r. Pero si en vez de empezar exactamente en x*, empezamos en x*+0.00000001, pueden pasar dos cosas: que nos alejemos de x* o que nos acerquemos a x*. Si nos acercamos a x*, cada iteración nos acercará más y más, y decimos que el punto fijo x* es estable, o que es un atractor. En caso contrario el punto fijo no es estable, y es un punto de repulsión.

El lector puede experimentar con el programa generaciones.py, y convencerse de que el punto x* es estable para r = 1.5, pero no lo es para r = 3.8. Pero ¿sabría el lector decir cuál es el valor de r en que sucede el cambio? Uno puede resolver la cuestión numéricamente, pero si el lector ha leído las anteriores entradas del blog, y es bueno en matemáticas, sabrá que la derivada de una función nos dice cómo se comporta la función cerca de cualquier punto, y podrá demostrar con un poco de paciencia que la condición es equivalente a que la derivada sea menor que 1. El que no lo tenga claro de momento no tiene que preocuparse mucho, ya volveremos al tema más adelante.

Cojamos el camino que cojamos, el resultado debe ser el mismo. El punto fijo deja de ser estable en el valor r = 3. Si r < 3, la población tiende a estabilizarse en el punto fijo que hemos calculado, pero cuando r > 3 la población no se estabiliza en un valor constante. Por ejemplo cuando r = 3.3 también llegamos a un equilibrio, pero este se alcanza con la población oscilando entre los valores 0.49, 0.81, 0.49, 0.81,... ¡Tenemos una órbita de periodo dos! En el valor r = 3 la solución estable se bifurca. Si seguimos variando el parámetro r, vamos a ir observando nuevas bifurcaciones. Para r = 3.5 tenemos una órbita de periodo 4: 0.8269, 0.5008, 0.8749, 0.3828. Para r = 3.55 una órbita de periodo 8: 0.8278, 0.5060, 0.8873, 0.3548, 0.8126, 0.5404, 0.8816, 0.3703. Para r = 3.565 tenemos una órbita de periodo 16: 0.4859, 0.8905, 0.3474, 0.8083, 0.5523, 0.8814, 0.3724, 0.8332, 0.4953, 0.8911, 0.3457, 0.8064, 0.5565, 0.8798, 0.3768, 0.8371.

Estamos ante una cascada de bifurcaciones. Pasamos de tener un punto fijo estable (periodo uno), a una órbita estable de periodo 2, 4, 8, 16, 32, 64, 128... Hemos demostrado que la primera bifurcación sucede para r = 3.0. El lector tiene que demostrar que la segunda bifurcación sucede exactamente en r = 3.4494897 (¿Alguien sabe cómo hacerlo?), la tercera para r = 3.5440903 (yo no soy capaz de calcular esta con papel y lápiz, pero quizás algún lector sí), la cuarta bifurcación sucede para r = 3.5644073, la quinta bifurcación para r = 3.5687594. El programa bifurcaciones.py es capaz de mostrarnos el comportamiento de nuestro modelo de población en función del parámetro r. Uno puede usarlo para generar imágenes de distintos intervalos del parámetro r y localizar los puntos de bifurcación.

Como podemos observar las bifurcaciones son cada vez más frecuentes. De hecho podemos calcular las distancias entre bifurcaciones


3.4494897 - 3.         = 0.4494897
3.5440903 - 3.4494897  = 0.094601
3.5644073 - 3.5440903  = 0.020317
3.5687594 - 3.5644073  = 0.0043521

Y convencernos de que están cada vez más cerca... Pero si fuésemos mucho más listos y nos llamásemos Mitchell Feigenbaum también se nos ocurriría calcular los cocientes de estas diferencias


0.4494897 / 0.094601  = 4.7514
0.094601  / 0.020317  = 4.6562
0.020317  / 0.0043521 = 4.6683
...

Y nos daríamos cuenta de que el cociente tiende a un valor (ahora conocido como primera constante de Feigenbaum) aproximado de 4.669 201 609... El lector debe convencerse (o preguntar) que como los intervalos entre bifurcaciones se hacen cada vez más pequeños en una progresión geométrica, hay un valor finito de r (aproximadamente r = 3.56995) en el que ¡el periodo se vuelve infinito!: las oscilaciones nunca se repiten, y tenemos un comportamiento caótico. Lo más sorprendente de todo, es que el valor de la constante de Feigenbaum no es algo particular del mapa logístico: ¡es universal! Cualquier función de una variable con un único máximo cuadrático (casi todos los máximos son cuadráticos), se bifurca exactamente a la misma velocidad. De hecho el lector puede repetir todos los ejercicios de la entrada de hoy con las funciones


f(x) = r - x^2
f(x) = r sin(x)
...

Y obtener sus propios diagramas de bifurcación (variando r en el rango adecuado), y sus propios valores de la constante de Feigenbaum (¡que serán todos iguales!).

Pero aún quedan muchas cosas por aclarar. ¿Qué queremos decir exactamente con que el comportamiento es caótico? La cascada de bifurcaciones siempre produce regiones de periodo par ¿Por qué? ¿Hay regiones de periodo impar? ¿Puede haberlas?

Po fueno, po fale, po malegro

Las cascadas de bifurcaciones son una de las formas más típicas de transición entre un comportamiento regular y uno caótico. Juegan un papel en la transición del régimen laminar al régimen turbulento de un fluido, en los modelos meteorológicos y, como hemos visto, en los modelos de poblaciones. Incluso en el mundo de la biología hay procesos en los que las bifurcaciones juegan un papel fundamental. El comportamiento de un sistema cambia de forma brusca cerca de un punto de bifurcación, y las células usan este cambio de comportamiento para regular muchos de sus procesos tales como la replicación.

Una vez más la aplicación logística nos ha servido de ejemplo para ilustrar un concepto que juega un papel en distintas situaciones: la transición a un estado caótico. En la siguiente entrada vamos a explorar este comportamiento caótico.