在MATLA用四阶龙格库塔解有界噪声下的杜芬振子微分方程并计算其lyapunov指数谱
以下是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 著作权归作者所有。请勿转载和采集!