Новичок
Джуниор
Регистрация: 04.04.2016
Сообщений: 1
|
отследить разбегание
Помогите пожалуйста. я написала прогу. она считает ляпуновские показатели. она все считает. но когда я меняю параметры а и r значения сразу разбегаются. мне нужно отследить эти разбегания. Разбегается от того что x,y,z становятся очень большими. Дальше прямо в программе поясню.
Код:
procedure TForm1.btn1Click(Sender: TObject);
var amin, rmin,a8,r8,a,r,amax,rmax,b,x,y,z,E,x1,xx1,yx1,zx1,y1,z1,xx,yx,zx,zz,xy,yy,zy,s,s1,s2,u,u1,u2,xx0,yx0,zx0,q,m,p,xy1,yy1,zy1,xy0,zy0,w,w1,w2,yy0,yz0,xz0,zz0,xz1,yz1,zz1,xz,yz:extended;
i,n:integer;
procedure otobr (var x,y,z: extended);
var x1,y1,z1:Extended;
begin
x1:=x-E*(y+z);
y1:=y+E*(x+a*y);
z1:=z+E*(b+z*(x-r));
x:=x1;
y:=y1;
z:=z1;
end;
procedure variat (var xx,yx,zx:extended);
var a,r:extended;
begin
xx1:=xx-E*(yx+zx);
yx1:=yx+E*(xx+a*yx);
zx1:=zx+E*(xx*z+(x-r)*zx);
xx:=xx1;
yx:=yx1;
zx:=zx1;
end;
begin
E:=0.1;
b:=0.1;
a:=-0.5;
r:=-1;
n:=10000;
x:=0;
y:=0;
z:=0;
xx:=1;
yx:=0;
zx:=0;
xy:=0;
yy:=0;
zy:=1;
s:=0;
s1:=0;
s2:=0;
amax:=0.5;
rmax:=10;
xx0:=0;
yx0:=0;
zx0:=0;
xy0:=0;
yy0:=0;
zy0:=0;
xz0:=0;
zz0:=0;
yz0:=0;
xy1:=0;
yy1:=0;
zy1:=0;
xz1:=0;
yz1:=0;
zz1:=0;
Series1.Clear;
for i:=1 to n do begin
otobr (x,y,z) ;
variat (xx,yx,zx);
variat (xy,yy,zy);
// variat (xz,yz,zz);
m:=sqrt(xx*xx+yx*yx+zx*zx);
xx0:=xx/m;
yx0:=yx/m;
zx0:=zx/m;
xy1:=xy-(xy*xx0+yy*yx0+zy*zx0)*xx0;
yy1:=yy-(xy*xx0+yy*yx0+zy*zx0)*yx0;
zy1:=zy-(xy*xx0+yy*yx0+zy*zx0)*zx0;
q:=Sqrt(xy1*xy1+yy1*yy1+zy1*zy1);
xy0:=xy1/q;
yy0:=yy1/q;
zy0:=zy1/q;
//xz1:=xz-(xz*xx0+yz*yx0+zz*zx0)*xx0-(xz*xy0+yz*yy0+zz*zy0)*xy0;
// yz1:=yz-(xz*xx0+yz*yx0+zz*zx0)*yx0-(xz*xy0+yz*yy0+zz*zy0)*yy0;
// zz1:=zz-(xz*xx0+yz*yx0+zz*zx0)*zx0-(xz*xy0+yz*yy0+zz*zy0)*zy0;
// p:=sqrt(xz1*xz1+yz1*yz1+zz1*zz1);
// xz0:=xz1/p;
// yz0:=yz1/p;
// zz0:=zz1/p;
w:=ln(m);
w1:=ln(q);
// w2:=ln(p);
{if ((w<0.00000001) and (w1<0.00000001)) then
// memo1.Lines.Add('ïîêàçàòåëü îòðèöàòåëüíûé')
else }
//begin
s:=s+w;
s1:=s1+w1;
// s2:=s2+w2;
xx:=xx0;
yx:=yx0;
zx:=zx0;
xy:=xy0;
yy:=yy0;
zy:=zy0;
// xz:=xz0;
// yz:=yz0;
// zz:=zz0;
end;
begin
u:=s/n;
u1:=s1/n;
// u2:=s2/n;
end;
if i>00 then
begin
mmo1.Lines.Add('u='+floattostr(u));
memo1.Lines.Add('u1='+floattostr(u1));
// memo2.Lines.Add('u2='+floattostr(u2));
end;
for i:=1 to 100 do begin
Series1.Addxy(x,y);
otobr (x,y,z) ;
end;
a:=amin;
while a<amax do
begin
r:=rmin;
while r<rmax do
begin
r8:=r+0.1;
r:=r8;
for i:=1 to 10000 do
begin
if ((x>100) and (y>100) and (z>100)) then { вот здесь мне нужно написать так, чтобы программа не вылетала, а брала другие значения x,y,z}
Series6.Addxy(a,r)
else
otobr (x,y,z) ;
variat (xx,yx,zx);
variat (xy,yy,zy);
if ((u<0) and (u1<0)) then // периодичность
Series3.Addxy(a,r);
if ((abs(u)<e) and (u1<0)) then //квазипериодичность
Series4.Addxy(a,r);
if ((u>0) and (u1<0)) then //хаос
Series5.Addxy(a,r);
end;
end;
a8:=a+0.1;
a:=a8;
end;
end;
end.
пожалуйста, дайте совет, как это можно реализовать
Последний раз редактировалось Аватар; 04.04.2016 в 16:43.
|