查看: 183|回复: 1|关注: 0

[已解决] 警告: 在 t=1.134739e+00 处失败。在时间 t 处,步长大小必须降至所允许的最小值(3.552714e-15)以下,才能达到积分容差要求。 该怎么解决

[复制链接]

新手

36 麦片

财富积分


050


3

主题

15

帖子

0

最佳答案
警告: 在 t=1.134739e+00 处失败。在时间 t 处,步长大小必须降至所允许的最小值(3.552714e-15)以下,才能达到积分容差要求。
  1. clear all
  2. clc
  3. syms x1 x2 t u
  4. global x1 x2 DX1 DX2 y
  5. DX1=-x1+x2;                  %给定X
  6. DX2=-0.5*x1-0.5*x2*(1-(cos(x1)+2)^2)+(cos(x1)+2)*u;
  7. U=-(cos(x1)+2)*x2;                 %给定U
  8. DX2=subs(DX2,u,U);
  9. L=[x1;x2].'*[1 0;0 1]*[x1;x2]+u.'*u;    %成本函数

  10. %%
  11. Af1=[x1,x2,u,x1*cos(x1),x2*cos(x1),u*cos(x1),x1*cos(x1)^2,x2*cos(x1)^2,u*cos(x1)^2];   %Af为状态函数的基函数
  12. Af2=Af1;
  13. Bf=[x1^2,x1*x2,x2^2];                                                                 %Bf为控制函数的基函数
  14. Cf=[x1,x2,x1*cos(x1),x2*cos(x1)];
  15. A1=rand(9,1);        %生成初始A1
  16. A2=A1;
  17. A=rand(18,1);          %A:状态方程的系数矩阵
  18. B=rand(3,1);            %B:控制方程的系数矩阵
  19. C=ones(4,1);            %C:控制方程的系数矩阵
  20. Af=[Af1,Af2];             %Af:多项式基函数
  21. AF=[Af1 zeros(1,size(Af2,2));zeros(1,size(Af1,2)) Af2];              %AF:diag(Af1,Af2)
  22. AFU=subs(AF,u,U)          %代入给定U
  23. AFu=subs(AF,u,sum(Bf*B))  %代入给定u=sum(Bf*B)

  24. y=AFu*A                %y:迭代过程Step4中用到的状态方程
  25. tspan = [0,8];
  26. x0=[0;45];
  27. [t, x] = ode45(@odeode, tspan, x0);
  28. plot(t,x(:,1),'-',t,x(:,2),'-.')
  29. legend('x1','x2')
  30. double tt
  31. tt=double(t);

  32. function dx=odeode(t,x)
  33. %求X微分方程
  34. global y x1 x2
  35. dx=[subs(sum(y.*[1;0]),{x1,x2},{x(1),x(2)});subs(sum(y.*[0;1]),{x1,x2},{x(1),x(2)})]
  36. dx=double(dx);
  37. end
复制代码


回复主题 已获打赏: 0 积分

举报

论坛优秀回答者

9

主题

1650

帖子

354

最佳答案
  • 关注者: 81
发表于 2020-10-11 16:48:02 | 显示全部楼层 |此回复为最佳答案
仅供参考,为了节约时间将时间跨度从0-8改成了0-1,改变了初值和步长
  1. clear all
  2. clc
  3. global x1 x2 y
  4. syms x1 x2 u

  5. DX1=-x1+x2;                  %给定X
  6. DX2=-0.5*x1-0.5*x2*(1-(cos(x1)+2)^2)+(cos(x1)+2)*u;
  7. U=-(cos(x1)+2)*x2;                 %给定U
  8. DX2=subs(DX2,u,U);
  9. L=[x1;x2].'*[1 0;0 1]*[x1;x2]+u.'*u;    %成本函数

  10. %%
  11. Af1=[x1,x2,u,x1*cos(x1),x2*cos(x1),u*cos(x1),x1*cos(x1)^2,x2*cos(x1)^2,u*cos(x1)^2];   %Af为状态函数的基函数
  12. Af2=Af1;
  13. Bf=[x1^2,x1*x2,x2^2];                                                                 %Bf为控制函数的基函数
  14. Cf=[x1,x2,x1*cos(x1),x2*cos(x1)];
  15. A1=rand(9,1);        %生成初始A1
  16. A2=A1;
  17. A=rand(18,1);          %A:状态方程的系数矩阵
  18. B=rand(3,1);            %B:控制方程的系数矩阵
  19. C=ones(4,1);            %C:控制方程的系数矩阵
  20. Af=[Af1,Af2];             %Af:多项式基函数
  21. AF=[Af1 zeros(1,size(Af2,2));zeros(1,size(Af1,2)) Af2];              %AF:diag(Af1,Af2)
  22. AFU=subs(AF,u,U)          %代入给定U
  23. AFu=subs(AF,u,sum(Bf*B))  %代入给定u=sum(Bf*B)

  24. y=AFu*A                %y:迭代过程Step4中用到的状态方程
  25. tspan = [0 1];
  26. x0=[0;1];
  27. options = odeset('MaxStep',1.75e-15);
  28. [t, x] = ode45(@odeode, tspan, x0);
  29. plot(t,x(:,1),'-',t,x(:,2),'-.')
  30. legend('x1','x2')
  31. double tt
  32. tt=double(t);

  33. function dx=odeode(t,x)
  34. %求X微分方程
  35. global y x1 x2
  36. dx=[subs(sum(y.*[1;0]),{x1,x2},{x(1),x(2)});subs(sum(y.*[0;1]),{x1,x2},{x(1),x(2)})];
  37. dx=double(dx);
  38. end
复制代码
1.PNG
回复此楼 已获打赏: 2 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表