wannete 发表于 2009-7-23 19:42

最大Lyapunov指数计算问题请教!

%计算Duffing振子的lyapunov指数
clear all;
clc;
global X V
yinit=;
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=;
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
    =ode45('twofun',Tspan,IC,options);
    %取积分得到的最后一个时刻的值
    =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));
      =size(xData);
         =size(yData);
         
         xData=;
         yData=;
    end
    ic=X(rX,1:L);
    T1=T1+Iteration;
    T2=T2+Iteration;
    Tspan=;
   
    IC=;
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=;
大家有谁懂的,分析一下这个程序 啊,也是出自本论坛,转载一下!自己用了一下,不是很明白!
需要计算一段时间内的最大指数,最后只得两个值!

[ 本帖最后由 wannete 于 2009-7-23 19:44 编辑 ]

octopussheng 发表于 2009-7-24 09:06

先弄清一个概念,所需要求解的LE,就是计算时间终了时刻的LE,根据你这个程序,最后得到的两个值就是所要的结果。

这个程序就是GSR(GS正交化)方法求解的程序。相关理论课参考Wolf的那篇文章。

wannete 发表于 2009-7-24 18:17

回复 沙发 octopussheng 的帖子

如果要改成计算一段时间的指数,比如就是Iteration时间内的最大指数,怎么改改啊,这样计算太慢了!

octopussheng 发表于 2009-7-27 07:58

这个程序就是计算一段时间的LE的。

如果只要最大LE的话,可以根据最大LE的定义,编个简单程序即可求解。

xw263 发表于 2009-7-27 22:18

我的看法,请指教

图像上得到是两条曲线,也就是两个LE指数随积分时间变化的曲线.但并不意味着只有两个LE值.
实际上程序运行得到的LE指数是一个k*3的矩阵.而矩阵最后一行的三个数就是你所要的三个最终的LE指数.

程序运行完后,只要在命令窗口输入:yData 再按回车就可以得到了.如果想得到最大LE指数.只要输入
Lambda(1),即可.
程序时间应该并不长吧,大概1分半钟.

偶认为 plot(xData,yData(:,1),xData,yData(:,2))应改为:plot(xData,yData(:,1),xData,yData(:,2),xData,yData(:,3))
这样才完整一些.画出的是三条曲线.

xw263 发表于 2009-7-27 22:28

关于运行时间

如果想缩短运行时间,恐怕只能减少循环次数了.也就是减小wholetimes的值.

但是注意也不能太小的,因为总要除去程序所产生暂态数据点.比如这个程序中就要除去前面的200次循环.

另外,octopussheng总结的一篇贴子中,改进了这个程序,去掉了一些不必要的语句和循环,可能运行时间会短些.
你搜下,试试吧.

水平有限,还望多多指教.

octopussheng 发表于 2009-7-28 15:22

说的还是很有道理的,呵呵。希望楼主能有所收获。

wannete 发表于 2009-8-6 16:58

谢谢大家的指教!非常感谢!
页: [1]
查看完整版本: 最大Lyapunov指数计算问题请教!