混沌时间序列参数计算MATLAB实现(时间延迟、嵌入维数、关联维)

一、核心参数计算原理

  1. 时间延迟(τ) 互信息法:通过计算时间序列与其延迟版本之间的互信息,寻找第一个极小值点作为最佳延迟。 自相关法:通过自相关函数(ACF)首次降至原始值1/e或过零点的延迟时间。 C-C方法:结合自相关和平均位移法,同时确定延迟时间和嵌入窗。
  2. 嵌入维数(m) 假近邻法(FNN):通过计算不同嵌入维下虚假最近邻比例的收敛性确定最小嵌入维。 Cao方法:基于相空间重构后邻域距离的变化率确定嵌入维。
  3. 关联维数(D₂) Grassberger-Procaccia(GP)算法:通过关联积分计算双对数曲线的斜率估计关联维。 改进无标度区间:使用模拟退火遗传算法优化无标度区间选择。

二、MATLAB代码实现

1. 数据预处理与相空间重构
% 生成混沌序列(Logistic映射)
r = 3.99; x0 = 0.5; N = 1000;
x = zeros(1,N);
x(1) = x0;
for i = 2:N
    x(i) = r * x(i-1) * (1 - x(i-1));
end

% 归一化
x = (x - min(x)) / (max(x) - min(x));

% 相空间重构(时间延迟τ=5,嵌入维m=3)
tau = 5; m = 3;
X = reconstruction(x, tau, m);

% 重构函数
function X = reconstruction(data, tau, m)
    N = length(data);
    X = zeros(m, N - (m-1)*tau);
    for i = 1:m
        X(i,:) = data((1:N - (m-1)*tau) + (i-1)*tau);
    end
end
2. 时间延迟计算(互信息法)
function tau = mutual_information(data, max_delay)
    N = length(data);
    H = zeros(1, max_delay);
    for tau = 1:max_delay
        % 分割为τ不相交子序列
        subs = disjoint(data, tau);
        H(tau) = 0;
        for i = 1:size(subs,1)
            H(tau) = H(tau) + entropy(subs(i,:));
        end
        H(tau) = H(tau)/size(subs,1);
    end
    % 寻找第一个极小值点
    [~, tau] = min(H(2:end-1) > H(1:end-2) & H(2:end-1) > H(3:end));
    tau = tau + 1;
end

% 辅助函数:分割序列
function subs = disjoint(data, tau)
    N = length(data);
    num_sub = floor(N/tau);
    subs = zeros(tau, num_sub);
    for i = 1:tau
        subs(i,:) = data((i-1)*num_sub + 1 : i*num_sub);
    end
end
3. 嵌入维数计算(假近邻法)
function m = false_nearest_neighbors(data, max_m)
    N = length(data);
    m = 1;
    while m <= max_m
        % 重构相空间
        X = reconstruction(data, 1, m);
        distances = pdist(X);
        % 计算虚假近邻比例
        fnn_ratio = compute_fnn(X, distances);
        if fnn_ratio < 0.1
            break;
        end
        m = m + 1;
    end
end

% 辅助函数:计算虚假近邻比例
function ratio = compute_fnn(X, distances)
    N = size(X,2);
    ratio = 0;
    for i = 1:N-1
        [~, idx] = sort(distances(i,:));
        nearest = idx(2);
        % 检查是否为虚假近邻
        if norm(X(:,i) - X(:,nearest)) > 10*norm(X(:,i) - X(:,idx(3)))
            ratio = ratio + 1;
        end
    end
    ratio = ratio / N;
end
4. 关联维数计算(GP算法)
function D2 = grassberger_procaccia(data, m, r_min, r_max)
    N = length(data);
    X = reconstruction(data, 1, m);
    distances = pdist(X);
    log_r = logspace(log10(r_min), log10(r_max), 50);
    C = zeros(size(log_r));
    
    for k = 1:length(log_r)
        r = log_r(k);
        count = 0;
        for i = 1:N
            for j = i+1:N
                if distances(i,j) < r
                    count = count + 1;
                end
            end
        end
        C(k) = count / (N*(N-1)/2);
    end
    
    % 线性拟合(忽略前10%和后10%数据)
    p = polyfit(log(log_r(11:end-10)), log(C(11:end-10)), 1);
    D2 = p(1);
end
5. 综合计算示例
% 参数设置
max_delay = 20;
max_m = 10;
r_min = 0.01; r_max = 1;

% 计算时间延迟
tau = mutual_information(x, max_delay);
disp(['时间延迟 τ = ', num2str(tau)]);

% 计算嵌入维数
m = false_nearest_neighbors(x, max_m);
disp(['嵌入维数 m = ', num2str(m)]);

% 计算关联维数
D2 = grassberger_procaccia(x, m, r_min, r_max);
disp(['关联维数 D₂ = ', num2str(D2)]);

三、可视化与结果分析

% 相空间重构可视化
figure;
plot3(X(1,:), X(2,:), X(3,:), 'b.');
xlabel('X_1'); ylabel('X_2'); zlabel('X_3');
title('相空间重构(m=3, τ=5)');

% 关联积分双对数图
figure;
loglog(log_r, log(C), 'r-o');
hold on;
plot(log(log_r(11:end-10)), log(C(11:end-10)), 'k--');
xlabel('ln(r)'); ylabel('ln(C(r))');
title('关联积分曲线(D₂=' num2str(D2, '%.2f') ')');

四、关键优化与注意事项

  1. 噪声处理:添加高斯噪声时需调整关联积分的半径范围(r_min需大于噪声标准差)。
  2. 计算效率:大规模数据可使用KD树加速最近邻搜索(MATLAB的KDTreeSearcher)。
  3. 无标度区间:推荐使用模拟退火算法自动选择最佳半径范围。

五、扩展应用

  • 故障诊断:通过关联维数变化检测机械系统异常。
  • 生理信号分析:计算脑电信号的关联维数评估意识状态。
  • 气候预测:结合延迟嵌入定理重构大气动力学相空间。

六、参考

  1. MATLAB工具箱Chaos Toolbox:提供embed_seq(嵌入维计算)、determinism(关联维)等函数。 TISEAN库:支持C-C方法、假近邻法等。
  2. 代码 含有各种混沌时间序列参数(时间延迟,嵌入维数,关联维等)计算程序 www.youwenfan.com/contentcnn/82714.html
  3. Python实现nolds库:nolds.sampen(样本熵)、nolds.corr_dim(关联维)。
posted @ 2025-12-09 17:39  yu8yu7  阅读(2)  评论(0)    收藏  举报