主要内容

解决受约束的非线性问题,基于问题

典型的优化问题

此示例显示如何使用基于问题的方法来解决约束的非线性优化问题。该示例演示了典型的工作流程:创建目标函数,创建约束,解决问题,并检查结果。

笔记:

如果您的客观函数或非线性约束不由基本函数组成,则必须将非线性函数转换为使用优化表达式FCN2Optimexpr.查看此示例的最后一部分,使用FCN2Optimexpr的替代制剂, 或者将非线性函数转换为优化表达式

对于基于求解器的方法,请参阅解决约束的非线性问题,基于求解器

问题制定:Rosenbrock的功能

考虑最小化Rosenbrock功能的问题

F X = 1 0. 0. X 2 - X 1 2 2 + 1 - X 1 2

结束了单元磁盘,意味着半径1的磁盘以原点为中心。换句话说,找到 X 这最小化了功能 F X 在集合上 X 1 2 + X 2 2 ≤. 1 。该问题是对非线性约束进行非线性功能的最小化。

RosenBrock的功能是优化中的标准测试功能。它在该点处具有独特的最小值0[1,1]。发现最小是某些算法的挑战,因为该功能在深度弯曲的山谷内具有浅的最小值。这个问题的解决方案不是目的[1,1]因为那点不满足约束。

此图显示了Rosenbrock的功能在单位磁盘的两个视图。纵轴是对数比例的;换句话说,情节显示 日志 1 + F X 。轮廓线位于表面图下方。

rosenbrock = @(x)100 *(x(:,2) -  x(:,1)。^ 2)。^ 2 +(1  -  x(:,1))。^ 2;%矢量化功能图1 =图('位置',[1 200 600 300]);Colormap('灰色的');轴正方形;r = 0:.002:1;th = 2 * pi *(0:.002:1);x = r'* cos(th);y = r'* sin(th);z = log(1 + rosenbrock([x(:),y(:)]));z =重塑(z,size(x));%创建子图子平板=子图(1,2,1,'父母',图1);查看([124 34]);网格('上');抓住;%创建表面冲浪(x,y,z,'父母',subplot1,'linestyle''没有任何');%创建轮廓轮廓(x,y,z,'父母',子平板1);%创建子图子平板2 =子图(1,2,2,'父母',图1);查看([234 34]);网格('上');抓住%创建表面冲浪(x,y,z,'父母',子平板2,'linestyle''没有任何');%创建轮廓轮廓(x,y,z,'父母',子平板2);%创建textarrow.注释(图1,'textarrow',[0.4 0.31],......[0.055 0.16],......'细绳',{的最低(0.7864,0.6177)});%创建箭头注释(图1,'箭',[0.59 0.62],......[0.065 0.34]);标题(“Rosenbrock的功能:两个视图”) 抓住离开

图包含2个轴。轴1包含2个类型表面的物体,轮廓。轴2带标题RosenBrock的功能:两个视图包含2个类型表面的2个对象,轮廓。

rosenbrock.功能手柄一次计算RosenBrock的函数,一次数量的2-D点。这矢量化速度速度函数,并且可以在其他上下文中有用,用于在多个点加速评估函数的评估。

功能 F X 被称为目标函数。目标函数是您要最小化的功能。不平等 X 1 2 + X 2 2 ≤. 1 被称为A.约束。约束限制了集合 X 求解器搜索最少。您可以拥有任何数量的约束,这是不平等或方程。

使用优化变量定义问题

基于问题的优化方法使用优化变量来定义目标和约束。使用这些变量创建表达式有两种方法:

  • 对于多项式或合理函数,直接在变量中写入表达式。

  • 对于其他类型的函数,使用函数转换为优化表达式FCN2Optimexpr.。看替代配方使用FCN2Optimexpr.在这个例子的最后。

对于此问题,目标函数和非线性约束都是多项式,因此您可以在优化变量方面直接编写表达式。创建一个名为的2-D优化变量'X'

x = Optimvar('X'、1、2);

在优化变量中将目标函数创建为多项式。

obj = 100 *(x(2) -  x(1)^ 2)^ 2 +(1  -  x(1))^ 2;

创建名为的优化问题概率拥有obj.作为目标函数。

prob = OptimProblem('客观的',obj);

在优化变量中创建非线性约束作为多项式。

nlcons = x(1)^ 2 + x(2)^ 2 <= 1;

包括问题中的非线性约束。

prob.constraints.circlecons = nlcons;

回顾问题。

展示(prob)
优化问题:解决:x最小化:((100. *(x(2) -  x(1)。^ 2)。^ 2)+(1  -  x(1))。^ 2)受Circlecons:(x(1)。^ 2 + x(2)。^ 2)<= 1

解决问题

要解决优化问题,请致电解决。问题需要一个初始点,这是一个提供优化变量的初始值的结构。创建初始点结构X0.拥有一个 X 价值的[0 0]

x0.x = [0 0];[SOL,FVAL,EXITFLAG,输出] =求解(prob,x0)
使用Fmincon解决问题。发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
sol =结构与字段:X:[0.7864 0.6177]
FVAL = 0.0457.
ExitFlag = OptimalAllyolution.
输出=结构与字段:迭代:24 Funccount:34 CounterViolation:0步骤:6.9161E-06算法:'内部点'FirstOrderopt:2.1625E-08 Cgiterations:4消息:'...'最佳:[1x1 struct]目标:“反向广告“统治长:”封闭式“求解器:'粉丝'

检查解决方案

解决方案显示ExitFlag = OptimalAllyolution.。此出口标志表示解决方案是本地最佳最佳状态。有关尝试找到更好解决方案的信息,请参阅当求职者成功时

退出消息表示解决方案满足约束。您可以通过多种方式检查解决方案确实可行。

  • 检查报告中的不可行性CONSTRVIOMATION.场面的领域输出结构体。

Infeas = output.ConstRviroation.
Infeas = 0.

不可行性为0表示解是可行的。

  • 计算解决方案的缺点。

Infeas =不可行(Nlcons,Sol)
Infeas = 0.

同样,0的可行性表明该解决方案是可行的。

  • 计算常态X确保它小于或等于1。

nx = norm(sol.x)
nx = 1.0000.

输出结构提供有关解决方案过程的更多信息,例如迭代(24)的数量,求解器(粉刺)和功能评估数(84)。有关这些统计数据的更多信息,请参阅公差和停止标准

替代配方使用FCN2Optimexpr.

对于更复杂的表达式,为目标或约束函数写入功能文件,并将它们转换为优化表达式FCN2Optimexpr.。例如,非线性约束函数的基础是disk.m.文件:

类型磁盘
函数RadSQR =磁盘(x)Radsqr = x(1)^ 2 + x(2)^ 2;

将此函数文件转换为优化表达式。

radsqexpr = fcn2optimexpr(@ disk,x);

此外,您还可以转换rosenbrock.函数句柄,在绘图例程开始时定义为一个优化表达式。

rosenexpr = fcn2optimexpr(rosenbrock,x);

使用这些转换后的优化表达式创建优化问题。

convprob = OptimProblem('客观的',罗森普,'限制',Radsqexpr <= 1);

查看新问题。

展示(Commprob)
优化问题:求解:x最小化:anonymousfunction2(x)其中:anonymousfunction2 = @(x)100 *(x(:,2)-x(:,1)。^ 2)。^ 2+(1-x(1-x(:,1))。^ 2;受:磁盘(x)<= 1

解决新问题。解决方案与以前基本相同。

[SOL,FVAL,EXITFLAG,输出] =求解(CONDPROB,X0)
使用Fmincon解决问题。发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
sol =结构与字段:X:[0.7864 0.6177]
FVAL = 0.0457.
ExitFlag = OptimalAllyolution.
输出=结构与字段:迭代:24 Funccount:84 Corrountviolation:0步骤:6.9162E-06算法:'内部点'Firstordopt:2.4373E-08 Cgiterations:4消息:'...'最佳:[1x1结构]目标:“有限差异“限制性:”有限差异“求解器:'粉丝'

有关支持的函数列表,请参阅金宝app金宝app在优化变量和表达式上支持的操作

相关的话题