Atraktor Lorentza 3D
Rezultat
Checkboxem możemy pauzować proces rysowania lub go znów przywołać. Przy pomocy suwaków możemy zmieniać wartości zmiennych a,b,c oraz d, które występują we wzorze. Po ich zmianie natychmiast będzie widoczna zmiana wykresu atraktora. Ponizej podam przykładowe wartości zmiennych.
Atraktor Lorenza najlepiej wyglada, gdy zmienna d=0.001 i:
- a=10 b=28 c=8/3 d=0.001
- a=10 b=28 c=8/3, d=0.01
- a=15 b=10, c=8/3, d=0.001
- a=28 b=46.92 c=4 d=0.01
Wyrażony jest takim układem równań:
- dx/dt=-a*x+a*y
- dy/dt=b*x-y-z*x
- dz/dt=-c*z+x*y
- xn+1=xn+d*a*(yn-xn)
- yn+1=yn+d*(xn(b-zn)-yn)
- zn+1=zn+d*(xn*yn-c*zn)
Punktem początkowym u mnie jest punkt W(1,0,0). Atraktor powstaje poprzez wielokrotne narysowanie punktu:
W(x+d*a*(y-x), y+d*(x*(b-z)-y), z+d*(x*y-c*z))
Kod procedury rysującej atraktor Lorenza, w najprostszej postaci:
pkt3d P(pkt3d p) { double xp,yp,zp; xp=p.x; yp=p.y; zp=p.z; p.x= xp + d*a*(yp - xp); p.y= yp + d*(xp*(b - zp) - yp); p.z= zp + d*(xp*yp - c*zp); return(p); } void rysuj(Graphics g) { pkt3d w=new pkt3d(1,0,0); for(int i=0;i<20;i++) { w=P(w); _3d.punkt(g,w); } }
Na początku, gdy rysujemy ten atraktor występuje duże przybliżenie. W celu oddalenia obrazu zastosowałem proste rozwiązanie, które przedstawiłem w kodzie poniżej:
void rysuj(Graphics g) { pkt3d w=new pkt3d(1,0,0); pkt3d k=new pkt3d(0,0,0); for(int i=0;i<20;i++) { w=P(w); k.war(w.x/3,w.y/3,w.z/3); _3d.punkt(g,k); } }