离散最优轨迹,基于问题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
通过使用实时脚本运行此示例来实现。该函数包括空气阻力参数;集gydF4y2Ba空气= truegydF4y2Ba
对于有空气阻力的模型。有关空气阻力的定义,请参阅本节gydF4y2Ba包括空气阻力gydF4y2Ba.gydF4y2Ba
类型gydF4y2BasetupproblemgydF4y2Ba
函数trackyprob = 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);= optimvar(“a”,n - 1, 3,下界,-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);[溶胶,fval eflag、输出]=解决(trajprob)gydF4y2Ba
使用coneprog解决问题。找到最优解。gydF4y2Ba
索尔=gydF4y2Ba结构体字段:gydF4y2BaA: [50x3 double] p: [50x3 double] s: [49x1 double] v: [50x3 double]gydF4y2Ba
fval = 192.2989gydF4y2Ba
eflag = OptimalSolutiongydF4y2Ba
输出=gydF4y2Ba结构体字段:gydF4y2Ba迭代:8 primal可行性:3.2932e-07 dual可行性:2.9508e-07 dualitygap: 1.7343e-08算法:' inner -point'线性求解器:'prodchol'消息:'找到最优解。“解决者:“coneprog”gydF4y2Ba
画出加速度的轨迹和范数gydF4y2BaplottrajandaccelgydF4y2Ba
helper函数所示gydF4y2Ba在这个例子的最后gydF4y2Ba.gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
加速度一直接近重力加速度(9.81),但在接近终点时加速度略有下降。gydF4y2Ba
找到最小的成本gydF4y2Ba
什么时间gydF4y2Ba 使成本降到最低?时间过短,如gydF4y2Ba 在美国,这个问题是不可行的,意思是它没有解决方案。gydF4y2Ba
myprob = setupproblem (1);[solm, fvalm eflagm outputm] =解决(myprob);gydF4y2Ba
使用coneprog解决问题。问题是不可行的。gydF4y2Ba
时间1.5给出了一个可行问题。gydF4y2Ba
myprob = setupproblem (1.5);[solm, fvalm eflagm outputm] =解决(myprob);gydF4y2Ba
使用coneprog解决问题。找到最优解。gydF4y2Ba
的gydF4y2BatomingydF4y2Ba
helper函数gydF4y2Ba在这个例子的最后gydF4y2Ba为时间设置了一个问题gydF4y2BaTgydF4y2Ba
,然后调用gydF4y2Ba解决gydF4y2Ba
计算解决方案的成本。调用gydF4y2BafminbndgydF4y2Ba
在gydF4y2BatomingydF4y2Ba
找出区间内的最佳时间(成本可能最低)gydF4y2Ba
.gydF4y2Ba
[Tmin, Fmin] = fminbnd (@ (T) tomin (T,假),1.5,10)gydF4y2Ba
Tmin = 1.9518gydF4y2Ba
Fmin = 24.6101gydF4y2Ba
获得最佳时间的轨迹gydF4y2BaTmingydF4y2Ba
.gydF4y2Ba
minprob = setupproblem (Tmin);索尔=解决(minprob);gydF4y2Ba
使用coneprog解决问题。找到最优解。gydF4y2Ba
画出最小的轨迹和加速度。gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
最小解几乎是一个“砰砰”解:加速度要么是最大的,要么是零,只有两个值除外。gydF4y2Ba
情节Nonminimizing轨迹gydF4y2Ba
画出不同时间的轨迹。gydF4y2Ba
图保存gydF4y2Ba在gydF4y2Ba选择= optimoptions (gydF4y2Ba“coneprog”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba);gydF4y2Ba为gydF4y2Bai = 1:10 T = 2*i;概率= setupproblem (T);索尔=解决(概率,gydF4y2Ba“选项”gydF4y2Ba、选择);psol = sol.p;plot3 (psol (: 1) psol (:, 2), psol (:, 3),gydF4y2Ba“处方”gydF4y2Ba,gydF4y2Ba“颜色”gydF4y2Ba,(256 - 25 *我20 * 25 *]/ 256)gydF4y2Ba结束gydF4y2Ba视图(-10[18])包含(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空气= truegydF4y2Ba
有因素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,真的),1.5,10)gydF4y2Ba
Tmin2 = 1.9397gydF4y2Ba
Fmin2 = 28.7967gydF4y2Ba
最优时间仅略低于无空气阻力问题的时间(1.94而非1.95),但成本gydF4y2BaFmingydF4y2Ba
大约高出17%(28.8而不是24.6)。gydF4y2Ba
compartable =表([Tmin; Tmin2], [Fmin; Fmin2],gydF4y2Ba“VariableNames”gydF4y2Ba,[gydF4y2Ba“时间”gydF4y2Ba“成本”gydF4y2Ba),gydF4y2Ba“RowNames”gydF4y2Ba,[gydF4y2Ba“原始”gydF4y2Ba“空气阻力”gydF4y2Ba])gydF4y2Ba
compartable =gydF4y2Ba2×2表gydF4y2Ba时间成本______ ______原1.9518 24.61空气阻力1.9397 28.797gydF4y2Ba
画出有空气阻力的最优解的轨迹和加速度。gydF4y2Ba
minprob = setupproblem (Tmin2,真实);索尔=解决(minprob);gydF4y2Ba
使用coneprog解决问题。找到最优解。gydF4y2Ba
plottrajandaccel(溶胶,p0, pF)gydF4y2Ba
在空气阻力的作用下,零加速度的时间移到较晚的时间步长,并且变短。然而,解决方案仍然近乎“砰砰”。gydF4y2Ba
辅助函数gydF4y2Ba
此代码创建gydF4y2BaplottrajandaccelgydF4y2Ba
helper函数。gydF4y2Ba
函数gydF4y2Baplottrajandaccel(sol,p0,pF)图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视图(-10[18])包含(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、空气)gydF4y2Ba如果gydF4y2BaNargin = 1 air = false;gydF4y2Ba结束gydF4y2Ba问题= setupproblem (T、空气);选择= optimoptions (gydF4y2Ba“coneprog”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba);[~ F] =解决(问题,gydF4y2Ba“选项”gydF4y2Ba、选择);gydF4y2Ba结束gydF4y2Ba
另请参阅gydF4y2Ba
coneproggydF4y2Ba
|gydF4y2Ba解决gydF4y2Ba