GOPTIONS lfactor=10 hsize=6 in vsize=6 in horigin=1 in vorigin=2 in;
options nocenter;
TITLE1 f=swissb h=1.6 c=black 'The Lorenz 3D Chaos Model';

* Copyright (c) 2006 Courtney Brown. All rights reserved.;
* May be used freely for noncommercial purposes.;

PROC IML;

b=2.66666666;w=28.0; s=10.0;pi=3.14159;cycles=10;
x1=5.0;x2=5.0;x3=5.0;zing=0;
h=0.01;

start;
goto buildit;

RK4:
* Fourth Order Runge-Kutta;
* You can change iterations to 1024;

do kkk=1 to 2024;

x=uniform(zing);
y=sin((kkk/2024)#(cycles#2#pi));

m1=x1;m2=x2;m3=x3;
LINK EQS;
x1K1=Dx1DT;x2K1=Dx2DT;x3K1=Dx3DT;
m1=x1+(.5#h#x1K1);m2=x2+(.5#h#x2K1);m3=x3+(.5#h#x3K1);
LINK EQS;
x1K2=Dx1DT;x2K2=Dx2DT;x3K2=Dx3DT;
m1=x1+(.5#h#x1K2);m2=x2+(.5#h#x2K2);m3=x3+(.5#h#x3K2);
LINK EQS;
x1K3=Dx1DT;x2K3=Dx2DT;x3K3=Dx3DT;
m1=x1 + h#x1K3;m2=x2 + h#x2K3;m3=x3 + h#x3K3;
LINK EQS;
x1K4=Dx1DT;x2K4=Dx2DT;x3K4=Dx3DT;

x1NEW=x1+((h/6)#(x1K1+(2#x1K2)+(2#x1K3)+x1K4));
x2NEW=x2+((h/6)#(x2K1+(2#x2K2)+(2#x2K3)+x2K4));
x3NEW=x3+((h/6)#(x3K1+(2#x3K2)+(2#x3K3)+x3K4));

x1E=x1E//x1;x2E=x2E//x2;x3E=x3E//x3;xe=xe//x;ye=ye//y;
trajects=x1E||(x2E||(x3E||(xe||ye)));
x1=x1NEW;x2=x2NEW;x3=x3NEW;
end;
RETURN;

EQS:
Dx1DT = s#(m2 - m1);
Dx2DT = (w#m1) - m2 - (m1#m3);
Dx3DT = (m1#m2) - (b#m3);
RETURN;

BUILDIT:
LINK RK4;

x1max=max(x1E);x1min=min(x1E);
x2max=max(x2E);x2min=min(x2E);
x3max=max(x3E);x3min=min(x3E);
xmax=max(xe);xmin=min(xe);
ymax=max(ye);ymin=min(ye);
origin=x1min||(x2min||(x3min||(xmin||ymin)));
x1next=x1max||(x2min||(x3min||(xmin||ymin)));
x2next=x1min||(x2max||(x3min||(xmin||ymin)));
x3next=x1min||(x2min||(x3max||(xmin||ymin)));
final={99}||({99}||({99}||({99}||{99})));
axes=origin//(x1next//(origin//(x2next//(origin//(x3next//final)))));
trajects=axes//trajects;

*print trajects;
party={'X1' 'X2' 'X3' 'RANDOM' 'SINE'};
create traject from trajects (|colname=party|);
append from trajects;
close traject;

*print x1e x2e x3e;

*print trajects;

finish;run;

data traject;set traject;
perspect=1;pi=constant('PI');angle=2*pi/3;
if ((x3=99) and (x1=99)) then x1=.;
* 3-D projections into 2-D ... Two Versions;
* Version 1;
x1D3 = x1 - (perspect*x3);
x2D3 = x2 - (perspect*x3);
* Version 2;
x1D3 = x1 - ((cos(angle))*x3);
x2D3 = x2 - ((sin(angle))*x3);

sym=1;
*IF (T LT 250) THEN DELETE;

label x1D3 ='X1';
label x2D3 ='X2';
label X3 ='X3';

symbol1 color=black v=none f=simplex i=join;
symbol2 color=black f=simplex v='*';
symbol3 color=black f=simplex v='.';
symbol4 color=black f=simplex v='.';
symbol5 color=black f=simplex v='.';
proc gplot data=traject;
plot x2D3*x1D3=sym / nolegend skipmiss
noaxes;

data traject;set traject(firstobs=8);

proc spectra p s out=b(obs=2024) adjmean whitetest;
var x1 x2 x3 Random Sine;
weights 0 1 0;
data b;set b;
freq=freq/(2*3.14159);
label freq='Frequency in cycles per observation';


TITLE1 f=swissb h=1.6 c=black 'Fourier Analysis';
proc gplot data=b;
axis3 color=black
value=(h=1.5 f=swissb c=black)
label=(a=90 r=0 h=2 f=swissb c=black);
axis4 color=black
value=(h=1.5 f=swissb c=black)
label=(h=2 f=swissb c=black);
plot (p_01 p_02 p_03 p_04 p_05)*(freq)/vaxis=axis3 haxis=axis4
vminor=0 hminor=0;


proc print data=b;
var p_01 p_02 p_03 p_04 p_05 freq period;

run;
quit;

This entire site is Copyright © 1997-2024 by Courtney Brown. All Rights Reserved.
DISCLAIMER
URL: https://courtneybrown.com