|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 darcykuzy 于 2012-1-1 17:11 编辑
我从网上找了2个小数据量法求最大lyapunov指数的程序,但运行后得到两个完全不同的结果,一个为正,一个为负,不确定哪个程序是正确的,恳请各位帮忙看看,相应程序及结果如下:
(1)function lambda_1=largest_lyapunov_exponent(data,N,m,tau,P)
clc
clear all
%the function is used to calcultate largest lyapunov exponent with the
%mended algorithm,which put forward by lv jing hu.
%data:the time series
%N:the length of data
%m:enbedding dimention
%tau:time delay
%P:the mean period of the time series,calculated with FFT
%lambda_1:return the largest lyapunov exponent
%skyhawk
data=load('E:\ma\an.txt');
N=length(data);
m=9;
tau=4;
P= 52; %%% or P=1;
delt_t=1;
Y=reconstitution(data,N,m,tau );%reconstitute state space
M=N-(m-1)*tau;%M is the number of embedded points in m-dimensional space
for j=1:M
d_max=1e+100;
for jj=1:M %寻找相空间中每个点的最近距离点,并记下
d_s=0; %该点下标
if abs(j-jj)>P %限制短暂分离
for i=1:m
d_s=d_s+(Y(i,j)-Y(i,jj))*(Y(i,j)-Y(i,jj));
d_min=d_max;
if d_s<d_min
d_min=d_s;
idx_j=jj;
end
end
end
end
% index(j)=idx_j;
max_i=min((M-j),(M-idx_j));%计算点j的最大演化时间步长i
for k=1:max_i %计算点j与其最近邻点在i个离散步后的距离
d_j_i=0;
for kk=1:m
d_j_i=d_j_i+(Y(kk,j+k)-Y(kk,idx_j+k))*(Y(kk,j+k)-Y(kk,idx_j+k));
d(k,j)=d_j_i;
end
end
end
%对每个演化时间步长i,求所有的j的lnd(i,j)平均
[l_i,l_j]=size(d);
for i=1:l_i
q=0;
y_s=0;
for j=1:l_j
if d(i,j)~=0
q=q+1;
y_s=y_s+log(d(i,j));
end
end
y(i)=y_s/(q*delt_t)
end
x=1:length(y);
pp=polyfit(x,y,1);
lambda_1=pp(1);
yp=polyval(pp,x);
plot(x,y,'-o',x,yp,'--')
function X=reconstitution(data,N,m,tau)
%该函数用来重构相空间
% m为嵌入空间维数
% tau为时间延迟
% data为输入时间序列
% N为时间序列长度
% X为输出,是m*n维矩阵
M=N-(m-1)*tau;%相空间中点的个数
for j=1:M %相空间重构
for i=1:m
X(i,j)=data((i-1)*tau+j);
end
end
运行后的结果为:0.0058
(2)function lambda_1=largest_lyapunov_p3(data,N,m,tau,P,delt_t)
clc
clear all
m=9;tau=4;
delt_t=1;
data=load('E:/ma/an.txt');
N=length(data);
P=1;%%%平均周期
d_length=[];
d_content=[];
Y=reconstitution(data,N,m,tau);
M=N-(m-1)*tau;
idx_j=0;
for j=1:M
d_min=1000;
for jj=1:M
d_s=0; %寻找相空间中每个点的最近距离点,并记下该点下标
if abs(j-jj)>P %限制短暂分离
d_s=sum(abs(Y(j)-Y(jj)));
if d_s<d_min
d_min=d_s;
idx_j=jj;
end
end
end
if ((M-j)>(M-idx_j));%计算点j的最大演化时间步长i
max_i=M-idx_j;
else
max_i=M-j;
end
d_length=[d_length,max_i];
for k=1:max_i %计算点j与其最近邻点在i个离散步后的距离
d_j_i=0;
d_j_i=norm(Y(j+k)-Y(idx_j+k));
d_content=[d_content,d_j_i];
end
end
%对每个演化时间步长i,求所有的j的lnd(i,j)平均
y=[];
for i=1:max(d_length)
S_j_i=0;
sum_former=0;
Count=0;
for j=1:M
if j==1
former=0;
else
former=d_length(j-1);
end
sum_former=sum_former+former;
if i<=(d_length(j))
if d_content(sum_former+i)~=0
S_j_i=S_j_i+log(d_content(sum_former+i));
Count=Count+1;
end
end
end
y=[y,S_j_i/(Count*delt_t)]; %对每个演化时间步长i,求所有的j平均
end
XX=1:length(y);
figure;
plot(XX,y,'-','markersize',1);
hold on;
linear=input('请输入线形部分的长度');
XX1=1:linear;
pp=polyfit(XX1,y(XX1),1);
lambda_1=pp(1)
yp=polyval(pp,XX1);
figure;
plot(XX1,yp,'r--')
function X=reconstitution(data,N,m,tau)
%该函数用来重构相空间
% m为嵌入空间维数
% tau为时间延迟
% data为输入时间序列
% N为时间序列长度
% X为输出,是m*n维矩阵
M=N-(m-1)*tau;%相空间中点的个数
for j=1:M %相空间重构
for i=1:m
X(i,j)=data((i-1)*tau+j);
end
end
运行后得到的图为:
输入线性部分长度后(100:150,自己随意取的)得到的结果及图形为:-0.0040
|
|