这个例子展示了如何在没有目标函数最小化的情况下找到一个满足问题中所有约束条件的点。
假设您有以下约束:
做任何要点 满足所有约束?
创建一个只有约束的优化问题,没有客观函数。
x = Optimvar('X');y = Optimvar('是');prob = OptimProbled;cons1 =(y + x ^ 2)^ 2 + 0.1 * y ^ 2 <= 1;cons2 = y <= exp(-x) - 3;cons3 = y <= x - 4;prob.constraints.cons1 = cons1;prob.constraints.cons2 = cons2;prob.constraints.cons3 = cons3;展示(prob)
优化问题:解决:x, y最小化:服从con1:((y + x.^2)。^ 2 + (0.1 * y ^ 2)。)< = 1 cons2主题:y < = (exp ((- x)) - 3)受cons3: y - x < = 4
创建一个伪随机的起点结构X0.
与字段X
和y
用于优化变量。
rng默认x0.x = randn;x0.y = randn;
从解决问题开始X0.
.
[SOL,〜,EXITFLAG,输出] =求解(prob,x0)
使用Fmincon解决问题。发现满足约束的局部最小值。优化完成,因为目标函数在可行的方向上是非减小的,以便在最优耐受性的值内,并且对约束公差的值满足约束。
sol =结构与字段:X:1.7903 Y:-3.0102
ExitFlag = OptimalAllyolution.
输出=结构与字段:迭代:6 Funccount:9 Counterviolation:0步骤:0.2906算法:'内部点'Firstordopt:0 Cgiterations:0消息:'...'最佳:[1x1结构]目标:“封闭式”约束控制器:“转发 -广告“求解器:'fmincon'
求解器发现了一个可行的点。
从某些初始点开始时,求解器无法找到解决方案。设置初始点x0。X= –1
那x0.y = -4
然后从...开始解决问题X0.
.
x0.x = -1;x0.y = -4;[Sol2,〜,ExitFlag2,Output2] =求解(prob,x0)
使用Fmincon解决问题。融合到一个不可行的点。Fmincon停止,因为它无法在本地找到一个点,其满足约束公差值内的约束。考虑启用内部点方法可行性模式。
sol2 =结构与字段:y: -4.6657
ExitFlag2 = nofeasiblePointFound.
Output2 =结构与字段:迭代:140 Funccount:299 CarrowViroation:1.4609步骤:1.5248E-10算法:'内部点'Firstordopt:0 Cgiterations:281消息:'...'最佳:[]目标:“封闭式”约束:“向前- 答案“求助者:'fmincon'
检查返回点的不可行性。
INF1 =不可行(CONS1,SOL2)
INF1 = 1.1974.
inf2 =不可行性(cons2 sol2)
inf2 = 0
inf3 =不可行性(cons3 sol2)
INF3 = 1.4609
这两个cons1.
和CONS3.
在解决方案中是不可行的sol2.
.结果突出了使用多个开始点来调查和解决可行性问题的重要性。
要可视化约束,请通过使用绘制每个约束函数为零的点fimplicit
.的fimplicit
函数将数值传递给其功能,而评价
功能需要一个结构。要将这些功能捆绑在一起,请使用evaluateExpr
辅助函数,出现在本示例结束.此函数只需将传递的值放入具有相应名称的结构中。
笔记:确保代码evaluateExpr
帮助函数包含在脚本的末尾或路径上的文件中。
避免发生的警告,因为evaluateExpr
功能不适用于矢量化输入。
s =警告(“关闭”那MATLAB: fplot: NotVectorized);= (y + x^2)^2 + 0.1*y^2 - 1;fimplicit (@ (a, b) evaluateExpr (cc1, a, b), (2 2 4 2),'r')举行在= y - exp(-x) + 3;fimplicit (@ (a, b) evaluateExpr (cc2, a, b), (2 2 4 2),“k”)cc3 = y - x + 4;fimplic(@(x,y)评估expr(cc3,x,y),[ - 2 2 -4 2],'B')举行从
警告;
可行区域位于红色轮廓和黑色和蓝线以下。可行区域位于红色轮廓的右下角。
此代码创建evaluateExpr
辅助功能。
函数p = evaluateExpr(expr,x,y) pt.x = x;pt.y = y;p =评估(expr pt);结尾