主要内容

解决一个约束非线性问题,基于问题

典型优化问题

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

注意:

如果目标函数或非线性约束不是由初等函数组成,则必须将非线性函数转换为使用的优化表达式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]因为这个点不满足约束条件。

该图显示了单位圆盘中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,大小(X));创建子图Subplot1 = subplot(1,2,1,“父”,图1);视图([124 34]);网格(“上”);持有%创建曲面冲浪(X, Y, Z,“父”subplot1,“线型”“没有”);%创建轮廓轮廓(X, Y, Z,“父”, subplot1);创建子图Subplot2 = subplot(1,2,2,“父”,图1);视图([234 34]);网格(“上”);持有%创建曲面冲浪(X, Y, Z,“父”subplot2,“线型”“没有”);%创建轮廓轮廓(X, Y, Z,“父”, subplot2);%创建文本箭头注释(图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个对象类型的表面,轮廓。

function handle同时计算任意数量的二维点上的Rosenbrock函数。这向量化加快函数的绘制速度,在其他上下文中可以用于加快函数在多个点上的计算速度。

这个函数 f x 叫做目标函数。目标函数是你想要最小化的函数。的不平等 x 1 2 + x 2 2 1 叫做约束。的集合限制 x 求解器在此基础上搜索最小值。你可以有任意数量的约束条件,它们是不等式或方程。

使用优化变量定义问题

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

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

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

对于这个问题,目标函数和非线性约束都是多项式,可以直接写成优化变量的形式。创建一个名为“x”

X = optimvar(“x”、1、2);

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

Obj = 100*(x(2) - x(1)²)²+ (1 - x(1))²;

创建一个名为概率obj作为目标函数。

问题=优化问题(“目标”、obj);

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

Nlcons = x(1)²+ x(2)²<= 1;

在问题中加入非线性约束。

probo . constraints .circlecons = nlcons;

回顾问题。

显示(概率)
优化问题:求解:x最小化:((100 .* (x(2) - x(1).^2).^2) + (1 - x(1).^2)受制于圆:(x(1). ^2)。^2 + x(2) ^2 <= 1

解决问题

要解决优化问题,请调用解决.这个问题需要一个初始点,它是一个给出优化变量初始值的结构。创建初始点结构x0拥有一个 x 价值的[0 0]

x0。x=[0 0];[sol,fval,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
索尔=带字段的结构:X: [0.7864 0.6177]
Fval = 0.0457
exitflag = OptimalSolution
输出=带字段的结构:迭代:24 funcCount: 34 constrviolation: 0步长:6.9161e-06算法:'内部点' firstorderopt: 2.1625e-08 cgiterations: 4消息:'局部最小值发现满足约束....bestviable: [1x1 struct] objectivederivative: "reverse-AD" constraintderivative: "closed-form" solver: 'fmincon'

检查解决方案

解决方案显示exitflag = OptimalSolution.此退出标志表示解决方案是局部最优。有关试图找到更好的解决方案的信息,请参见当求解器成功时

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

  • 检查报告的不可行性constrviolation字段输出结构。

Infeas = output. contration
Infeas = 0

0的不可行性表示解决方案是可行的。

  • 计算解决方案的不可行性。

Infeas =不可行(nlcons,sol)
Infeas = 0

同样,0的不可行性表示解决方案是可行的。

  • 计算的范数x以确保它小于或等于1。

Nx = norm(sol.x)
Nx = 1.0000

输出结构提供了关于求解过程的更多信息,例如迭代次数(24)、求解器(fmincon)和函数求值的数量(84)。有关这些统计数据的更多信息,请参见公差和停止标准

替代配方的使用fcn2optimexpr

对于更复杂的表达式,为目标函数或约束函数编写函数文件,并使用fcn2optimexpr.例如,非线性约束函数的基础在disk.m文件:

类型磁盘
函数radsqr = disk(x) radsqr = x(1)²+ x(2)²;

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

Radsqexpr = fcn2optimexpr(@disk,x);

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

Rosenexpr = fcn2optimexpr(rosenbrock,x);

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

Convprob =优化问题(“目标”rosenexpr,“约束”,radsqexpr <= 1);

查看新问题。

显示(convprob)
优化问题:求解:x最小化:((100 .* (x(2) - x(1).^2).^2) + (1 - x(1).^2)服从:(x(1).^2)。^2 + x(2) ^2 <= 1

解决新问题。解本质上和以前一样。

[sol,fval,exitflag,output] = solve(convprob,x0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
索尔=带字段的结构:X: [0.7864 0.6177]
Fval = 0.0457
exitflag = OptimalSolution
输出=带字段的结构:迭代:24 funcCount: 34 constrviolation: 0步长:6.9161e-06算法:'内部点' firstorderopt: 2.1625e-08 cgiterations: 4消息:'局部最小值发现满足约束....bestviable: [1x1 struct] objectivederivative: "reverse-AD" constraintderivative: "closed-form" solver: 'fmincon'

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

相关的话题