主要内容

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

典型的优化问题

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

笔记:

如果你的目标函数或非线性约束不是由初等函数,则必须使用非线性函数转换为优化表达式fcn2optimexpr请参阅本示例的最后一部分,使用fcn2optimexpr替代配方, 要么将非线性函数转换为优化表达式

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

问题公式化:罗森布罗克函数

考虑最小化罗森布罗克函数的问题

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))%矢量化函数图1 =图(“位置”[1 200 600 300]);Colormap('灰色的');轴广场;R = 0: .002:1;TH = 2 *π* (0:.002:1);X = R ' * cos (TH);Y = R ' * sin (TH);Z = log(1 + rosenbrock([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]);标题(“Rosenbrock法的功能:两种观点”)举行

图中包含2个轴。轴线1包含曲面、轮廓两种对象。轴2标题罗森布罗克的功能:两个视图包含两个对象的类型表面,轮廓。

功能手柄在任何数量的2-d点计算一次的ROSENBROCK的功能。这向量化加快了函数的绘图速度,并且在其他环境中可以用于在多个点上加快函数的计算速度。

这个函数 F X 被称为目标函数。目标函数就是你想要最小化的函数。的不平等 X 1 2 + X 2 2 ≤. 1 被称为约束。约束限制的集合 X 求解器在上面寻找最小值。你可以有任意数量的约束条件,也就是不等式或方程。

定义问题使用优化变量

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

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

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

对于这个问题,无论是目标函数和约束非线性多项式是,这样你就可以在优化变量方面直接写表达式。创建一个名为2-d优化变量“x”

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

创建目标函数作为优化变量的多项式。

OBJ = 100 *(X(2) -  X(1)^ 2)^ 2 +(1  -  X(1))^ 2;

创建一个名为优化问题概率obj.作为目标函数。

概率= optimproblem ('客观的',OBJ);

在优化变量中创建一个多项式的非线性约束。

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

包括问题的非线性约束。

prob.Constraints.circlecons = nlcons;

回顾这个问题。

秀(概率)
OptimizationProblem:求解: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];[溶胶,fval exitflag、输出]=解决(x0概率)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
索尔=结构体字段:X:[0.7864 0.6177]
fval = 0.0457
exitflag = OptimalSolution
输出=结构体字段:第一个迭代:24 funcCount: 34 construct: 0 stepsize: 6.9161e-06 algorithm: ' internal -point' firstderopt: 2.1625e-08 cgiterations: 4 message: '…* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

检查解决方案

该解决方案展示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 + X(2)^ 2;

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

radsqexpr = fcn2optimexpr(@磁盘,X);

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

rosenexpr = fcn2optimexpr(Rosenbrock法,X);

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

convprob = optimproblem('客观的',rosenexpr,“约束”radsqexpr < = 1);

查看新的问题。

显示(convprob)
OptimizationProblem:求解:X最小化:anonymousFunction2(x)其中:anonymousFunction2 = @(X)100 *(X(:,2)-x(:,1)^ 2)^ 2 +(1-X(:,1))^ 2。受制于:磁盘(X)<= 1

解决新问题。解决方案基本上和之前一样。

[溶胶,FVAL,exitflag,输出] =解决(convprob,X0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
索尔=结构体字段:X:[0.7864 0.6177]
fval = 0.0457
exitflag = OptimalSolution
输出=结构体字段:第一个迭代:24 funcCount: 84 construct: 0 stepsize: 6.9162 -06 algorithm: ' internal -point' firstderopt: 2.4373e-08 cgiterations: 4 message: '…最佳可行:[1x1 struct] objective - derivative:“有限差分”constraint - derivative:“有限差分”solver:“fmincon”

有关支持的函数列表,请参阅万博1manbetx万博1manbetx在优化变量和表达式支持的操作

相关的话题