Lyapunov指数的计算方法.docx

上传人:b****6 文档编号:5884824 上传时间:2023-01-01 格式:DOCX 页数:15 大小:25.61KB
下载 相关 举报
Lyapunov指数的计算方法.docx_第1页
第1页 / 共15页
Lyapunov指数的计算方法.docx_第2页
第2页 / 共15页
Lyapunov指数的计算方法.docx_第3页
第3页 / 共15页
Lyapunov指数的计算方法.docx_第4页
第4页 / 共15页
Lyapunov指数的计算方法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Lyapunov指数的计算方法.docx

《Lyapunov指数的计算方法.docx》由会员分享,可在线阅读,更多相关《Lyapunov指数的计算方法.docx(15页珍藏版)》请在冰豆网上搜索。

Lyapunov指数的计算方法.docx

Lyapunov指数的计算方法

【总结】Lyapunov指数的计算方法非线性理论

近期为了把计算LE的一些问题弄清楚,看了有7~9本书!

下面以吕金虎《混沌时间序列分析及其应用》、马军海《复杂非线性系统的重构技术》为主线,把目前已有的LE计算方法做一个汇总!

1.关于连续系统Lyapunov指数的计算方法?

?

连续系统LE的计算方法主要有定义方法、Jacobian方法、QR分解方法、奇异值分解方法,或者通过求解系统的微分方程,得到微分方程解的时间序列,然后利用时间序列(即离散系统)的LE求解方法来计算得到。

关于连续系统LE的计算,主要以定义方法、Jacobian方法做主要介绍内容。

(1)定义法

定义法求解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;

?

?

?

?

?

?

1a?

?

0;

?

?

?

?

?

?

z0?

?

x-c];

dX(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:

iteratetimes

?

?

tspan=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);

?

?

y0(:

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.063231?

?

0.092635?

?

-9.8924

Wolf文章中计算得到的Rossler系统的LE为————0.09?

?

0?

?

-9.77

需要注意的是——定义法求解的精度有限,对有些系统的计算往往出现计果和理论值有偏差的现象。

正交化程序可以根据上面的扩展到N*N向量,这里就不加以说明了,对matlab用户来说应该还是比较简单的!

 

(2)Jacobian方法

通过资料检索,发现论坛中用的较多的LET工具箱的算法原理就是Jacobian方法。

基本原理就是首先求解出连续系统微分方程的近似解,然后对系统的Jacobian矩阵进行QR分解,计算Jacobian矩阵特征值的乘积,最后计算出LE和分数维。

经过计算也证明了这种方法精度较高,对目前常见的混沌系统,如Lorenz、Henon、Duffing等的Lyapunov指数的计算精度都很高,而且程序编写有一定的规范,个人很推荐使用。

(虽然我自己要做的系统并不适用

LET工具箱可以在网络上找到,这里就不列出了!

关于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.JPG

Wolf方法的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;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%最小相点距离

?

?

avg_dd=0;

?

?

Y=reconstitution(data,N,m,tau);?

?

?

?

?

?

?

%相空间重构可将此段程序加到

整个程序中,在时间循环内,可以保存时间序列的地方。

见完整程序。

?

?

M=N-(m-1)*tau;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%重构相空间中相点的个数

?

?

fori=1:

(M-1)

?

?

?

?

?

?

forj=i+1:

M

?

?

?

?

?

?

?

?

d=0;

?

?

?

?

?

?

?

?

fork=1:

m

?

?

?

?

?

?

?

?

?

?

d=d+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

d=sqrt(d);

?

?

?

?

?

?

?

?

ifmax_d

?

?

?

?

?

?

?

?

?

?

max_d=d;

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

ifmin_d>d

?

?

?

?

?

?

?

?

?

?

min_d=d;

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

avg_dd=avg_dd+d;

?

?

?

?

?

?

end

?

?

end

?

?

avg_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)及其最短距离DK

?

?

DK=1.0e+100;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%第i个相点到其最近距离点的距离

?

?

Loc_DK=2;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%第i个相点对应的最近距离点的下标

?

?

fori=(P+1):

(M-1)?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%限制短暂分离,从点P+1开始搜索

?

?

?

?

?

?

d=0;

?

?

?

?

?

?

fork=1:

m

?

?

?

?

?

?

?

?

d=d+(Y(k,i)-Y(k,1))*(Y(k,i)-Y(k,1));

?

?

?

?

?

?

end

?

?

?

?

?

?

d=sqrt(d);

?

?

?

?

?

?

if(dmin_eps)

?

?

?

?

?

?

?

?

DK=d;

?

?

?

?

?

?

?

?

Loc_DK=i;

?

?

?

?

?

?

end

?

?

end

%?

以下计算各相点对应的李氏数保存到lmd()数组中

%?

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:

m

?

?

?

?

?

?

?

?

DK1=DK1+(Y(k,i)-Y(k,Loc_DK+1))*(Y(k,i)-Y(k,Loc_DK+1));

?

?

?

?

?

?

end

?

?

?

?

?

?

DK1=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);

?

?

?

?

?

?

end

?

?

?

?

?

?

lmd(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:

m

?

?

?

?

?

?

?

?

?

?

?

?

dnew=dnew+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

dnew=sqrt(dnew);

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

if(dnewmax_eps)?

?

%&&不在距离范围,跳过!

?

?

?

?

?

?

?

?

?

?

?

?

continue;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%*计算夹角余弦及比较

?

?

?

?

?

?

?

?

?

?

DOT=0;

?

?

?

?

?

?

?

?

?

?

fork=1:

m

?

?

?

?

?

?

?

?

?

?

?

?

?

?

DOT=DOT+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,old_Loc_DK+1));

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

CTH=DOT/(dnew*DK1);

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

continue;

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

ifCTH>cos_sita?

?

%&&新夹角小于过去已找到的相点的夹角,保留

?

?

?

?

?

?

?

?

?

?

?

?

?

?

cos_sita=CTH;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

Loc_DK=j;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

DK=dnew;

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

point_num=point_num+1;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

ifpoint_num<=min_point

?

?

?

?

?

?

?

?

?

?

max_eps=max_eps+dlt_eps;

?

?

?

?

?

?

?

?

?

?

zjfwcs=zjfwcs+1;

?

?

?

?

?

?

?

?

?

?

ifzjfwcs>MAX_CISHU?

?

%&&超过最大放宽次数,改找最近的点

?

?

?

?

?

?

?

?

?

?

?

?

DK=1.0e+100;

?

?

?

?

?

?

?

?

?

?

?

?

forii=1:

(M-1)

?

?

?

?

?

?

?

?

?

?

?

?

?

?

ifabs(i-ii)<=(P-1)?

?

?

?

%&&候选点距当前点太近,跳过!

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

continue;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

?

?

d=0;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

fork=1:

m

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

d=d+(Y(k,i)-Y(k,ii))*(Y(k,i)-Y(k,ii));

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

?

?

d=sqrt(d);

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

if(dmin_eps)

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

DK=d;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

Loc_DK=ii;

?

?

?

?

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

?

?

break;

?

?

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

?

?

?

?

point_num=0;?

?

?

?

%&&扩大距离范围后重新搜索

?

?

?

?

?

?

?

?

?

?

cos_sita=0;

?

?

?

?

?

?

?

?

end

?

?

?

?

?

?

end

?

?

end

%取平均得到最大李雅普诺夫指数(此处只有一个值,若为正说明体系是混沌的,若为负则说明体系是周期性的确定性运动)

lambda_1=sum(lmd)/length(lmd);

程序中用到的reconstitution函数如下:

此段程序可直接放在时间循环内部,即可以保存时间序列的地方。

见完整程序范例。

functionX=reconstitution(data,N,m,tau)

%该函数用来重构相空间

%m为嵌入空间维数

%tau为时间延迟

%data为输入时间序列

%N为时间序列长度

%X为输出,是m*n维矩阵

M=N-(m-1)*tau;%相空间中点的个数

forj=1:

M?

?

?

?

?

?

?

?

%相空间重构

?

?

fori=1:

m

?

?

?

?

?

?

X(i,j)=data((i-1)*tau+j);

?

?

end

end

这里声明一下,这些程序并非我自己编写的,均是转载,其使用我已经验证过,绝对可以运行!

(3)小数据量方法

说小数据量方法是目前最实用、应用最广泛的方法应该不为过吧,呵呵!

小数据量方法求最大Lyapunov指数.JPG

上面两种方法,即Wolf方法和小数据量方法,在计算LE之前,都要求对时间序列进行重构相空间,重构相空间的优良对于最大LE的计算精度影响非常大!

因此重构相空间的几个参数的确定就非常重要。

(1)时间延迟

主要推荐两种方法——自相关函数法、C-C方法

自相关函数法——对一个混沌时间序列,可以先写出其自相关函数,然后作出自相关函数关于时间t的函数图像。

根据数值试验结果,当自相关函数下降到初始值的1-1/e时,所得的时间t即为重构相空间的时间延迟。

C-C方法——可以同时计算出时间延迟和时间窗口,个人推荐使用这种方法!

(2)平均周期

平均周期的计算可以采用FFT方法。

在matlab帮助中有一个太阳黑子的例子,现摘录如下:

loadsunspot.dat?

?

?

?

?

?

?

?

%装载数据文件

year=sunspot(:

1);?

?

?

?

%读取年份信息

wolfer=sunspot(:

2);?

?

%读取黑子活动数据

plot(year,wolfer)?

?

?

?

?

?

?

?

%绘制原始数据图

title('SunspotData')

Y=fft(wolfer);?

?

?

?

?

?

?

?

?

?

%快速FFT变换

N=length(Y);?

?

?

?

?

?

?

?

?

?

%FFT变换后数据长度

Y

(1)=[];?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

%去掉Y的第一个数据,它是所有数据的和

power=abs(Y(1:

N/2)).^2;?

?

%求功率谱

nyquist=1/2;?

?

?

?

?

?

?

?

?

?

freq=(1:

N/2)/(N/2)*nyquist;%求频率

plot(freq,power),gridon?

?

?

?

?

?

%绘制功率谱图

xlabel('cycles/year')

title('Periodogram')

period=1./freq;?

?

?

?

?

?

?

?

?

?

?

?

?

?

%年份(周期)

plot(period,power),axis([04002e7]),gridon?

?

%绘制年份-功率谱曲线

ylabel('Power')

xlabel('Period(Years/Cycle)')

[mp,index]=max(power);?

?

?

?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1