加了控制器以后,总是在一点断掉不能继续作图,出现:在 t=2.833085e-02 处失败。在时间 t 处,不将步长大小降至所允许的最小值(5.551115e-17)以下,便无法满足积分公差要求。 这样的警告
实在没有办法了,感恩
代码如下
function lcq3
sol1=ddesd(@lcq2,@delay,[2.2-1.8*i 2.2+0.4*i -1.5-0.2*i 1.2-0.2*i],[0 10]); % without control
subplot(2,1,1);plot(sol1.x,real(sol1.y(1,:)),'b',sol1.x,real(sol1.y(3,:)),'r')%phase state
xlabel('t');
ylabel('Re(w_{1}(t)),Re(w_{2}(t))');
lgnd=legend('Re(w_{1}(t))','Re(w_{2}(t))','Location','NorthEast','Orientation','horizontal');
set(lgnd,'color','none','box','off');
subplot(2,1,2);plot(sol1.x,imag(sol1.y(1,:)),'b',sol1.x,imag(sol1.y(3,:)),'r')%phase state
xlabel('t');
ylabel('Im(w_{1}(t)),Im(w_{2}(t))');
lgnd=legend('Im(w_{1}(t))','Im(w_{2}(t))','Location','NorthEast','Orientation','horizontal');
set(lgnd,'color','none','box','off');
hold on
function d=delay(t,y)
d=[t-exp(t)/(1+exp(t))];
%d=0.25*abs(sin(3*t));
end
function dy = lcq2(t,y,Z)
dy=zeros(4,1);
dy(1)=y(2);
dy(2)=-3.5*y(1)-5.1*y(2)+(1-1.2*1i)*(tanh(real(y(1)))+tanh(imag(y(1)))*1i)*(sqrt(y(1)*conj(y(1)))<=1)+(-2.2-0.6*1i)*(tanh(real(y(1)))+tanh(imag(y(1)))*1i)*(sqrt(y(1)*conj(y(1)))>1)+...
(0.8-2.5*1i)*(tanh(real(y(1)))+tanh(imag(y(1)))*1i)*(sqrt(y(1)*conj(y(1)))<=1)+(-1.6-1.1*1i)*(tanh(real(y(1)))+tanh(imag(y(1)))*1i)*(sqrt(y(1)*conj(y(1)))>1)+...
(1.3-0.3*1i)*(tanh(real(Z(1,1)))+tanh(imag(Z(1,1)))*1i)*(sqrt(y(1)*conj(y(1)))<=1)+(1.3-0.7*1i)*(tanh(real(Z(1,1)))+tanh(imag(Z(1,1)))*1i)*(sqrt(y(1)*conj(y(1)))>1)+...
(0.6+0.2*1i)*(tanh(real(Z(3,1)))+tanh(imag(Z(3,1)))*1i)*(sqrt(y(1)*conj(y(1)))<=1)+(-0.4+1.5*1i)*(tanh(real(Z(3,1)))+tanh(imag(Z(3,1)))*1i)*(sqrt(y(1)*conj(y(1)))>1)+...
1/(conj(y(2)))*(-1.5*(y(1)*(conj(y(1))))^1.5-2.5*(y(1)*(conj(y(1))))^0.2-3.5*(y(2)*(conj(y(2))))^1.5-2.9*(y(2)*(conj(y(2))))^0.2-5.5*sqrt(y(2)*conj(y(2)))-3.3*sqrt(y(4)*conj(y(4))));
dy(3)=y(4);
dy(4)=-6*y(3)-5.5*y(4)+(-1.0+1.2*1i)*(tanh(real(y(3)))+tanh(imag(y(3)))*1i)*(sqrt(y(3)*conj(y(3)))<=1)+(-0.5-1.6*1i)*(tanh(real(y(3)))+tanh(imag(y(3)))*1i)*(sqrt(y(3)*conj(y(3)))>1)+...
(1.0-1.4*1i)*(tanh(real(y(3)))+tanh(imag(y(3)))*1i)*(sqrt(y(3)*conj(y(3)))<=1)+(1.2+0.8*1i)*(tanh(real(y(3)))+tanh(imag(y(3)))*1i)*(sqrt(y(3)*conj(y(3)))>1)+...
(-1.2+0.5*i)*(tanh(real(Z(1,1)))+tanh(imag(Z(1,1)))*1i)*(sqrt(y(3)*conj(y(3)))<=1)+(1.1-0.6*1i)*(tanh(real(Z(1,1)))+tanh(imag(Z(1,1)))*1i)*(sqrt(y(3)*conj(y(3)))>1)+...
(-0.7+1.6*1i)*(tanh(real(Z(3,1)))+tanh(imag(Z(3,1)))*1i)*(sqrt(y(3)*conj(y(3)))<=1)+(-0.1+2.1*1i)*(tanh(real(Z(3,1)))+tanh(imag(Z(3,1)))*1i)*(sqrt(y(3)*conj(y(3)))>1)+...
1/(conj(y(4)))*(-2.4*(y(3)*(conj(y(3))))^1.5-4.5*(y(3)*(conj(y(3))))^0.2-3.7*(y(4)*(conj(y(4))))^1.5-1.6*(y(4)*(conj(y(4))))^0.2-3.5*sqrt(y(2)*conj(y(2)))-2.5*sqrt(y(4)*conj(y(4))));
end
end
要修复时间 t=2.833085e-02 的故障,您可以尝试将积分的步长调整为小于最小允许值 5.551115e-17 的较小值。 这可以通过在积分函数中使用较小的步长选项,或使用更适合处理小步长和实现所需容差的不同积分算法来完成。
例如,您可以尝试使用 MATLAB 中的 ode45 函数,这是一个变步长、变阶求解器,可以自动调整步长以满足所需的容差。 您还可以指定积分的相对和绝对容差,这决定了结果的准确性和允许的最小步长。
要使用 ode45 函数,您可以指定定义系统导数的函数、执行积分的时间跨度以及系统的初始条件。 您还可以指定积分的相对和绝对容差,以及您要针对特定问题自定义的任何其他选项。 例如:
[t,y] = ode45(@derivative, [0, 2.833085e-02], y0, options);
其中 derivative 是定义系统导数的函数,[0, 2.833085e-02] 是执行积分的时间跨度,y0 是系统的初始条件,options 是包含 积分选项,例如相对和绝对容差、初始步长和任何其他自定义选项。
运行积分后,您可以检查 ode45 函数使用的步长大小,并验证它们是否足够小以满足时间 t=2.833085e-02 时所需的容差。 如果步长仍然太大,您可以尝试调整相对和绝对容差,或使用不同的选项来微调 ode45 函数的性能并提高结果的准确性。