|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
%计算Duffing振子的lyapunov指数
clear all;
clc;
global X V
yinit=[1,1];
orthmatrix=[1 0;
0 1];
y=zeros(6,1);
%初始化输入
IC(1:2)=yinit;
IC(3:6)=orthmatrix;
InitiaTime=0; %时间初始值
TimeStep=1e-2; %时间步长
wholetimes=100000; %总的循环次数
UpdateStepNum=10;%每次演化的步数
iteratetimes =wholetimes/UpdateStepNum; %演化的次数
DiscardItr=200;
Iteration=UpdateStepNum*TimeStep;
DiscardTime=DiscardItr*Iteration+InitiaTime;
T1=InitiaTime;
T2=T1+Iteration;
Tspan=[T1:TimeStep:T2];
options=odeset('RelTol',1e-5,'AbsTol',1e-6);
mod=zeros(1,2);
d=2;
Sum=zeros(1,d);
n=0;
k=0;
xData=[];
yData=[];
for i=1:iteratetimes
n=n+1
[t,X]=ode45('twofun',Tspan,IC,options);
%取积分得到的最后一个时刻的值
[rX,cX]=size(X);
L=cX-d*d;
for i=1:d
m1=L+1+(i-1)*d;
m2=m1+d-1;
A(:,i)=(X(rX,m1:m2))';
end
y0=TwoGS(A);
%取三个向量的模
mod(1)=sqrt(y0(:,1)'*y0(:,1));
mod(2)=sqrt(y0(:,2)'*y0(:,2));
y0(:,1)=y0(:,1)/mod(1);
y0(:,2)=y0(:,2)/mod(2);
if T2>DiscardTime
Q0=y0;
else
Q0=eye(d);
end
if (T2>DiscardTime)
k=k+1;
T=k*Iteration;
TT=n*Iteration+InitiaTime;
Sum=Sum+log(abs(mod));
lambda=Sum/T;
Lambda=fliplr(sort(lambda));
[rxD,cxD]=size(xData);
[ryD,cyD]=size(yData);
xData=[xData;TT];
yData=[yData;lambda];
end
ic=X(rX,1:L);
T1=T1+Iteration;
T2=T2+Iteration;
Tspan=[T1:TimeStep:T2];
IC=[ic(:);y0(:)];
end
plot(xData,yData(:,1),xData,yData(:,2))
function dX=twofun(t,X)
k=0.5;
B=2.804;
wd=500*2*pi;
x=X(1);
y=X(2);
Y=[X(3) X(5);
X(4) X(6)];
dX=zeros(6,1);
dX(1)=wd*y;
dX(2)=wd*(-k*y-x^3+B*cos(wd*t));
J=[ 0, wd*1;
wd*(-3*x^2), wd*(-k)];
dX(3:6)=J*Y;
function A=TwoGS(V) %V为3*3的向量
global a1 a2
v1=V(:,1);
v2=V(:,2);
a1=zeros(2,1);
a2=zeros(2,1);
a1=v1;
a2=v2-((a1'*v2)/(a1'*a1))*a1;
A=[a1,a2];
大家有谁懂的,分析一下这个程序 啊,也是出自本论坛,转载一下!自己用了一下,不是很明白!
需要计算一段时间内的最大指数,最后只得两个值!
[ 本帖最后由 wannete 于 2009-7-23 19:44 编辑 ] |
|