解决约束的非线性问题,具体问题具体分析
典型的优化问题
这个例子展示了如何解决约束非线性优化问题采用具体问题具体分析的方法。示例演示了典型工作流程:创建一个目标函数,建立约束,解决问题,并检查结果。
注意:
如果你的目标函数或非线性约束不是初等函数组成的,你必须把非线性函数优化表达式使用fcn2optimexpr
。看到这个例子的最后一部分,替代配方使用fcn2optimexpr,或将非线性函数优化表达式。
solver-based的方法这个问题,看到的使用优化约束非线性问题编辑任务或解决生活。
问题公式化:。海涅的函数
考虑的问题最小化。海涅的功能
在单位圆,这意味着在原点为中心的半径为1的圆盘。换句话说,找到 最小化函数 在一组 。这个问题是一个非线性函数的极小化非线性约束。
。函数是一个标准测试函数的优化。它有一个独特的0达到最小值点[1]
。为一些算法找到最低是一个挑战,因为函数有一个浅最低深深地弯内谷。解决这个问题不是在点[1]
因为这一点不满足约束条件。
这个图显示了两个单位圆盘。海涅的功能的观点。纵轴是对数;换句话说,情节显示 。等值线躺在表面之下。
。= @ (x) 100 * (x (:, 2) - x (: 1)。^ 2)。^ 2 + (1 - x (: 1)) ^ 2;%矢量化函数图1 =图(“位置”,1 200 600 300);colormap (“灰色”);轴广场;R = 0: .002:1;TH = 2 *π* (0:.002:1);X = R ' * cos (TH);Y = R ' * sin (TH);(1 + Z =日志。([X (:), Y (:))));Z =重塑(Z,大小(X));%创建次要情节subplot1 =次要情节(1、2、1,“父”,图1);视图([124 34]);网格(“上”);持有在;%建立表面冲浪(X, Y, Z,“父”subplot1,“线型”,“没有”);%创建轮廓轮廓(X, Y, Z,“父”,subplot1);%创建次要情节subplot2 =次要情节(1、2、2、“父”,图1);视图([234 34]);网格(“上”);持有在%建立表面冲浪(X, Y, Z,“父”subplot2,“线型”,“没有”);%创建轮廓轮廓(X, Y, Z,“父”,subplot2);%创建textarrow注释(图1,“textarrow”(0.4 - 0.31),…(0.055 - 0.16),…“字符串”,{的最低(0.7864,0.6177)});%创建箭头注释(图1,“箭头”(0.59 - 0.62),…[0.065 - 0.34]);标题(“。海涅的功能:两个视图”)举行从
的。
函数处理计算。海涅的函数在任何数量的二维点。这向量化函数的绘制速度,可用于其他场合下超速评价函数的多个点。
这个函数 被称为目标函数。你想要的目标函数是函数最小化。的不平等 被称为约束。约束限制的集合 在解算器搜索最小。你可以拥有任意数量的限制,这是不平等或方程。
使用优化变量定义的问题
具体问题具体分析的方法来优化使用优化变量来定义目标和约束。有两种方法用于创建使用这些变量表达式:
多项式或理性功能,编写表达式直接变量。
对于其他类型的函数,函数转换为优化表达式使用
fcn2optimexpr
。看到替代配方使用fcn2optimexpr
最后这个例子。
对于这个问题,目标函数和多项式非线性约束,所以你可以直接写表达式的优化变量。创建一个二维优化变量命名“x”
。
x = optimvar (“x”、1、2);
创建目标函数的多项式优化变量。
obj = 100 * (x (2) - (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;
创建一个名为优化问题概率
有obj
作为目标函数。
概率= optimproblem (“目标”、obj);
创建一个多项式的非线性约束的优化变量。
nlcons x = x (1) ^ 2 + (2) ^ 2 < = 1;
包括非线性约束的问题。
prob.Constraints。circlecons = nlcons;
回顾这个问题。
显示(概率)
OptimizationProblem:解:x最小化:((100。* (x - x (1) (2)。^ 2)。^ 2) + (1 - x(1)) ^ 2)主题circlecons: (x (1)。^ 2 + x (2) ^ 2) < = 1
解决问题
为了解决优化问题,电话解决
。这个问题需要一个初始点,这是一个结构优化变量的初始值。创建初始点结构x0
拥有一个
价值的[0 0]
。
x0。x=[0 0];[溶胶,fval exitflag、输出]=解决(x0概率)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:x (0.7864 - 0.6177):
fval = 0.0457
exitflag = OptimalSolution
输出=结构体字段:迭代:24 funcCount: 34 constrviolation: 0 stepsize: 6.9161 e-06算法:“内点”firstorderopt: 2.1625 e-08 cgiterations: 4消息:“局部最小值发现,满足约束....“bestfeasible: [1 x1 struct] objectivederivative:“reverse-AD”constraintderivative:“封闭”解算器:“fmincon”
检查解决方案
解决方案展示exitflag = OptimalSolution
。这个出口标志表明是一个局部最优的解决方案。试图找到一个更好的解决方案的信息,明白了当解决成功。
退出的消息表明,解决方案满足约束。你可以检查在几个方面解决方案确实可行。
检查报告的不可行性
constrviolation
场的输出
结构。
infeas = output.constrviolation
infeas = 0
0表示的不可行性解决方案是可行的。
计算的不可行性的解决方案。
infeas =不可行性(nlcons sol)
infeas = 0
再次,0表示的不可行性解决方案是可行的。
计算的标准
x
,以确保它是小于或等于1。
nx =规范(sol.x)
nx = 1.0000
的输出
结构给解决方案过程的更多信息,比如迭代次数(24),解算器(fmincon
),评价函数的数量(84)。这些统计数据的更多信息,请参阅公差和停止条件。
替代配方使用fcn2optimexpr
对于更复杂的表达式,编写函数文件的目标或约束函数,并将它们转换为优化表达式使用fcn2optimexpr
。例如,非线性约束函数的基础disk.m
文件:
类型磁盘
函数radsqr =磁盘(x) radsqr = x (1) ^ 2 + (2) ^ 2;
这个函数文件转换为一种优化表达式。
radsqexpr = fcn2optimexpr (@disk x);
此外,您还可以转换。
定义的函数处理,在绘图程序的开始,到一个优化表达式。
rosenexpr = fcn2optimexpr (。, x);
创建一个使用这些转换优化表达式优化问题。
convprob = optimproblem (“目标”rosenexpr,“约束”radsqexpr < = 1);
查看新问题。
显示(convprob)
OptimizationProblem:解:x最小化:((100。* (x - x (1) (2)。^ 2)。^ 2) + (1 - x(1)) ^ 2)主题:(x (1)。^ 2 + x (2) ^ 2) < = 1
解决新问题。解决方案本质上是一样的。
[溶胶,fval exitflag、输出]=解决(x0 convprob)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:x (0.7864 - 0.6177):
fval = 0.0457
exitflag = OptimalSolution
输出=结构体字段:迭代:24 funcCount: 34 constrviolation: 0 stepsize: 6.9161 e-06算法:“内点”firstorderopt: 2.1625 e-08 cgiterations: 4消息:“局部最小值发现,满足约束....“bestfeasible: [1 x1 struct] objectivederivative:“reverse-AD”constraintderivative:“封闭”解算器:“fmincon”
支持的功能列表,请参阅金宝app金宝app支持操作优化变量和表达式。