当间隔增加时,MATLAB ode45图形会发生显着变化

时间:2017-05-03 00:41:38

标签: matlab matlab-figure ode

我使用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

现在,当运行上面的内容时,我得到了数字enter image description here

但是,当我将ode45(flor,(0:0.0005:30), x0)更改为ode45(flor,(0:0.0005:31), x0)(也就是说,我将30更改为31)时,我会得到以下图enter image description here

哪个截然不同!我唯一要改变的是(除非我弄错了)是时间间隔为1.任何关于为什么会发生这种情况的线索?

1 个答案:

答案 0 :(得分:4)

罪魁祸首似乎是默认的最长时间步长。默认情况下,ode45使用0.1*abs(diff(tspan)),可以在模拟没有大幅度摆动时提早使用Lorenz System comparison of maximum step sizes。并且由于两个模拟具有不同的最终时间,所以最大值将是不同的,并且时间行进的微小变化将被混沌系统的时间演变放大。将两个模拟的最大值设置为相同的值会得到相同的结果。

此代码

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/

可以看出,匹配最大时间步长(底部的图形)会产生相同的输出。