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...
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...
Command: lrnz2
a? [5] Invio
b? [15] Invio
c? [1] Invio
steps? [10000] Invio
clicca un punto nel disegno...
Command: lrnz2
a? [5] Invio
b? [15] Invio
c? [1] 3.5
steps? [10000] Invio
clicca un punto nel disegno...
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...
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 24 Aprile 2005
|