cg-Cad

Lisp »Tips 'n Tricks »Frattali »1 »2 »3 »4 »5 »6 »7

Attrattore strano di Lorenz

;|

   LRNZ.LSP (C) 2005 by Claudio Piccini.
   www.cg-cad.com

   Attrattore strano di Lorenz (1961)
   dx/dt=-ax+ay
   dy/dt=b*x-y-z*x
   dz/dt=-cz+xy

|;

(defun lorenz ( / steps ; numero dei punti disegnati
                  a b c ; costanti
                  dt x y z xx yy zz
                  i p0 

 )

 (setq x  1 
       y  1 
       z  1 
       dt 0.02 ; step temporale
 )

 (setq a (getreal "\n a? [5] "))
 (if (= a nil)(setq a 5))

 (setq b (getreal "\n b? [15] "))
 (if (= b nil)(setq b 15))

 (setq c (getreal "\n c? [1] "))
 (if (= c nil)(setq c 1))

 (setq steps (getint "\n steps? [10000] "))
 (if (= steps nil)(setq steps 10000))

 (setq p0 (getpoint "\ clicca un punto nel disegno..."))

 (setq i 0)
 (while (<= i steps)
  (setq xx (+ (- x (* a x dt))(* a y dt)))
  (setq yy (- (+ y (* b x dt))(* y dt)(* z x dt)))
  (setq zz (+ (- z (* c z dt))(* x y dt)))
  (command "_point" (list (+ xx (car p0))(+ yy (cadr p0)) zz))
  (setq x xx)
  (setq y yy)
  (setq z zz)
  (setq i (1+ i))
 )
)

(defun c:lrnz ( / snapp )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (lorenz)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del lisp

Command: lrnz
a? [5] Invio
b? [15] Invio
c? [1] Invio
steps? [10000] Invio
clicca un punto nel disegno...

LRNZ.LSP

LRNZ2

Disegna 2 attrattori strani di Lorenz per simulare l'effetto farfalla.
Le costanti a b c sono identiche nei due modelli, mentre le variabili sono nel primo x1 y1 z1=1.0000000 e nel secondo x2 y2 z2=1.0000001.
Minimi errori numerici introdotti ad ogni iterazione impediscono alle orbite dei due modelli di sovrapporsi esattamente e di conseguenza ai punti blu di coprire tutti i punti rossi nel disegno (è l'effetto farfalla di E. Lorenz, cioè la dipendenza critica dalle condizioni iniziali, ingrediente essenziale di un sistema caotico come ad esempio il tempo atmosferico).

;|

   LRNZ2.LSP (C) 2005 by Claudio Piccini.
   www.cg-cad.com

   Disegna 2 attrattori strani di Lorenz
   per simulare l'effetto farfalla

|;

(defun lorenz2 ( / steps                ; punti disegnati
                   a b c                ; costanti
                   dt                   ; step temporale
                   x1 y1 z1 xx1 yy1 zz1 ; 1 attrattore
                   x2 y2 z2 xx2 yy2 zz2 ; 2 attrattore
                   i p0 

 )

 (setq x1 1.0000000
       y1 1.0000000
       z1 1.0000000
       x2 1.0000001
       y2 1.0000001
       z2 1.0000001
       dt 0.02
 )

 (setq a (getreal "\n a? [5] "))
 (if (= a nil)(setq a 5))
 (setq b (getreal "\n b? [15] "))
 (if (= b nil)(setq b 15))
 (setq c (getreal "\n c? [1] "))
 (if (= c nil)(setq c 1))
 (setq steps (getint "\n steps? [10000] "))
 (if (= steps nil)(setq steps 10000))
 (setq p0 (getpoint "\ clicca un punto nel disegno..."))

 (setq i 0)
 (while (<= i steps)
  ;|
     disegna i punti del primo attrattore
     in rosso
  |;
  (command "_color" 1)
  (setq xx1 (+ (- x1 (* a x1 dt))(* a y1 dt)))
  (setq yy1 (- (+ y1 (* b x1 dt))(* y1 dt)(* z1 x1 dt)))
  (setq zz1 (+ (- z1 (* c z1 dt))(* x1 y1 dt)))
  (command "_point" (list (+ xx1 (car p0))(+ yy1 (cadr p0)) zz1))
  (setq x1 xx1)
  (setq y1 yy1)
  (setq z1 zz1)
  ;|
     disegna i punti del secondo attrattore
     in blu
  |;
  (command "_color" 5)
  (setq xx2 (+ (- x2 (* a x2 dt))(* a y2 dt)))
  (setq yy2 (- (+ y2 (* b x2 dt))(* y2 dt)(* z2 x2 dt)))
  (setq zz2 (+ (- z2 (* c z2 dt))(* x2 y2 dt)))
  (command "_point" (list (+ xx2 (car p0))(+ yy2 (cadr p0)) zz2))
  (setq x2 xx2)
  (setq y2 yy2)
  (setq z2 zz2)
  (setq i (1+ i))
 )
)

(defun c:lrnz2 ( / snapp )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (lorenz2)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cecolor" "BYLAYER")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del lisp

Command: lrnz2
a? [5] Invio
b? [15] Invio
c? [1] Invio
steps? [10000] 1000
clicca un punto nel disegno...

LRNZ2.LSP

Command: lrnz2
a? [5] Invio
b? [15] Invio
c? [1] Invio
steps? [10000] Invio
clicca un punto nel disegno...

LRNZ2.LSP

Command: lrnz2
a? [5] Invio
b? [15] Invio
c? [1] 3.5
steps? [10000] Invio
clicca un punto nel disegno...

LRNZ2.LSP

L'effetto farfalla dipende anche dal valore dato alle costanti a b c.
Un esempio negativo:

Command: lrnz2
a? [5] 3.5
b? [15] 10
c? [1] 3
steps? [10000] 30000
clicca un punto nel disegno...

LRNZ2.LSP

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 24 Aprile 2005