1【总结】Lyapunov指数的计算方法非线性理论近期为了把计算LE的一些问题弄清楚,看了有7~9本书!下面以吕金虎《混沌时间序列分析及其应用》、马军海《复杂非线性系统的重构技术》为主线,把目前已有的LE计算方法做一个汇总!1.关于连续系统Lyapunov指数的计算方法连续系统LE的计算方法主要有定义方法、Jacobian方法、QR分解方法、奇异值分解方法,或者通过求解系统的微分方程,得到微分方程解的时间序列,然后利用时间序列(即离散系统)的LE求解方法来计算得到。关于连续系统LE的计算,主要以定义方法、Jacobian方法做主要介绍内容。(1)定义法2定义法求解Lyapunov指数.JPG关于定义法求解的程序,和matlab板块的“连续系统LE求解程序”差不多。以Rossler系统为例Rossler系统微分方程定义程序functiondX=Rossler_ly(t,X)%Rossler吸引子,用来计算Lyapunov指数%a=0.15,b=0.20,c=10.0%dx/dt=-y-z,%dy/dt=x+ay,%dz/dt=b+z(x-c),a=0.15;b=0.20;c=10.0;x=X(1);y=X(2);z=X(3);%Y的三个列向量为相互正交的单位向量Y=[X(4),X(7),X(10);X(5),X(8),X(11);X(6),X(9),X(12)];%输出向量的初始化,必不可少dX=zeros(12,1);%Rossler吸引子dX(1)=-y-z;dX(2)=x+a*y;dX(3)=b+z*(x-c);%Rossler吸引子的Jacobi矩阵Jaco=[0-1-1;1a0;z0x-c];3dX(4:12)=Jaco*Y;求解LE代码:%计算Rossler吸引子的Lyapunov指数clear;yinit=[1,1,1];orthmatrix=[100;010;001];a=0.15;b=0.20;c=10.0;y=zeros(12,1);%初始化输入y(1:3)=yinit;y(4:12)=orthmatrix;tstart=0;%时间初始值tstep=1e-3;%时间步长wholetimes=1e5;%总的循环次数steps=10;%每次演化的步数iteratetimes=wholetimes/steps;%演化的次数mod=zeros(3,1);lp=zeros(3,1);%初始化三个Lyapunov指数Lyapunov1=zeros(iteratetimes,1);Lyapunov2=zeros(iteratetimes,1);Lyapunov3=zeros(iteratetimes,1);fori=1:iteratetimestspan=tstart:tstep:(tstart+tstep*steps);[T,Y]=ode45('Rossler_ly',tspan,y);%取积分得到的最后一个时刻的值y=Y(size(Y,1),:);%重新定义起始时刻tstart=tstart+tstep*steps;y0=[y(4)y(7)y(10);y(5)y(8)y(11);y(6)y(9)y(12)];%正交化y0=ThreeGS(y0);%取三个向量的模mod(1)=sqrt(y0(:,1)'*y0(:,1));mod(2)=sqrt(y0(:,2)'*y0(:,2));mod(3)=sqrt(y0(:,3)'*y0(:,3));y0(:,1)=y0(:,1)/mod(1);y0(:,2)=y0(:,2)/mod(2);4y0(:,3)=y0(:,3)/mod(3);lp=lp+log(abs(mod));%三个Lyapunov指数Lyapunov1(i)=lp(1)/(tstart);Lyapunov2(i)=lp(2)/(tstart);Lyapunov3(i)=lp(3)/(tstart);y(4:12)=y0';end%作Lyapunov指数谱图i=1:iteratetimes;plot(i,Lyapunov1,i,Lyapunov2,i,Lyapunov3)程序中用到的ThreeGS程序如下:%G-S正交化functionA=ThreeGS(V)%V为3*3向量v1=V(:,1);v2=V(:,2);v3=V(:,3);a1=zeros(3,1);a2=zeros(3,1);a3=zeros(3,1);a1=v1;a2=v2-((a1'*v2)/(a1'*a1))*a1;a3=v3-((a1'*v3)/(a1'*a1))*a1-((a2'*v3)/(a2'*a2))*a2;A=[a1,a2,a3];计算得到的Rossler系统的LE为————0.0632310.092635-9.8924Wolf文章中计算得到的Rossler系统的LE为————0.090-9.77需要注意的是——定义法求解的精度有限,对有些系统的计算往往出现计果和理论值有偏差的现象。正交化程序可以根据上面的扩展到N*N向量,这里就不加以说明了,对matlab用户来说应该还是比较简单的!(2)Jacobian方法通过资料检索,发现论坛中用的较多的LET工具箱的算法原理就是Jacobian方法。基本原理就是首先求解出连续系统微分方程的近似解,然后对系统的Jacobian矩阵进行QR分解,计算Jacobian矩阵特征值的乘积,最后计算出LE和分数维。经过计算也证明了这种方法精度较高,对目前常见的混沌系统,如Lorenz、Henon、Duffing等的Lyapunov指数的计算精度都很高,而且程序编写有一定的规范,个人很推荐使用。(虽然我自己要做的系统并不适用)5LET工具箱可以在网络上找到,这里就不列出了!关于LET工具箱如果有问题,欢迎加入本帖讨论!Jacobian法求解Lyapunov指数.JPG对离散动力系统,或者说是非线性时间序列,往往不需要计算出所有的Lyapunov指数,通常只需计算出其最大的Lyapunov指数即可。“1983年,格里波基证明了只要最大Lyapunov指数大于零,就可以肯定混沌的存在”。目前常用的计算混沌序列最大Lyapunov指数的方法主要有一下几种:(1)由定义法延伸的Nicolis方法(2)Jacobian方法(3)Wolf方法(4)P-范数方法(5)小数据量方法其中以Wolf方法和小数据量方法应用最为广泛,也最为普遍。下面对Nicolis方法、Wolf方法以及小数据量方法作一一介绍。(1)Nicolis方法这种方法和连续系统的定义方法类似,而且目前应用很有限制,因此只对其理论进行介绍,编程应用方面就省略了Nicolis方法求最大LE.JPG(2)Wolf方法Wolf方法求最大LE.JPGWolf方法的Matlab程序如下:functionlambda_1=lyapunov_wolf(data,N,m,tau,P)%该函数用来计算时间序列的最大Lyapunov指数--Wolf方法%m:嵌入维数!一般选大于等于10%tau:时间延迟!一般选与周期相当,如我选2000%data:时间序列!可以选1000;%N:时间序列长度满足公式:M=N-(m-1)*tau=24000-(10-1)*1000=5000%P:时间序列的平均周期,选择演化相点距当前点的位置差,即若当前相点为I,则演化相点只能在|I-J|P的相点中搜寻!P=周期=600%lambda_1:返回最大lyapunov指数值min_point=1;%&&要求最少搜索到的点数MAX_CISHU=5;%&&最大增加搜索范围次数%FLYINGHAWK%求最大、最小和平均相点距离max_d=0;%最大相点距离min_d=1.0e+100;%最小相点距离6avg_dd=0;Y=reconstitution(data,N,m,tau);%相空间重构可将此段程序加到整个程序中,在时间循环内,可以保存时间序列的地方。见完整程序。M=N-(m-1)*tau;%重构相空间中相点的个数fori=1:(M-1)forj=i+1:Md=0;fork=1:md=d+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));endd=sqrt(d);ifmax_ddmax_d=d;endifmin_ddmin_d=d;endavg_dd=avg_dd+d;endendavg_d=2*avg_dd/(M*(M-1));%平均相点距离dlt_eps=(avg_d-min_d)*0.02;%若在min_eps~max_eps中找不到演化相点时,对max_eps的放宽幅度min_eps=min_d+dlt_eps/2;%演化相点与当前相点距离的最小限max_eps=min_d+2*dlt_eps;%&&演化相点与当前相点距离的最大限%从P+1~M-1个相点中找与第一个相点最近的相点位置(Loc_DK)及其最短距离DKDK=1.0e+100;%第i个相点到其最近距离点的距离Loc_DK=2;%第i个相点对应的最近距离点的下标fori=(P+1):(M-1)%限制短暂分离,从点P+1开始搜索d=0;fork=1:md=d+(Y(k,i)-Y(k,1))*(Y(k,i)-Y(k,1));endd=sqrt(d);if(dDK)&(dmin_eps)DK=d;Loc_DK=i;endend%以下计算各相点对应的李氏数保存到lmd()数组中7%i为相点序号,从1到(M-1),也是i-1点的演化点;Loc_DK为相点i-1对应最短距离的相点位置,DK为其对应的最短距离%Loc_DK+1为Loc_DK的演化点,DK1为i点到Loc_DK+1点的距离,称为演化距离%前i个log2(DK1/DK)的累计和用于求i点的lambda值sum_lmd=0;%存放前i个log2(DK1/DK)的累计和fori=2:(M-1)%计算演化距离DK1=0;fork=1:mDK1=DK1+(Y(k,i)-Y(k,Loc_DK+1))*(Y(k,i)-Y(k,Loc_DK+1));endDK1=sqrt(DK1);old_Loc_DK=Loc_DK;%保存原最近位置相点old_DK=DK;%计算前i个log2(DK1/DK)的累计和以及保存i点的李氏指数if(DK1~=0)&(DK~=0)sum_lmd=sum_lmd+log(DK1/DK)/log(2);endlmd(i-1)=sum_lmd/(i-1);此处可以保存不同相点i对应的李氏指数,见完整程序。。%以下寻找i点的最短距离:要求距离在指定距离范围内尽量短,与DK1的角度最小point_num=0;%&&在指定距离范围内找到的候选相点的个数cos_sita=0;%&&夹角余弦的比较初值——要求一定是锐角zjfwcs=0;%&&增加范围次数while(point_num==0)%*搜索相点forj=1:(M-1)ifabs(j-i)=(P-1)%&&候选点距当前点太近,跳过!continue;end%*计算候选点与当前点的距离dnew=0;fork=1:mdnew=dnew+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));enddnew=sqrt(dnew);if(dnewmin_eps)|(dnewmax_eps)%&&不在距离范围,跳过!continue;end%*计算夹角余弦及比较DOT=0;8fork=1:mDOT=DOT+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,old_Loc_DK+1));endCTH=DOT/(dnew*DK1);ifacos(CTH)(3.14151926/4)%&&不是小于45度的角,跳过!continue;endifCTHcos_sita%&&新夹角小于过去已找到的相点的夹角,保留cos_sita=CTH;Loc_DK=j;DK=dnew;endpoint_num=point_num+1;endifpoint_num=min_pointmax_eps=ma