matlab程序如下
function Lambda_1 = Wolf_lyap_timeseries(data,N,m,tau,DT,LMX,LMN,EVOLV)
global LE;
global ITS;
% 该函数根据Alan Wolf 1985年发表的文章中附录B给出的fortran代码进行翻译
% Determining lyapunov exponents from a time series,Physica 16D,1985
% data:所求实验系统的时间序列
% N:data数据的长度
% m:相空间重构时的嵌入维数
% tau:相空间重构时的时间延迟(s)
% DT:数据的采样间隔(s)
% EVOLV:替换步之间的演化时间(s)
% LE:时间序列的最大Lyapunov指数(bits/s)
Y = reconstitution(data,N,m,tau);
IND = 1;
SUM = 0.0;
ITS = 0;
N = N - m * tau - EVOLV;
% 寻找初始点的最近点,并计算最短距离DI
DI = 1e+38;
for i = 11 : N
D = 0.0;
for j = 1 : m
D = D + (Y(j,IND)-Y(j,i))*(Y(j,IND)-Y(j,i));
end
D = sqrt(D);
if D > DI || D < LMN
continue;
else
DI = D;
IND2 = i;
continue;
end
end
% 确定演化后的坐标点
Lock = 1;
while ( Lock )
for j = 1 : m
PT1(j) = Y(j,IND+EVOLV);
PT2(j) = Y(j,IND2+EVOLV);
end
% 计算演化后的距离DF
DF = 0.0;
for j = 1 : m
DF = DF + (PT1(j)-PT2(j))*(PT1(j)-PT2(j));
end
DF = sqrt(DF);
ITS = ITS + 1;
SUM = SUM + log(DF/DI)/(EVOLV*DT*log(2));
LE(ITS) = SUM/ITS;
% 寻找替换点
INDOLD = IND2;
Lock1 = 1;
ZMULT = 1.0;
ANGLMX = 0.3;
while ( Lock1 )
THMIN = 3.14;
for i = 1 : N
iii = abs(i-(IND+EVOLV));
if iii > 10
DNEW = 0.0;
for j = 1 : m
DNEW = DNEW + (PT1(j)-Y(j,i))*(PT1(j)-Y(j,i));
end
DNEW = sqrt(DNEW);
if DNEW < ZMULT*LMX && DNEW > LMN
DOT = 0.0;
for j = 1 : m
DOT = DOT + (PT1(j)-Y(j,i)*(PT1(j)-PT2(j)));
end
CTH = abs(DOT/DNEW*DF);
if CTH > 1
CTH = 1;
end
TH = acos(CTH);
if TH < THMIN
THMIN = TH;
DII = DNEW;
IND2 = i;
end
end
end
end
if THMIN > ANGLMX
ZMULT = ZMULT + 1;
if ZMULT > 5
ZMULT = 1.0;
ANGLMX = ANGLMX*2;
if ANGLMX > 3.14
IND2 = INDOLD + EVOLV;
DII = DF;
Lock1 = 0;
end
end
else
Lock1 = 0;
end
end
IND = IND + EVOLV;
if IND >= N
Lambda_1 = LE(end);
Lock = 0;
else
DI = DII;
end
end,