Raul E. Lopez Briega

Matemáticas, análisis de datos y python

Sistemas dinámicos, Complejidad y Caos con Python

Sistemas dinámicos, complejidad y caos

"LLamamos caos al orden que todavía no comprendemos"

Edward Lorenz

Introducción

Vivimos en un mundo tan bello como complejo. El enfoque tradicional de la ciencia,que busca generalmente reducir a los sistemas complejos en cada una de sus partes, comprender cada parte, y luego entender todo el sistema, parece no ser suficiente. Cuando las partes comienzan a conectarse e interactuar entre sí, las bases científicas de este enfoque comienzan a fallar, y se torna casi imposible predecir el comportamiento del sistema. Los simples supuestos como la linealidad, la independencia, o la distribución normal parecen no ser de mucha utilidad a la hora de modelar los fenómenos incluso más sencillos del mundo que nos rodea. Es a partir de esta realidad, que nuevos enfoques se comenzaron a desarrollar y surgieron nuevos campos de estudio multidisciplinarios como los sistemas dinámicos, la complejidad, o la teoría del caos.

¿Qué es un sistema complejo?

Es difícil definir rigurosamente que es un Sistema complejo, podemos decir que es un campo de investigación interdisciplinario que busca explicar cómo un gran número de entidades relativamente simples (las cuales generalmente se denominan agentes) se organizan, sin el beneficio de ningún controlador central, en un todo colectivo que crea patrones, usa información y, en algunos casos, evoluciona y aprende. Es el caso típico en que el todo es mucho más que la suma de sus partes. Aunque no existe una buena definición de que es un Sistema complejo, si podemos describir algunas de las características principales que poseen estos sistemas, como ser:

  • El sistema contiene una colección de muchos agentes que interactúan. Las interacciones entre estos agentes pueden surgir porque están físicamente cerca el uno del otro, o porque son miembros de algún tipo de grupo, o porque comparten alguna información común. En la medida en que los agentes están vinculados entre sí a través de sus interacciones, también se puede pensar que forman parte de una red o grafo. Por lo que el análisis de redes es una herramienta importante para comprender estos sistemas.

  • El comportamiento de estos agentes se ve afectado por una memoria o retroalimentación. Esto significa que algo del pasado afecta algo en el presente, o que algo que sucede en un lugar afecta lo que está sucediendo en otro, en otras palabras, una especie de efecto de arrastre. El resultado neto de que todos tengan tal memoria puede ser que el sistema como un todo también recuerde. Por lo tanto, un patrón o secuencia global particular puede manifestarse en el sistema.

  • Los agentes pueden adaptar sus estrategias de acuerdo a su historia. Esto simplemente significa que un agente puede adaptar su comportamiento por sí mismo, con la esperanza de mejorar su rendimiento.

  • El sistema es típicamente abierto. Es decir, que el sistema puede ser influenciado por su entorno.

Así mismo, en el comportamiento característico de los Sistemas complejos, podemos observar los siguientes rasgos:

  • El sistema parece estar vivo. El sistema evoluciona de una manera no trivial y, a menudo complicada, impulsada por una ecología de agentes que interactúan y se adaptan bajo la influencia de la retroalimentación.

  • El sistema exhibe fenómenos emergentes que generalmente son sorprendentes y pueden ser extremos. En terminología científica, el sistema está lejos de alcanzar un equilibrio. Esto básicamente significa que cualquier cosa puede suceder, y si se espera lo suficiente, generalmente lo hará. Tales fenómenos generalmente son inesperados en términos de cuándo surgen, de ahí su aspecto de sorpresa. Pero el sistema también tenderá a exhibir fenómenos emergentes que a su vez son sorprendentes en el sentido de que no podrían haber sido predichos en base al conocimiento de las propiedades de los agentes individuales.

  • Los fenómenos emergentes suelen surgir en ausencia de cualquier tipo de mano invisible o controlador central. En otras palabras, un Sistema complejo puede evolucionar de una manera complicada por sí mismo. Por esta razón, a menudo se considera que los Sistemas complejos son mucho más que la suma de sus partes.

  • El sistema muestra una mezcla complicada de comportamiento ordenado y desordenado. De manera más general, todos los Sistemas complejos parecen poder moverse entre el orden y el desorden por su propia cuenta.

¿Qué es la teoría del caos?

La teoría del caos, más que una teoría, es un paradigma que supuso en su momento una gran revolución científica, al reflejar que muchos sistemas que eran considerados deterministas y previsibles tenían severos límites en dicha previsibilidad. Es decir, que no eran tan útiles como se creía a la hora de predecir eventos futuros. Iniciada por Henri Poincaré y popularizada gracias al trabajo del matemático y meteorólogo Edward Lorenz, la teoría del caos se ha utilizado en campos como las matemáticas y la meteorología para explicar la inexactitud y la dificultad para obtener resultados previsibles de la realidad.

El efecto mariposa

Esta teoría es ampliamente conocida por lo que se denomina el efecto mariposa, según el cual el débil aleteo de una mariposa puede ser la causa de un huracán a miles de kilómetros de distancia. Se indica de este modo que la existencia de una variable concreta puede provocar o alterar otras, influyéndose progresivamente hasta obtener un resultado fuera de lo esperado. En síntesis, podemos considerar que la teoría del caos establece que pequeños cambios en las condiciones iniciales crean grandes diferencias respecto al resultado final, con lo que una gran mayoría de los sucesos y sistemas no resultan totalmente predecibles.

Es importante tener en cuenta que a pesar de las apariencias, el caos al que se refiere esta teoría no implica una falta de orden, sino que los hechos y la realidad no se ajustan a un modelo lineal.

El mapa logístico

Para entender mejor qué es el caos exploremos el famoso mapa logístico, sin duda una de las ecuaciones más famosas en la ciencia de los sistemas dinámicos. El mapa logístico representa un modelo sencillo para intentar explicar la dinámica de una población de la que se ha supuesto que tiene un crecimiento cada vez más lento a medida que se acerca a una cantidad de individuos considerada como límite. El modelo simplifica al combinar los efectos de la tasa de natalidad y la tasa de mortalidad en un solo número, llamado $R$. El tamaño de la población se reemplaza por un concepto relacionado "fracción de la capacidad de carga", llamado $x$. Su expresión matemática es la siguiente:

$$x_{t+1} = Rx_t(1 - x_t)$$

Esta ecuación define las reglas o dinámicas de nuestro sistema: $x$ representa la población en un momento dado $t$, y $R$ representa la tasa de crecimiento. En otras palabras, el nivel de población en un momento dado es una función del parámetro de la tasa de crecimiento y el nivel de población del intervalo de tiempo anterior. Si la tasa de crecimiento es demasiado baja, la población se extinguirá. Las tasas de crecimiento más altas podrían establecerse hacia un valor estable o fluctuar a través de una serie de auges y declives de la población. Como podemos ver, es una ecuación muy simple! la más simple en capturar la esencia del caos!

El mapa logístico se vuelve muy interesante a medida que vamos variando el valor de $R$; veamos algunos ejemplos numéricos con la ayuda de Python y la librería pynamical.

In [1]:
Ver Código
In [2]:
# modelo logistico para 20 generaciones con 7 tasas de crecimiento entre 0.5 y 3.5.
poblacion = simulate(num_gens=20, rate_min=0.5, rate_max=3.5, num_rates=7)
poblacion.applymap(lambda x: '{:03.3f}'.format(x))
Out[2]:
0.5 1.0 1.5 2.0 2.5 3.0 3.5
0 0.500 0.500 0.500 0.500 0.500 0.500 0.500
1 0.125 0.250 0.375 0.500 0.625 0.750 0.875
2 0.055 0.188 0.352 0.500 0.586 0.562 0.383
3 0.026 0.152 0.342 0.500 0.607 0.738 0.827
4 0.013 0.129 0.338 0.500 0.597 0.580 0.501
5 0.006 0.112 0.335 0.500 0.602 0.731 0.875
6 0.003 0.100 0.334 0.500 0.599 0.590 0.383
7 0.002 0.090 0.334 0.500 0.600 0.726 0.827
8 0.001 0.082 0.334 0.500 0.600 0.597 0.501
9 0.000 0.075 0.333 0.500 0.600 0.722 0.875
10 0.000 0.069 0.333 0.500 0.600 0.603 0.383
11 0.000 0.065 0.333 0.500 0.600 0.718 0.827
12 0.000 0.060 0.333 0.500 0.600 0.607 0.501
13 0.000 0.057 0.333 0.500 0.600 0.716 0.875
14 0.000 0.054 0.333 0.500 0.600 0.610 0.383
15 0.000 0.051 0.333 0.500 0.600 0.713 0.827
16 0.000 0.048 0.333 0.500 0.600 0.613 0.501
17 0.000 0.046 0.333 0.500 0.600 0.711 0.875
18 0.000 0.044 0.333 0.500 0.600 0.616 0.383
19 0.000 0.042 0.333 0.500 0.600 0.710 0.827
In [3]:
# Graficando los resultados
colores = ['yellow', 'green', 'blue', 'peru', 'black', 'red', 'grey']
for color, tasa in reversed(list(zip(colores, poblacion.columns))):
    ax = poblacion[tasa].plot(kind='line', figsize=[10, 6], linewidth=2.5, alpha=0.95, c=color)
ax.grid(True)
ax.set_ylim([0, 1])
ax.legend(title='Tasa de Crecimiento', loc=3, bbox_to_anchor=(1, 0.525))
ax.set_title('Resultados del modelo logistico por tasa de crecimiento')
ax.set_xlabel('Generacion')
ax.set_ylabel('Populacion')

plt.show()

Atractores

Hasta aquí, el sistema parece tener un comportamiento bastante predecible y parece ser estable. En los sistemas dinámicos, un Atractor es un valor, o conjunto de valores hacia los que el sistema tienen a evolucionar en el tiempo y estabilizarse. En nuestro ejemplo, cuando el parámetro de crecimiento es 0.5, el sistema tiene un Atractor de punto fijo en el nivel de población 0 como se muestra en la línea amarilla. En otras palabras, el valor de la población tiende a 0 con el tiempo a medida que el modelo va evolucionando. Cuando el parámetro de tasa de crecimiento es 3.5, el sistema oscila entre cuatro valores, como se muestra en la línea gris. Este otro Atractor se llama de ciclo límite.

Lo verdaderamente interesante se produce cuando aumentamos el valor de la tasa de crecimiento a un valor superior a 4, en ese momento el sistema se vuelve caótico!

Diagrama de bifurcación

Para poder ver claramente como el sistema evoluciona hacia un comportamiento caótico, en los sistemas dinámicos se suele recurrir a la ayuda de un diagrama de bifurcación. Analizando la evolución de nuestra función, podemos ver que en las diferentes iteraciones con los valores de $R$ entre 0.5 y 4.0; el sistema fue evolucionando hacia Atractor de punto fijo, luego hacia otro de ciclo límite de 2 valores, un siguiente de 4, luego otro de 8, y así sucesivamente hasta llegar al caos. Cada uno de estos ciclos son llamadas bifurcaciones.
Estas bifurcaciones a menudo se resumen en un llamado diagrama de bifurcación que traza el Atractor en el que termina el sistema en función del valor de un "parámetro de control", que en nuestro caso es el valor de la tasa de crecimiento $R$.

In [4]:
# Modelo con 100 generaciones haciendo crecer R en 1000 pasos.
pops = simulate(num_gens=100, rate_min=0, rate_max=4, num_rates=1000, num_discard=1)
#Graficando el diagrama de bifurcación
bifurcation_plot(pops)

Como se puede ver en el gráfico, en algún punto más allá de un valor de $R$ de 3.5 las bifurcaciones se vuelven caóticas y se vuelve imposible de predecir.

Edward Lorenz, no linealidad y los atractores extraños

No se puede escribir un artículo sobre caos, sin mencionar a Edward Lorenz quien fuera uno de sus pioneros. Lorenz se topó con las particularidades del caos al trabajar en modelos matemáticos para intentar predecir el clima (algo que ni siquiera podemos hacer bien hoy en día!). Fue el primero en notar (se podría decir que por accidente) el fenómeno de la dependencia sensible a los valores de las condiciones iniciales de algunos sistemas. La característica principal de estos sistemas es su no linealidad. Un sistema es lineal cuando podemos comprender sus partes individualmente y luego unirlas en un todo coherente. Las relaciones lineales se pueden capturar con una línea recta en un gráfico; son fáciles de pensar: cuanto más, mejor. Las ecuaciones lineales se pueden resolver, lo que las hace adecuadas para libros de texto. En cambio, un sistema no lineal es aquel en el que el todo es diferente de la suma de las partes; no se pueden resolver o expresar con claridad en un gráfico. Son la pesadilla de cualquier matemático. Profundizando en el estudio de estos sistemas no lineales y su complejidad, Lorenz simplificó algunas ecuaciones de dinámica de fluidos (llamadas ecuaciones de Navier-Stokes) y terminó con un conjunto de tres ecuaciones no lineales:

$$\frac{dx}{dt} = P(y-x)$$$$\frac{dy}{dt} = x(R-z) - y$$$$\frac{dz}{dt} = xy - cz$$

donde $P$ es el número de Prandtl que representa la relación entre la viscosidad del fluido y su conductividad térmica; $R$ es el número de Rayleigh y representa la diferencia de temperatura entre la parte superior e inferior del sistema, . Los valores que utilizó Lorenz fueron $P = 10$, $R = 28$ y $c = 8/3$.

En la superficie, estas tres ecuaciones parecen fáciles de resolver. Sin embargo, representan un sistema dinámico extremadamente complicado. Al graficar los resultados en un espacio fásico; nos encontramos con lo que hoy se conoce como el Atractor de Lorenz.

El Atractor de Lorenz es un ejemplo de un atractor extraño. Los atractores extraños son únicos en comparación a los otros Atractores mencionados, en el sentido en que uno no sabe exactamente en qué parte del Atractor estará el sistema. Dos puntos en el Atractor que están cerca uno del otro al mismo tiempo estarán arbitrariamente separados en momentos posteriores. La única restricción es que el estado del sistema permanezca en el atractor. Los atractores extraños también son únicos porque nunca se cierran sobre sí mismos y el movimiento del sistema nunca se repite. Los atractores extraños tienen una estructura fractal.

Esta imagen mágica del Atractor de Lorenz, que se asemeja a las alas de una mariposa, se convirtió en un emblema para los primeros exploradores del caos. Reveló la fina estructura oculta dentro de un flujo desordenado de datos.

El juego del caos

Siempre me han fascinado el azar y los procesos aleatorios, tal cual refleja la frase de Lorenz que abre el artículo; como a pesar de tener un comportamiento errático y que desafía toda lógica, parecen seguir un orden subyacente que no llegamos a captar del todo. Y nada mejor para captar ese sentimiento que el juego del caos de Barnsley.

Para jugar al juego del caos solo se necesita papel, lápiz y una moneda. Se elige un punto de partida en algún lugar del papel, no importa donde; y luego se inventan dos reglas, una regla de cara y una regla de cruz. Cada una de estas reglas nos dirán cómo dibujar nuevos puntos. Por ejemplo "Muévase dos centímetros hacia el noreste" o "Muévase 25 por ciento más cerca del centro". Ahora solo debemos comenzar a lanzar la moneda al aire y dibujar puntos en el papel, usando la regla de cara cuando la moneda sale cara y la regla de cruz cuando sale cruz. A medida que se van acumulando los puntos en el papel, vamos a poder observar que describen una cierta figura...la cual se va haciendo más clara a medida que aumenta el número de puntos.

La idea sobre la que descansa el juego del caos, es hacer uso de 2 propiedades de los fractales (para conocer más sobre fractales pueden visitar mi artículo anterior). En primer lugar, que los fractales existen como un límite a un proceso aleatorio. Por analogía, uno podría imaginar un mapa de Argentina dibujado con tiza en el piso de una habitación. Un topógrafo con herramientas estándar encontraría complicado medir el área de estas formas incómodas, con costas fractales. Pero supongamos que se arrojaran granos de arroz al aire uno por uno, lo que les permitiría caer al suelo al azar y que luego se contaran los granos que caen dentro del mapa. A medida que pasa el tiempo, el resultado comienza a acercarse al área de las formas, como el límite de un proceso aleatorio. En términos dinámicos, las formas de Barnsley demostraron ser Atractores. La segunda propiedad de los fractales que utiliza el juego del caos es esta cualidad de estar formados por pequeñas copias de la imagen principal. En este sentido, mientras más fractal es la imagen, más simples van a ser las reglas subyacentes para construirlas.

Para demostrar como funciona el juego del caos, podemos ayudarnos de Python para generar el famoso helecho de Barnsley. Al utilizar primero 1000 puntos, podemos apreciar que parece generarse una imagen, pero su forma todavía no es nítida...cuando utilizamos 60000 puntos ya podemos ver con claridad la forma de la hoja de un helecho.

In [5]:
# Dibujar una hoja de helecho utilizando el juego del caos de Barnsley con 10000 puntos
fern = Fern()
fern.plot(1000)
In [6]:
# Dibujar una hoja de helecho utilizando el juego del caos de Barnsley con 60000 puntos
fern = Fern()
fern.plot(60000)

Con esto llegamos al final del artículo. La ida central de las ciencias que estudian la naturaleza es hacer de lo maravilloso un lugar común! Mostrar que la complejidad, vista correctamente, es sólo una máscara para lo simple!; y encontrar patrones escondidos en el aparente caos!

Saludos!

Este post fue escrito por Raúl e. López Briega utilizando Jupyter notebook. Pueden descargar este notebook o ver su version estática en nbviewer.

Este articulo fue escrito utilizando Jupyter notebook. Presionar aquí para la versión interactiva: Binder badge

Comments