经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
m基于拉道radau伪谱算法的非线性航迹规划matlab仿真
来源:cnblogs  作者:我爱C编程  时间:2022/12/2 14:36:12  对本文有异议

1.算法概述

        伪谱法,又称为正交配置法,主要利用Lagrange 插值多项式近似离散最优控制问题中的状态变量和控制变量,将连续型最优控制问题转化成离散形式的非线性规划(NLP) 问题,然后利用相应的NLP 算法求解。根据配置点的不同,伪谱法主要分为Legendre伪谱法、Gauss伪谱法 和Radau伪谱法 3 种。

 

       在本课题中,飞行器的运动方程取为:

 

2.部分程序

 

  1. ............................................................................
  2. %约束(3个)
  3. YY1(k) = 0.5*p*a4(k)^2 - qmax;%动压
  4. YY2(k) = sqrt(L^2 + D^2)/G - nmax;%过载
  5. YY3(k) = 3.0078*sqrt(p)*a4(k)^3.08 - Qmax;%驻点热流
  6. end
  7. %根据映射结果计算L
  8. for i = 1:K
  9. for kk=1:Ns
  10. if kk~=i
  11. LL(i)=(t-Tao(kk))/(Tao(i)-Tao(kk));
  12. end
  13. end
  14. end
  15. for i = 1:K
  16. Ls(i)=int(LL(i),t,-1,1);
  17. end
  18. Ls = double(Ls);
  19. %目标方程(1个)
  20. for i = 1:K
  21. Tmp7(i) = C/sqrt(R)*p^0.5*a4(k)^3.08/(Ls(i)^2);
  22. end
  23. J = -(tf-t0)/(K*(K+1))*sum(Tmp7);
  24. %%
  25. %六状态
  26. r_line = zeros(1,K);
  27. Theta_line = zeros(1,K);
  28. Fai_line = zeros(1,K);
  29. V_line = zeros(1,K);
  30. Gamma_line = zeros(1,K);
  31. Si_line = zeros(1,K);
  32. k_ = 0;
  33. CNT = 0;
  34. for k = 1:K
  35. CNT = CNT + 1;
  36. k
  37. if k == 1
  38. Dkl(k,:) = func_D(t0,tf,ts,K,Ns,k);
  39. %离散状态变量定义为ak
  40. a1(k) = r0;
  41. a2(k) = Theta0;
  42. a3(k) = Fai0;
  43. a4(k) = V0;
  44. a5(k) = Gamma0;
  45. a6(k) = Si0;
  46. %离散控制变量定义为bk
  47. b1(k) = delta0;
  48. b2(k) = alpha0;
  49. x = [a1(k) a2(k) a3(k) a4(k) a5(k) a6(k) b1(k) b2(k)];
  50. %将每个网络的最优解方程到过程变量数据中
  51. %六状态
  52. r_line(k) = x(1);
  53. Theta_line(k) = x(2);
  54. Fai_line(k) = x(3);
  55. V_line(k) = x(4);
  56. Gamma_line(k) = x(5);
  57. Si_line(k) = x(6);
  58. else
  59. %注意,采用radau离散化之后的非线性方程组,没法直接使用fmincon进行求解,这里,我们自己编写了一个优化函数进行计算最优值
  60. %对控制状态进行循环(fmincon的原理,也是基于如下过程进行的)
  61. nn = 0;
  62. mm = 0;
  63. alphass = [ 10:Steps:20]/180*pi;
  64. deltass = [-90:3*Steps:90]/180*pi;
  65. for alphas = alphass
  66. mm = 0;
  67. nn = nn+1;
  68. for deltas = deltass
  69. mm=mm+1;
  70. for NN = 1:N
  71. k_= k-1;
  72. Dkl(k_,:) = func_D(t0,tf,ts,K,Ns,k_);
  73. g = u/a1(k_)^2;
  74. p = P*exp(-0.00015*(a1(k_)-Rs));
  75. %部分由状态变量决定的参数
  76. D = 0.5*p*a4(k_)^2*Sref*(bb0 + bb1*alphas + bb2*alphas^2);
  77. L = 0.5*p*a4(k_)^2*Sref*(aa0 + aa1*alphas + aa2*alphas^2);
  78. G = m;
  79. %状态方程(6个)
  80. %公式1
  81. a1(k_+1) = a1(k_)+dtf0*((tf-t0)/2 * a4(k_)*sin(a5(k_)) + a4(k_)*g*sin(1e3*a5(k_)));
  82. %公式2
  83. a2(k_+1) = a2(k_)+dtf1*((tf-t0)/2 * a4(k_)*cos(a5(k_))*cos(a6(k_)) / (a1(k_)*cos(a3(k_))));
  84. %公式3
  85. a3(k_+1) = a3(k_)+dtf2*((tf-t0)/2 * a4(k_)*cos(a5(k_))*sin(a6(k_)) / (a1(k_)));
  86. %公式4
  87. a4(k_+1) = a4(k_)+dtf3*((tf-t0)/2 * (D/m + g*sin(a5(k_))));
  88. %公式5
  89. a5(k_+1) = a5(k_)+dtf4*((tf-t0)/2 * (L/m * cos(deltas) -g*cos(a5(k_)) + a4(k_)^2/a1(k_)*cos(a5(k_))))/a4(k_);
  90. %公式6
  91. a6(k_+1) = a6(k_)+dtf5*((tf-t0)/2 * (L/m * sin(deltas)/cos(a5(k_)) - a4(k_)^2/a1(k_)*cos(a5(k_))*cos(a6(k_))*tan(a3(k_))))/a4(k_);
  92. end
  93. D = 0.5*p*a4(k_+1)^2*Sref*(bb0 + bb1*alphas + bb2*alphas^2);
  94. L = 0.5*p*a4(k_+1)^2*Sref*(aa0 + aa1*alphas + aa2*alphas^2);
  95. if (0.5*p*a4(k_+1)^2 <= qmax) & (sqrt(L^2 + D^2)/G <= nmax) & (3.0078*sqrt(p)*a4(k_+1)^3.08 <= Qmax) &...
  96. (0.5*p*a4(k_+1)^2 > 0) & (sqrt(L^2 + D^2)/G > 0) & (3.0078*sqrt(p)*a4(k_+1)^3.08 > 0)&...
  97. a4(k_+1) >= 1.508 & a4(k_+1) <= V0 & a1(k_+1) <= Rs+80 & a1(k_+1) >= Rs+20;
  98. ..............................................
  99. 02-007m

 

  

3.算法部分仿真结果图

 

原文链接:https://www.cnblogs.com/51matlab/p/16944409.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号