|
楼主 |
发表于 2007-9-11 15:48
|
显示全部楼层
回复 #35 sssssxxxxx921 的帖子
我今天这么做了一下,你看看是否可以。
1.使用自相关法计算时间延迟。
2.使用Takens方法计算关联维数,这里需要嵌入维数m,我是从1开始给m赋值的,直到计算出的关联维数d不满足下面关系为止。
m>=2d+1
这样就找到了嵌入维数m,你试试,看看是否可以。
Takens方程如下:
clc
clear
close all
%---------------------------------------------------
% 产生 Lorenz 时间序列
sigma = 10; % Lorenz方程参数
r = 28;
b = 8/3;
y = [-1;0;1]; % 起始点 (3x1 的列向量)
h = 0.01; % 积分时间步长
k1 = 6000; % 前面的过渡点数
k2 = 2000; % 后面的迭代点数
z = LorenzData(y,h,k1+k2,sigma,r,b); % 用四阶 Runge-Kutta 法产生 k1+k2 个点
X = z(k1+1:end,1); % 去掉前面 k1 个过渡点
X = normalize_1(X); % 归一化到均值为 0,振幅为 1
%---------------------------------------------------
% 相空间重构
tau = 14;
m = 3;
[xn] = PhaSpaRecon(X,tau,m);
xn = xn'; % 重构相空间点集,每一行为一个点
r = 0.04; % r 相对于吸引子直径的大小,(0,1)之间
%---------------------------------------------------
% 调用 mex 函数
Dim = CorrelationDimension(xn,r)
————————————————————————————————————————
其中normalize_1函数如下:
function [sig_output] = normalize_1(sig_input)
% 信号归一化到均值为 0,振幅为 1
% [sig_output] = normalize_sig(sig_input)
% 输入参数:sig_input 输入信号(可以批处理)
% 输出参数:sig_output 标准化的信号
[rows,cols] = size(sig_input);
if (rows ==1)
sig_input = sig_input';
len = cols;
num = 1;
else
len = rows;
num = cols;
end
mean_sig = mean(sig_input);
sig_input = sig_input - repmat(mean_sig,len,1); % 0 均值
dis = max(sig_input) - min(sig_input);
sig_output = sig_input./repmat(dis,len,1); % 振幅为 1
————————————————————————————————————————
其中PhaSpaRecon函数如下:
function [xn,dn] = PhaSpaRecon(s,tau,m)
% 混沌序列的相空间重构 (phase space reconstruction)
% [xn, dn, xn_cols] = PhaSpaRecon(s, tau, m)
% 输入参数: s 混沌序列(列向量)
% tau 重构时延
% m 重构维数
% 输出参数: xn 相空间中的点序列(每一列为一个点)
% dn 一步预测的目标(行向量)
[rows,cols] = size(s);
if (rows>cols)
len = rows;
s = s';
else
len = cols;
end
if (nargout==2)
if (len-1-(m-1)*tau < 1)
disp('err: delay time or the embedding dimension is too large!')
xn = [];
dn = [];
else
xn = zeros(m,len-1-(m-1)*tau);
for i = 1:m
xn(i,:) = s(1+(i-1)*tau : len-1-(m-i)*tau); % 相空间重构,每一行为一个点
end
dn = s(2+(m-1)*tau : end); % 预测的目标
end
elseif (nargout==1)
if (len-1-(m-1)*tau < 0)
disp('err: delay time or the embedding dimension is too large!')
xn = [];
else
xn = zeros(m,len-(m-1)*tau);
for i = 1:m
xn(i,:) = s(1+(i-1)*tau : len-(m-i)*tau); % 相空间重构,每一行为一个点
end
end
end |
|