Atractor de Lorenz.

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:

  1. Asignará valores a las variables que representan las constantes de Lorenz dt, a, c.
  2. A las que representan las coordenadas del punto origen xØ, yØ, zØ.
  3. 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Ø)
  4. Iniciará un ciclo de iteraciones donde para cada una:
    1. Calculará el valor de dx, dy y dz según [1], [2] y[3].
    2. Incrementará las coordenadas sumándoles dx, dy y dz para el nuevo punto que añadirá a la lista lpt.
    3. Actualizará xØ, yØ, zØ con los nuevos valores de x, y, z, e incrementará el contador i.
  5. 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).
ċ
lorenzAttractor.lsp
(3k)
Reinaldo Togores Fernández,
Feb 16, 2011, 3:14 AM
Comments