主要内容

解决非线性可行性问题,基于问题

这个例子展示了如何在没有目标函数最小化的情况下找到一个满足问题中所有约束条件的点。

问题定义

假设您有以下约束:

y + X 2 的) 2 + 0. 1 y 2 ≤. 1 y ≤. exp. - X 的) - 3. y ≤. X - 4.

做任何要点 X y 的) 满足所有约束?

具体问题具体分析解决方案

创建一个只有约束的优化问题,没有客观函数。

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.与字段Xy用于优化变量。

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= –1x0.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')举行

图包含轴对象。轴对象包含3个类型的ImplicitFunctionLine的对象。

警告;

可行区域位于红色轮廓和黑色和蓝线以下。可行区域位于红色轮廓的右下角。

辅助功能

此代码创建evaluateExpr辅助功能。

函数p = evaluateExpr(expr,x,y) pt.x = x;pt.y = y;p =评估(expr pt);结尾

也可以看看

相关的话题