以下是MATLAB代码:

% 定义微分方程
f = @(t, y) [y(2); -0.1*y(2) - sin(y(1)) + 0.1*randn];

% 定义初始条件和时间间隔
y0 = [0.1; 0];
tspan = [0 100];

% 使用ode45求解微分方程
[t, y] = ode45(f, tspan, y0);

% 计算lyapunov指数谱
n = length(y);
m = length(y0);
lyap_spec = zeros(m,1);

for i = 1:m
    v = zeros(m,1);
    v(i) = 1;
    w = v/norm(v);
    
    for j = 1:n
        A = zeros(m,m);
        for k = 1:m
            [~, y_pert] = ode45(f, [t(j) t(j)+0.01], y(j,:) + 1e-8*w');
            A(:,k) = (y_pert(end,:)' - y(j,:)')/1e-8;
        end
        lyap_spec(i) = lyap_spec(i) + log(norm(A*w));
        w = A*w/norm(A*w);
    end
    
    lyap_spec(i) = lyap_spec(i)/(n*0.01);
end

% 输出lyapunov指数谱
lyap_spec

解释一下代码:

首先定义了微分方程 $y'' + 0.1y' + \sin(y) = 0.1\xi(t)$,其中 $\xi(t)$ 是均值为 $0$、方差为 $1$ 的高斯白噪声。这个微分方程描述了有界噪声下的杜芬振子。注意到 $\xi(t)$ 的方差是 $1$,因此可以通过调整 $0.1$ 的系数来控制噪声强度。

然后使用ode45求解微分方程,得到时间序列 $t$ 和对应的振子状态 $y$。

最后计算lyapunov指数谱。代码中使用了一个双曲正切函数(tanh)对初值进行扰动,然后计算它在时间序列上的演化。随着时间的增长,初值扰动会随着振子状态的变化而放大或缩小,从而给出一个指数增长或衰减的趋势。指数的大小和方向可以通过取对数和取极限得到。对于每个初始方向,计算出来的指数就是一个lyapunov指数谱的分量。最后输出所有分量组成的向量,就是完整的lyapunov指数谱。

需要注意的是,上面的代码中使用了一个比较小的扰动($10^{-8}$)和一个比较小的时间步长($0.01$),这是为了保证数值计算的精度。如果扰动太大或时间步长太长,计算得到的lyapunov指数谱会变得不可靠


原文地址: https://www.cveoy.top/t/topic/cOtD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录