假设我有以下动态系统
\ dot {x} = x(x-0.5)(x + 0.5)
所以我知道吸引区域在[-0.5,0.5]
因此,在此区域中给定x0,当t变为无穷大时,此状态应为0
在matlab中,我想看到这样的轨迹,所以我使用以下常用方法:
x(t + 1)= x(t)+ dt * f(x)
x0 = [-.3;-.1;.3] % 3D case
dt = .01;
num = 1;
for t = dt : dt : tf
num = num + 1;
x(:,num) = x(:,num - 1) + dt*([x(1)^3-0.25*x(1);x(2)^3-0.25*x(2);x(3)^3-0.25*x(3)] );
end
似乎所有三个轨迹都没有收敛到0.我的代码有问题吗?
答案 0 :(得分:1)
x
是一个3xN矩阵。通过说x(1)
你隐含地写x(1,1)
,这意味着你的第二个词(dt*([x(1)^3-0.25*x(1);x(2)^3-0.25*x(2);x(3)^3-0.25*x(3)]
)将始终保持不变。要转到最新列,请使用x(1,num-1)
。
完整代码(我已将变量tf
更改为ma
,因为tf
是现有的MATLAB函数。):
x0 = [-.3;-.1;.3]; % 3D case
dt = .01;
num = 1;
ma = 30;
x = zeros(3,length(dt:dt:ma)+1);
x(:,1) = x0;
for t = dt : dt : ma
num = num + 1;
x(:,num) = x(:,num - 1) + dt*([x(1,num-1)^3-0.25*x(1,num-1);x(2,num-1)^3-0.25*x(2,num-1);x(3,num-1)^3-0.25*x(3,num-1)] );
end
plot(dt:dt:ma+dt,x)
xlim([0 30])
结果: