主要内容

带非线性约束的代理优化

这个例子展示了如何在代理优化中包含非线性不等式约束。这个例子解决了一个带有非线性约束的ODE。这个例子并行优化ODE演示如何使用接受非线性约束的其他求解器解决相同的问题。

有关此示例的视频概述,请参阅代理优化

问题描述

问题是改变大炮的位置和角度尽可能超出墙壁射击射弹。大炮的枪口速度为300米/秒。墙壁高20米。如果大炮太靠近墙壁,它会在陡峭的角度下射击,射弹不会足够远。如果大炮离墙太远,则射弹不会足够远。

非线性空气阻力使弹丸减速。阻力与速度的平方成正比,比例常数为0.02。重力作用于抛射体,使其以恒定的9.81 m/s^2向下加速。因此,运动方程为轨迹xt) 是

d 2 x t d t 2 - 0 0 2 v t v t - 0 9 8 1

在哪里 v t d x t / d t

初始位置x0和初始速度xp0是二维向量。然而,初始高度x0 (2)是0,那么初始位置是由标量给出的x0 (1).初始速度的大小为300(初速),因此,只取决于初始角度,这是一个标量。对于初始角度th,初速度为xp0 = 300 * (cos (th), sin (th)).因此,优化问题仅取决于两个标量,使其成为2-D问题。使用水平距离和初始角度作为决策变量。

制定ODE模型

ODE解算器要求你将模型表述为一阶系统。增广轨迹矢量 x 1 t x 2 t 随着时间的推移 x 1 t x 2 t 形成一个4维轨迹矢量。用增广向量表示,微分方程变成

d dt x t x 3. t x 4 t - 0 02 x 3. t x 4 t x 3. t - 0 02 x 3. t x 4 t x 4 t - 9 81

cannonshot文件实现了这个微分方程。

类型cannonshot
函数f = cannonshot (~ x) f = [x (3), (4); x (3); x (4)];%初始,得到f(1)和f(2)正确的NRM = norm(x(3:4)) * .02;速度的%范数乘以常数f(3) = -x(3)*nrm;f(4) = -x(4)*nrm - 9.81;%的垂直加速度

想象这个ODE的解,从距离墙30米开始,初始角度为PI / 3..的plotcannonsolution功能使用ODE45.来解微分方程。

类型plotcannonsolution
函数dist = plotcannonsolution(x)%更改初始2-d点x至4-d x0 x0 = [x(1); 0; 300 * cos(x(2)); 300 * sin(x(2))];sol = ode45(@cannonshot,[0,15],x0);%找到射弹土地zerofnd = fzero(@(r)deval(sol,r,2),[sol.x(2),sol.x(端)]);t = linspace(0,zerofnd);Plot Xs = Deval(Sol,T,1)%相等时间;%内插x值ys = deval(sol,t,2);%插值的y值图(xs,ys)在绘图上保持([0,0],[0,20],'k')%绘制墙xlabel('水平距离')ylabel('轨迹高度')ylim([0 100])图例('轨迹','墙','位置','nw')dist = xs(结束);标题(Sprintf('距离%f',dist))支撑

plotcannonsolution用途Fzero.要查找射弹土地的时间,意味着它的高度为0.射弹在时间之前15秒,所以plotcannonsolution使用15作为颂歌解决方案的时间量。

x0 =(-30;π/ 3);dist = plotcannonsolution (x0);

图中包含一个轴。标题为Distance 76.750599的轴包含两个line类型的对象。这些物体代表轨迹,墙。

准备优化

为了优化初始位置和角度,编写一个类似于前面的绘图程序的函数。计算从任意水平位置和初始角度开始的轨迹。

包括合理的约束。水平位置不能大于0。设上界为-1。同样,水平位置也不能低于-200,因此设置-200的下界。初始角度必须为正,所以将其下界设为0.05。初始角度不应超过PI./ 2;将其上界设为PI./ 2 - 0.05。

磅= (-200;0.05);乌兰巴托=(1;π/ 2 . 05);

给定返回返回距墙壁的负距离的物体函数,给定初始位置和角度。如果轨迹以小于20的高度穿过墙壁,则轨迹是不可行的;该约束是非线性约束。的cannonobjcon.函数实现了目标函数的计算。为了实现非线性约束,函数调用Fzero.要查找射弹为零的X值的时间。该函数占失败的可能性Fzero.通过检查时间15后,弹丸的x值是否大于零来执行函数。如果不是,那么函数跳过了计算弹丸通过壁面的时间这一步。

类型cannonobjcon.
功能f = cannonobjcon(x)%更改初始2-d点x至4-d x0 x0 = [x(1); 0; 300 * cos(x(2)); 300 * sin(x(2))];%求解轨迹sol = ode45(@cannonshot,[0,15],x0);%查找时间t在轨迹高度= 0 zerofnd = fzero(@(r)deval(sol,r,2),[1e-2,15]);%在该时间发现dist = deval(sol,zerofnd,1)的水平位置;射弹在x = 0上穿过墙壁时的高度是多少?如果deval(sol,15,1)> 0 wallfnd = fzero(@(r)deval(sol,r,1),[0,15]);height = deval(sol,wallfnd,2);else height = deval(sol,15,2);结束f.ineq = 20  - 高度;%高度必须高于20%,对最大化F.fval = -Dist的距离保持距离。 end

您已经计算了一个可行的初始轨迹。使用该值作为初始点。

fx0 = cannonobjcon(x0);fx0.x = x0;

使用求解优化surrogateopt

surrogateopt使用初始点的选项。为了再现性,将随机数生成器设置为默认的.使用“surrogateoptplot”绘图功能。运行优化。理解这一点“surrogateoptplot”情节,看到解释surrogateoptplot

选择= optimoptions ('trustogateopt'“InitialPoints”x0,'plotfcn'“surrogateoptplot”);rng默认的[Xsolution,距离,EXITFLAG,输出] = TREROGATEOPT(@ Cannonobjcon,LB,UB,OPTS)

图优化绘图功能包含轴。标题最佳轴:-125.999现任:-125.773当前:-125.773包含9个类型的线。这些物体代表最佳,现任,初始样本,随机样本(Infeas),随机样本,自适应样品,自适应样品(Infeas),现任(Infeas),替代复位。

Trustogateopt停止,因为它超出了“选项”QuaxFunctioneValuations'设置的函数评估限制。
xsolution =.1×2-28.3776 0.6165
距离= -125.9986.
exitflag = 0
输出=结构与字段:Elapsedtime:43.7252 Funccount:200 Cankerviolation:7.6395E-04 INEQ:7.6395E-04 RNGState:[1x1 struct]消息:'TrustogateOpt停止,因为它超过了...'所设定的函数评估限制

画出最后的轨迹。

图Dist = plotcannonsolution(xsolution);

图中包含一个轴。具有标题距离125.998590的轴包含2个类型的线。这些物体代表轨迹,墙。

Patternsearch.解决方案并行优化ODE显示了最后的距离125.9880,和这个几乎一样surrogateopt解决方案。

另请参阅

相关话题