sábado, 3 de marzo de 2012

Atractor de Lorenz en 101bytes

El atractor de Lorenz es uno de los ejemplos más conocidos en la teoría del caos. Para los que no tengan muy claro de que va esto de la teoría del caos, como resumen muy somero se puede decir esta teoría trata de estudiar sistema deterministas (es decir, no aleatorios) que son extremadamente sensibles a las condiciones iniciales. Pequeñas variaciones en las condiciones iniciales (si hablamos de un sistema físico podrían ser posición, temperatura, velocidad, presión o cualquier otra variable relevante del modelo) implica grandes diferencias en el comportamiento observado, dificultando enormemente la predicción a largo plazo (como pasa al intentar predecir el tiempo dentro de un mes).

Volviendo al atractor de Lorenz, este fué estudiado por  Ed N. Lorenz, un meteorólogo al que le debe el nombre, alrededor de 1963. Este sistema deriva de un modelo simplificado de la convección de la atmósfera. También emerge de manera natural a partir de modelos de láseres y dinamos.

El atractor tiene este aspecto:
Vemos que la figura tiene a orbitar alrededor de dos puntos, dibujando una especie de ocho retorcido.

El atractor se expresa de manera habitual como tres ecuaciones diferenciales no lineales acopladas.

$$\frac{dx}{dt} = a (y - x) \\ \frac{dy}{dt} = x (b - z) - y \\ \frac{dz}{dt} = x y - c z $$
El comportamiento está parametrizado por las tres constantes de las ecuaciones  "a", "b" y "c". Un conjunto habitual de valores suele ser:
$$ a = 10 \\ b = 28 \\  c = 8 / 3 $$
Otro conjunto también bastante habitual es:
 $$ a = 28 \\ b = 46.92 \\ c = 4 $$

El parámetro "a"es conocido como el número de Prandtl y "b" como el número de Rayleigh.

La serie no llega nunca a un estado estable, sino que es un ejemplo de caos determinista, siempre cambiante. Al igual que ocurre en otros sistemas caóticos, el sistema de Lorenz es muy sensible a las condiciones iniciales. Dados dos estados iniciales, no importa lo cercan que estén uno del otro, antes o después acabarán divergiendo.

Encontré una solución para implementar el atractor de Lorenz con solo 101 bytes. Lógicamente, el sitio para encontrar algo así es 140byt.es, un portal donde se publican snippets de código javascript que quepan en un twit, o sea, de 140 o menos bytes. Aquí tenéis el código:


El mérito del código es de Martin Kleppe (@aemkei). En GitHub podéis ver muchos otros snippets curiosos de menos de 140 bytes (https://github.com/aemkei).

Aquí tenéis una versión del código anotado, que sin duda es algo más inteligible :) :



Aquí tenéis un fiddle en el que ver el atractor en acción. Se ha usado una visualización en 2D dibujando la coordenada Z como el tamaño de cada punto. VER JSFIDDLE CON EJEMPLO





En este otro ejemplo podeis ver dos atractores, en los que se ha modificado ligeramente una de las condiciones iniciales. Al principio, los dos atractores (azul y verde) evolucionan de manera parecida, pero llegado un punto, los comportamientos son totalmente diferentes. VER EJEMPLO DE LOS DOS ATRACTORES




UPDATE(06/03/2012): Actualizados los enlaces a los jsfiddle que estaban un poco bailados.

No hay comentarios:

Publicar un comentario