离散最优轨迹,基于问题gydF4y2Ba
这个例子展示了如何使用基于问题的方法来解决离散最优轨迹问题。弹道重力恒定,施加的力有限,没有空气阻力。求解过程是求解固定时间内的最优轨迹gydF4y2Ba ,然后用这个解来找到最优解gydF4y2Ba ,即花费最小的时间。最后一节将展示如何包含空气阻力。gydF4y2Ba
与非离散优化相比,如本例gydF4y2Ba使用优化变量拟合ODE参数gydF4y2Ba,离散化版本在求解常微分方程(ODE)时不那么准确。然而,离散化的版本在变步长ODE求解器中不受噪声的影响,如中所述gydF4y2Ba优化一个模拟或常微分方程gydF4y2Ba.离散化版本也更容易定制,并且易于建模。最后,离散化版本可以在优化过程中利用自动微分;看到gydF4y2Ba自动微分在基于问题的优化中的作用gydF4y2Ba.gydF4y2Ba
问题描述gydF4y2Ba
问题是如何移动物体gydF4y2Ba 在时间gydF4y2Ba 定位gydF4y2Ba 在时间gydF4y2Ba 使用可控喷射。用向量表示位置gydF4y2Ba ,速度是一个矢量gydF4y2Ba ,并将加速度作为矢量gydF4y2Ba .在连续时间中,包括重力在内的运动方程为gydF4y2Ba
.gydF4y2Ba
通过离散时间来解决这个问题。把时间分成gydF4y2Ba 大小相等的间隔gydF4y2Ba .时间步长的位置gydF4y2Ba 是向量gydF4y2Ba ,速度是矢量gydF4y2Ba ,施加的加速度是一个矢量gydF4y2Ba .你可以建立一组方程来相当准确地表示ODE模型。一些近似的运动方程是:gydF4y2Ba
前面的方程使用两点(梯形规则)近似积分速度,并使用一点(欧拉)近似积分加速度。该积分方案给出了简单的阶跃位置和速度方程gydF4y2Ba 只依赖于位置、速度和加速度gydF4y2Ba .方程也很容易修改空气阻力。gydF4y2Ba
边界条件为gydF4y2Ba ,gydF4y2Ba ,gydF4y2Ba .设置初始和最终位置。gydF4y2Ba
P0 = [0 0 0];pF = [5 10 3];gydF4y2Ba
用喷气机制造力量的成本gydF4y2Ba 时间gydF4y2Ba 是gydF4y2Ba .总代价是加速度的范数乘以的和gydF4y2Ba :gydF4y2Ba
要将此成本转换为优化变量中的线性成本,请创建变量gydF4y2Ba 并创建相关的二阶锥约束:gydF4y2Ba
施加额外的约束,使加速度的范数以常数为界gydF4y2BaAmaxgydF4y2Ba
对于所有时间步骤:gydF4y2Ba
这些约束也是二阶锥约束。因为约束条件是线性或二阶锥约束条件,目标函数是线性的,gydF4y2Ba解决gydF4y2Ba
调用gydF4y2BaconeproggydF4y2Ba
求解器来解决问题。gydF4y2Ba
下面的代码创建了一个固定时间t的优化问题。该代码将运动方程作为问题约束。您可以访问gydF4y2Basetupproblem.mgydF4y2Ba
函数文件,使用live脚本运行此示例。该函数包含一个空气阻力参数;集gydF4y2Ba空气=真gydF4y2Ba
对于有空气阻力的模型。空气阻力的定义请参见章节gydF4y2Ba考虑空气阻力gydF4y2Ba.gydF4y2Ba
类型gydF4y2BasetupproblemgydF4y2Ba
function trajectoryprob = setupproblem(T,air) if nargin == 1 air = false;结束N = 50;G = [0 0 -9.81];P0 = [0 0 0];pF = [5 10 3];Amax = 25;t = t /N;p = optimvar("p",N,3);v = optimvar("v",N,3);a = optimvar("a", n -1,3,"LowerBound",-Amax,"UpperBound",Amax); trajectoryprob = optimproblem; s = optimvar("s",N-1,"LowerBound",0,"UpperBound",3*Amax); trajectoryprob.Objective = sum(s)*t; scons = optimconstr(N-1); for i = 1:(N-1) scons(i) = norm(a(i,:)) <= s(i); end acons = optimconstr(N-1); for i = 1:(N-1) acons(i) = norm(a(i,:)) <= Amax; end vcons = optimconstr(N+1,3); vcons(1,:) = v(1,:) == [0 0 0]; if air vcons(2:N,:) = v(2:N,:) == v(1:(N-1),:)*exp(-t) + t*(a(1:(N-1),:) + repmat(g,N-1,1)); else vcons(2:N,:) = v(2:N,:) == v(1:(N-1),:) + t*(a(1:(N-1),:) + repmat(g,N-1,1)); end vcons(N+1,:) = v(N,:) == [0 0 0]; pcons = optimconstr(N+1,3); pcons(1,:) = p(1,:) == p0; if air pcons(2:N,:) = p(2:N,:) == p(1:(N-1),:) + t*(1+exp(-t))/2*v(1:(N-1),:) + t^2/2*(a(1:(N-1),:) + repmat(g,N-1,1)); else pcons(2:N,:) = p(2:N,:) == p(1:(N-1),:) + t*v(1:(N-1),:) + t^2/2*(a(1:(N-1),:) + repmat(g,N-1,1)); end pcons((N+1),:) = p(N,:) == pF; trajectoryprob.Constraints.acons = acons; trajectoryprob.Constraints.scons = scons; trajectoryprob.Constraints.vcons = vcons; trajectoryprob.Constraints.pcons = pcons; end
解决T = 20题gydF4y2Ba
创建并解决一个时间轨迹问题gydF4y2Ba .gydF4y2Ba
Trajprob = setupproblem(20);[sol,fval,eflag,output] = solve(trajprob)gydF4y2Ba
用coneprog解决问题。找到最优解。gydF4y2Ba
索尔=gydF4y2Ba带字段的结构:gydF4y2BaA: [49x3 double] p: [50x3 double] s: [49x1 double] v: [50x3 double]gydF4y2Ba
Fval = 192.2989gydF4y2Ba
eflag = OptimalSolutiongydF4y2Ba
输出=gydF4y2Ba带字段的结构:gydF4y2Ba迭代:8原始可行性:3.2932e-07对偶可行性:2.9508e-07对偶间隙:1.7343e-08算法:'内点'线性求解器:'prodchol'消息:'找到最优解决方案。'coneprog'gydF4y2Ba
通过调用,绘制加速度的轨迹和范数gydF4y2BaplottrajandaccelgydF4y2Ba
所示的辅助函数gydF4y2Ba在这个例子的最后gydF4y2Ba.gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
加速度在所有时间都接近重力加速度(9.81),但在接近终点时,加速度略有下降。gydF4y2Ba
找到最小成本gydF4y2Ba
什么时间gydF4y2Ba 使成本最小化?因为时间太小,比如gydF4y2Ba ,这个问题是不可行的,意思是它没有解决方案。gydF4y2Ba
Myprob = setupproblem(1);[solm,fvalm,eflagm,outputm] = solve(myprob);gydF4y2Ba
用coneprog解决问题。问题是不可行的。gydF4y2Ba
时间1.5给出了一个可行的问题。gydF4y2Ba
Myprob = setupproblem(1.5);[solm,fvalm,eflagm,outputm] = solve(myprob);gydF4y2Ba
用coneprog解决问题。找到最优解。gydF4y2Ba
的gydF4y2BatomingydF4y2Ba
helper函数gydF4y2Ba在这个例子的最后gydF4y2Ba为时间设置了一个问题gydF4y2BaTgydF4y2Ba
然后调用gydF4y2Ba解决gydF4y2Ba
计算解决方案的成本。调用gydF4y2BafminbndgydF4y2Ba
在gydF4y2BatomingydF4y2Ba
找出区间内的最佳时间(成本可能最低)gydF4y2Ba
.gydF4y2Ba
[Tmin,Fmin] = fminbnd(@(T)tomin(T,false),1.5,10)gydF4y2Ba
Tmin = 1.9499gydF4y2Ba
Fmin = 24.6102gydF4y2Ba
得到最优时间的轨迹gydF4y2BaTmingydF4y2Ba
.gydF4y2Ba
minprob =设置问题(Tmin);Sol = solve(minprob);gydF4y2Ba
用coneprog解决问题。找到最优解。gydF4y2Ba
画出最小轨迹和加速度。gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
最小解几乎是一个“砰砰”的解:除了两个值外,加速度要么是最大的,要么是零。gydF4y2Ba
绘制非最小化轨迹gydF4y2Ba
画出不同时间的轨迹。gydF4y2Ba
图保存gydF4y2Ba在gydF4y2Ba选项= optimoptions(gydF4y2Ba“coneprog”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba);gydF4y2Ba为gydF4y2Bai = 1:10 T = 2*i;prob =设置问题(T);Sol =解决(问题,gydF4y2Ba“选项”gydF4y2Ba、选择);Psol = sol.p;plot3 (psol (: 1) psol (:, 2), psol (:, 3),gydF4y2Ba“处方”gydF4y2Ba,gydF4y2Ba“颜色”gydF4y2Ba,[256-25*i 20*i 25*i]/256)gydF4y2Ba结束gydF4y2Ba视图([18 -10])xlabel(gydF4y2Ba“x”gydF4y2Ba) ylabel (gydF4y2Ba“y”gydF4y2Ba) zlabel (gydF4y2Ba“z”gydF4y2Ba)传说(gydF4y2Ba" t = 2"gydF4y2Ba,gydF4y2Ba" t = 4"gydF4y2Ba,gydF4y2Ba" t = 6"gydF4y2Ba,gydF4y2Ba" t = 8"gydF4y2Ba,gydF4y2Ba" t = 10"gydF4y2Ba,gydF4y2Ba" t = 12"gydF4y2Ba,gydF4y2Ba" t = 14"gydF4y2Ba,gydF4y2Ba" t = 16"gydF4y2Ba,gydF4y2Ba" t = 18"gydF4y2Ba,gydF4y2Ba" t = 20"gydF4y2Ba)举行gydF4y2Ba从gydF4y2Ba
最短时间(2)在这个尺度上有一个几乎直接的轨迹。中间时间从一个直接路径有很大的变化。最大的时间(20)也有一个几乎直接的路径。gydF4y2Ba
考虑空气阻力gydF4y2Ba
改变模型动力学,以包括空气阻力。线性空气阻力使速度改变一个因子gydF4y2Ba 又一次gydF4y2Ba .运动方程变成gydF4y2Ba
问题的提法gydF4y2Basetupproblem (T、空气)gydF4y2Ba
函数gydF4y2Ba空气=真gydF4y2Ba
有因素gydF4y2Baexp (- t)gydF4y2Ba
在定义速度约束的直线和定义位置约束的直线中:gydF4y2Ba
vcons (2: N:) = v (2: N:) = = v (1: (N - 1):) * exp (- t) + t * ((1: (N - 1):) + repmat (g, N - 1, - 1));pcons (2: N:) = p (2: N:) = = p (1: (N - 1):) + t * (1 + exp (- t)) / 2 * v (1: (N - 1):) + t ^ 2/2 * ((1: (N - 1):) + repmat (g, N - 1, - 1));gydF4y2Ba
找到空气阻力问题的最佳时间。gydF4y2Ba
[Tmin2,Fmin2] = fminbnd(@(T)tomin(T,true),1.5,10)gydF4y2Ba
Tmin2 = 1.9396gydF4y2Ba
Fmin2 = 28.7967gydF4y2Ba
最优时间仅略低于无空气阻力问题的时间(1.94而不是1.95),但成本gydF4y2BaFmingydF4y2Ba
高出17%(28.8而不是24.6)。gydF4y2Ba
compartable = table([Tmin;Tmin2],[Fmin;Fmin2],gydF4y2Ba“VariableNames”gydF4y2Ba,[gydF4y2Ba“时间”gydF4y2Ba“成本”gydF4y2Ba),gydF4y2Ba“RowNames”gydF4y2Ba,[gydF4y2Ba“原始”gydF4y2Ba“空气阻力”gydF4y2Ba])gydF4y2Ba
compartable =gydF4y2Ba2×2表gydF4y2Ba时间成本______ ______原始1.9499 24.61空气阻力1.9396 28.797gydF4y2Ba
画出带空气阻力的最优解的轨迹和加速度。gydF4y2Ba
minprob = setupproblem(Tmin2,true);Sol = solve(minprob);gydF4y2Ba
用coneprog解决问题。找到最优解。gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
有空气阻力时,零加速度的时间移到较晚的时间步长,并且变短。然而,解决方案仍然几乎是“砰砰”。gydF4y2Ba
辅助函数gydF4y2Ba
此代码创建gydF4y2BaplottrajandaccelgydF4y2Ba
helper函数。gydF4y2Ba
函数gydF4y2Baplot (sol,p0,pF) figure psol = sol.p;plot3 (psol (: 1) psol (:, 2), psol (:, 3),gydF4y2Ba“处方”gydF4y2Ba)举行gydF4y2Ba在gydF4y2Baplot3 (p0 (1), p0 (2), p0 (3),gydF4y2Ba“ks”gydF4y2BapF) plot3 (pF (1), (2), pF (3),gydF4y2Ba“波”gydF4y2Ba)举行gydF4y2Ba从gydF4y2Ba视图([18 -10])xlabel(gydF4y2Ba“x”gydF4y2Ba) ylabel (gydF4y2Ba“y”gydF4y2Ba) zlabel (gydF4y2Ba“z”gydF4y2Ba)传说(gydF4y2Ba“步骤”gydF4y2Ba,gydF4y2Ba“起点”gydF4y2Ba,gydF4y2Ba“最后一点”gydF4y2Ba)图asolm = sol.a;Nasolm =根号(sum(asolm.^2,2));情节(nasolmgydF4y2Ba“处方”gydF4y2Ba)包含(gydF4y2Ba“时间步”gydF4y2Ba) ylabel (gydF4y2Ba“规范(加速度)”gydF4y2Ba)gydF4y2Ba结束gydF4y2Ba
此代码创建gydF4y2BatomingydF4y2Ba
helper函数。gydF4y2Ba
函数gydF4y2BaF = tomin(T,air)gydF4y2Ba如果gydF4y2BaNargin == 1 air = false;gydF4y2Ba结束gydF4y2Baproblem = setupproblem(T,air);Opts = optimoptions(gydF4y2Ba“coneprog”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba);[~,F] =解决(问题,gydF4y2Ba“选项”gydF4y2Ba、选择);gydF4y2Ba结束gydF4y2Ba
另请参阅gydF4y2Ba
coneproggydF4y2Ba
|gydF4y2Ba解决gydF4y2Ba