我使用MATLAB绘制Lorenz系统的图形。基本上,我有
r=31;
x0 = [(-9+sqrt(81+40*r)).*10^-27 (2*r).*10^-27 0];
flor = @(t,s) [ -10*(s(1)-s(2)); r*s(1)-s(2)-s(1)*s(3);
-8/3*s(3)+s(1)*s(2)];
[t1,s1] = ode45(flor,(0:0.0005:30), x0);
subplot(2,1,1),
hold on
plot3(s1(:,1),s1(:,2),s1(:,3))
hold off
grid on
xlabel('x'),ylabel('y'),zlabel('z')
view(10,5)
axis tight
但是,当我将ode45(flor,(0:0.0005:30), x0)
更改为ode45(flor,(0:0.0005:31), x0)
(也就是说,我将30更改为31)时,我会得到以下图
哪个截然不同!我唯一要改变的是(除非我弄错了)是时间间隔为1.任何关于为什么会发生这种情况的线索?
答案 0 :(得分:4)
罪魁祸首似乎是默认的最长时间步长。默认情况下,ode45
使用0.1*abs(diff(tspan))
,可以在模拟没有大幅度摆动时提早使用。并且由于两个模拟具有不同的最终时间,所以最大值将是不同的,并且时间行进的微小变化将被混沌系统的时间演变放大。将两个模拟的最大值设置为相同的值会得到相同的结果。
此代码
r=31;
x0 = [(-9+sqrt(81+40*r)).*10^-27 (2*r).*10^-27 0];
flor = @(t,s) [ -10*(s(1)-s(2)); r*s(1)-s(2)-s(1)*s(3);
-8/3*s(3)+s(1)*s(2)];
[t30,s30] = ode45(flor,0:0.0005:30, x0);
[t31,s31] = ode45(flor,0:0.0005:31, x0);
[t30p,s30p] = ode45(flor,0:0.0005:30, x0, odeset('MaxStep',3));
[t31p,s31p] = ode45(flor,0:0.0005:31, x0, odeset('MaxStep',3));
subplot(2,2,1);
plot3(s30(:,1),s30(:,2),s30(:,3));
grid on
xlabel('x'),ylabel('y'),zlabel('z')
view(10,5)
axis tight
title('30 Seconds: Default Maximum Time-Step');
subplot(2,2,2);
plot3(s31(t31<=30,1),s31(t31<=30,2),s31(t31<=30,3));
grid on
xlabel('x'),ylabel('y'),zlabel('z')
view(10,5)
axis tight
title('31 Seconds: Default Maximum Time-Step');
subplot(2,2,3);
plot3(s30p(:,1),s30p(:,2),s30p(:,3));
grid on
xlabel('x'),ylabel('y'),zlabel('z')
view(10,5)
axis tight
title('30 Seconds: Maximum Time-Step of 3');
subplot(2,2,4);
plot3(s31p(t31p<=30,1),s31p(t31p<=30,2),s31p(t31p<=30,3));
grid on
xlabel('x'),ylabel('y'),zlabel('z')
view(10,5)
axis tight
title('31 Seconds: Maximum Time-Step of 3');
生成此图
https://jsfiddle.net/xg3464b4/
可以看出,匹配最大时间步长(底部的图形)会产生相同的输出。