El atractor de Lorenz,
concepto introducido por Edward Lorenz en 1963, es un sistema dinámico
determinístico tridimensional no lineal derivado de las ecuaciones
simplificadas de rollos de convección que se producen en las ecuaciones dinámicas
de la atmósfera terrestre.
Para ciertos valores
de los parámetros a, b, c
el sistema exhibe un comportamiento caótico y muestra lo que actualmente se
llama un atractor extraño; esto fue probado por W. Tucker en 2001. El atractor
extraño en este caso es un fractal de dimensión de Hausdorff entre 2 y 3.
Grassberger (1983) ha estimado la dimensión de Hausdorff en 2.06 ± 0.01 y la
dimensión de correlación en 2.05 ± 0.01. El sistema aparece en láseres, en
generadores eléctricos y en determinadas ruedas de agua.
Las ecuaciones que
gobiernan el oscilador de Lorenz son:
Donde a se conoce como Número de
Prandtl y b como Número de Rayleigh. Tanto a como b y c > 0, pero
usualmente a = 10, c = 8 / 3 y b varía. El sistema exhibe un comportamiento caótico para b = 28 pero muestra órbitas periódicas para otros valores de b; por ejemplo,
con b = 99.96 se convierte en un nudo tórico llamado T(3,2). La forma de mariposa de la curva proyectada sobre el
plano XY puede haber inspirado el nombre del efecto mariposa en la Teoría del Caos.
 |
 |
 |
 |
Figura 1: Proyecciones del Atractor de Lorenz calculado para 1000 puntos con b=28. |
 |
 |
 |
a=10, b=8/3, c=14 |
a=10, b=8/3, c=13 |
a=10, b=8/3, c=15 |
Figura 2. Resultados obtenidos para otros valores de c. |
Problema:
Se redactará un programa AutoLISP capaz de plotear la curva generada a partir de las fórmulas indicadas en el párrafo anterior, considerando constantes los siguientes valores:
- dt = 0,01
- a = 10 (Número de Prandtl)
- c = 8/3
Cálculo de Puntos:
Programar una función de nombre calc-pts que determine las coordenadas x,y,z de los puntos que pertenecen al atractor de Lorenz. Para el cálculo se tomará como origen el punto (0, -2, -1).
La función recibirá los siguientes argumentos:
- num = Número total de puntos a calcular para la curva.
- b = Valor del Número de Raleigh.
Devolverá una lista de las coordenadas de todos los puntos calculados.
La función operará de la siguiente manera:
- Asignará valores a las variables que representan las constantes de Lorenz dt, a, c.
- A las que representan las coordenadas del punto origen xØ, yØ, zØ.
- Inicializará el contador i que se utilizará para el control de las iteraciones y la lista lpt que inicialmente contendrá el punto origen (xØ, yØ, zØ)
- Iniciará un ciclo de iteraciones donde para cada una:
- Calculará el valor de dx, dy y dz según [1], [2] y[3].
- Incrementará las coordenadas sumándoles dx, dy y dz para el nuevo punto que añadirá a la lista lpt.
- Actualizará xØ, yØ, zØ con los nuevos valores de x, y, z, e incrementará el contador i.
- Para cada iteración escribirá un mensaje en la línea de comando indicando el punto procesado y el total de puntos, por ejemplo:
“Calculando punto 45 de un total de 1000”
(defun calc-pts (num b / dt a c x0 y0 z0 n dx x1 dy y1 dz z1 nuevopto lpt)
(setq dt 0.01 ; constantes de lorenz
a 10
c (/ 8.0 3.0)
x0 0 ; valor inicial de x
y0 -2 ;valor inicial de y
z0 -1 ;valor inicial de z
i 1 ; control de iteraciones
lpt (cons (list x0 y0 z0) lpt))
(while (<= i num)
(setq dx (* dt (* a (- y0 x0)))
x1 (+ x0 dx)
dy (* dt (- (* x0 (- b z0)) y0))
y1 (+ y0 dy)
dz (* dt (- (* x0 y0) (* c z0)))
z1 (+ z0 dz)
i (+ i 1)
nuevopto (list x1 y1 z1)
lpt (cons nuevopto lpt)
x0 x1 ; solution is next seed
y0 y1
z0 z1)
(prompt "\n")
(prompt (strcat "Calculando punto "
(itoa i)
" de un total de "
(itoa num))) ; status
)
(reverse lpt))
Ajuste de Vista
Programar una función de nombre ajuste-vista que reciba como argumento una lista de puntos y calcule a partir de ella las coordenadas de las esquina inferior izquierda y la esquina superior derecha (en el plano XY) de la caja de abarque que incluya todos los puntos. A partir de esos datos la función ejecutará un ZOOM VENTANA para ajustar la visualización e manera que todos los puntos aparezcan en pantalla.
(defun ajuste-vista (puntos / xmin xmax ymin ymax)
(setq xmin (apply 'min (mapcar 'car puntos))
xmax (apply 'max (mapcar 'car puntos))
ymin (apply 'min (mapcar 'cadr puntos))
ymax (apply 'max (mapcar 'cadr puntos))
eii (list xmin ymin)
esd (list xmax ymax))
(command "zoom" "_w" eii esd))
Dibujo de la Curva 3D
Programar una función que dibuje la curva a partir de la lista de puntos calculada empleando una polilínea 3d.
(defun dib_3dpol (lispt /)
(command "_3DPOLY")
(foreach pt lispt (command pt))
(command ""))
Crear el Nuevo Comando AutoCAD para dibujar el Atractor de Lorenz.
Programar la función LORENZ como nuevo comando AutoCAD que solicite al usuario la cantidda de puntos a calcular y el valor del número de Rayleigh. En ambos casos se propondrán valores predeterminados, 1000 para el número de puntos y 28 para el Número de Rayleigh, que se aceptarán pulsando Intro.
(defun c:lorenz (/ num b o_mode atractor)
(prompt "\nAtractor de Lorenz") ;mensaje
(if (not
(setq num (getint "\nNúmero de puntos a calcular <1000>: ")))
(setq num 1000))
(if (not
(setq b (getreal "\nValor del número de Rayleigh <28>: ")))
(setq b 28))
(setq o_mode (getvar "osmode")) ;guardar valor de refent
(setvar "osmode" 0)
;; variables globales iniciales
(setq atractor (calc-pts num b))
(ajuste-vista atractor)
(dib_3dpol atractor)
(setvar "osmode" o_mode) ;restaurar el valor de osmode
)
Ejercicio de examen propuesto en el curso 2008-2009. Este ejercicio está basado en el código originalmente propuesto por Bo Nielsen (skinnyfish.net).