主要内容

约束非线性问题的应用优化实时编辑器任务或求解器

典型优化问题

此示例演示如何使用优化工具箱™求解器解决受约束的非线性问题。该示例演示了典型的工作流程:创建目标函数,创建约束,解决问题,并检查结果。

本示例提供了解决该问题的两种方法。一个人使用优化Live Editor任务,一种可视化的方法。另一种是使用MATLAB®命令行,基于文本的方法。您也可以使用基于问题的方法来解决这类问题;看到求解一个约束非线性问题,基于问题

问题表述:Rosenbrock函数

问题是如何最小化Rosenbrock函数

f x ) One hundred. x 2 x 1 2 ) 2 + 1 x 1 ) 2

单位圆即以原点为圆心,半径为1的圆盘。换句话说,找到x使函数最小化fx)越过布景 x 1 2 + x 2 2 1 .这个问题是一个带有非线性约束的非线性函数的极小化问题。

请注意

Rosenbrock函数是优化中的标准测试函数。它在该点有一个唯一的最小值0[1].对于一些算法来说,寻找最小值是一个挑战,因为函数在深弯曲的山谷中有一个浅的最小值。这个问题的解决办法还没有找到[1]因为这个点不满足约束条件。

这个图显示了单位圆盘上Rosenbrock函数的两个视图。纵轴为对数刻度;换句话说,情节显示日志(1 +fx)).等高线位于地表图的下方。

Rosenbrock函数,对数缩放:两个视图

Rosenbrock函数曲面图陡且有曲线。下面的水平曲线有点抛物线。

生成图的代码

这个函数fx)叫做目标函数。目标函数是你想要最小化的函数。的不平等 x 1 2 + x 2 2 1 叫做约束。约束条件限制集合x解算器在上面搜索最小值。你可以有任意数量的约束条件,即不等式或等式。

所有优化工具箱的优化函数都最小化一个目标函数。为了使函数最大化f,应用优化例程最小化-f.有关最大化的详细信息,请参见目标最大化

定义并解决问题优化实时编辑任务

优化Live Editor任务允许您使用可视化方法设置和解决问题。

  1. 方法创建一个新的实时脚本新的实时脚本按钮上的文件部份首页选项卡。

    新的实时脚本按钮

  2. 插入一个优化Live Editor任务。单击插入TAB,然后,在代码部分中,选择任务>优化

    优化实时编辑器任务

  3. 指定问题类型部分的任务,选择目标>非线性而且约束条件>非线性.任务选择求解器fmincon -受约束的非线性最小化

  4. 将Rosenbrock函数作为目标函数。在选择问题数据部分的任务,选择目标函数>局部函数然后单击新…按钮。一个新的局部函数出现在任务下面的部分中。

    函数f = objectiveFcn(optimminput)%的例子:最小化Rosenbrock函数。% f = 100*(y - x²)²+ (1 - x)²用你的计算编辑下面的行。x = optimInput(1);y = optimminput (2);F = 100*(y - x^2)^2 + (1 - x)^2;结束

    这个函数实现了Rosenbrock函数。

  5. 选择问题数据部分的任务,选择目标函数> Objective fcn

  6. 放置起始点X0 = [0;0]进入MATLAB工作空间。的上面插入一个新部分优化任务,方法是单击任务,然后单击节休息按钮上的插入选项卡。在任务上面的新部分中,为初始点输入以下代码。

    X0 = [0;0];
  7. 按下键运行该部分按Ctrl + Enter.这个动作x0进入工作区。

  8. 选择问题数据部分的任务,选择初始点(x0) > x0

    目标函数和x0

  9. 选择问题数据部分中,选择约束条件>非线性>局部函数然后单击新…按钮。一个新的局部函数出现在前一个局部函数的下面。

  10. 按以下方式编辑新的本地函数。

    函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];结束
  11. 选择问题数据部分中,选择unitdisk作为约束函数。

    问题数据:目标,初始点,非线性约束

  12. 要监视求解程序的进度,请在显示进度部分的任务,选择文本显示>每次迭代.另外,选择客观价值与可行性为了剧情。

    迭代显示和目标值及可行性图功能

  13. 要运行求解器,请单击options按钮在任务窗口的右上角,并选择运行部分.该图形显示在一个单独的图形窗口和输出区域中。

    随着迭代的进行,函数值通常会减少

    输出区域显示迭代表,在解释结果

  14. 为了找到解决方案,看看任务的顶部。

    从fmincon返回

    求解器放置变量解决方案而且objectiveValue在工作区中。通过在任务下面插入一个新的节分隔符并输入这些行来查看它们的值。

    disp(解决方案);disp (objectiveValue)

  15. 按下键运行该部分按Ctrl + Enter

    解=[0.7864,0.6177]。objectivvalue = 0.0457。

    要了解fmincon获取结果的过程,请参见解释结果

  16. 显示的代码优化生成以解决问题,单击选项按钮在任务窗口的右上角,并选择控制和代码

    控制和代码

    在任务的底部,出现以下代码。

    设置非默认的求解器选项选项= optimoptions(“fmincon”“显示”“通路”“PlotFcn”...“optimplotfvalconstr”);%解决(解决方案,objectiveValue) = fmincon (x0 @objectiveFcn ,[],[],[],[],[],[],...@unitdisk选项);

    此代码是用于解决命令行上的问题的代码,如下所述。

在命令行定义和解决问题

在命令行上解决优化问题的第一步是选择求解器。查阅优化决策表.对于具有非线性目标函数和非线性约束的问题,通常使用fmincon解算器。

查阅fmincon功能参考页面。求解器语法如下所示。

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

有趣的而且nonlcon输入分别表示目标函数和非线性约束函数。

用以下方式表达你的问题:

  1. 在MATLAB语言中定义目标函数,作为函数文件或匿名函数。本例使用函数文件。

  2. 将约束定义为一个单独的文件或匿名函数。

函数文件是包含MATLAB命令并具有扩展名的文本文件.m.在任何文本编辑器中创建一个函数文件,或者使用内置的MATLAB编辑器(如本例所示)。

  1. 在命令行中输入:

    编辑
  2. 在MATLAB编辑器中,输入:

    %% ROSENBROCK(x)需要一个两列矩阵,并返回一个列向量输出是Rosenbrock函数,它的最小值在%(1,1)的值为0,并且在其他地方严格为正。函数F = rosenbrock(x) F = 100*(x(:,2) - x(:,1).^2)。^2 + (1 - x(:,1)).^2;

    请注意

    是一个向量化函数,可以一次计算多个点的值。看到向量化.向量化函数最适合绘图。对于非向量化的版本,输入:

    %% ROSENBROCK1(x)需要一个双元素向量并返回一个标量输出是Rosenbrock函数,它的最小值在%(1,1)的值为0,并且在其他地方严格为正。函数f = rosenbrock1 f (x) = 100 * (x (2) - x (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;
  3. 保存文件名rosenbrock.m

约束函数有这样的形式cx)≤0量表信x) = 0。约束 x 1 2 + x 2 2 1 不是求解器所处理的形式。要获得正确的语法,请将约束重新表述为 x 1 2 + x 2 2 1 0

非线性约束的语法返回等式和不等式约束。此示例只包含一个不等式约束,因此必须传递一个空数组[]作为等式约束函数量表信

记住这些考虑因素,为非线性约束编写一个函数文件。

  1. 创建一个名为unitdisk.m包含以下代码:

    函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];
  2. 保存文件unitdisk.m

既然已经定义了目标函数和约束函数,那么就创建另一个fmincon输入。

  1. 创建选项fmincon要使用“optimplotfvalconstr”图函数和返回迭代显示。

    选项= optimoptions(“fmincon”...“PlotFcn”“optimplotfvalconstr”...“显示”“通路”);
  2. 创建初始点。

    X0 = [0 0];
  3. 为本示例没有使用的约束创建空条目。

    A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];

通过打电话来解决问题fmincon

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Iter f -count f(x)一阶Norm可行性优化步骤03 1.000000e+00 0.000e+00 2.000e+00 1.768e-01 0.000e+00 6.250e+00 1.768e-01 2 18 6.519648e-01 0.000e+00 9.048e+00 1.679e-01 3 21 5.543209e-01 0.000e+00 8.033e+00 1.679e-01 3 24 2.985207e-01 0.000e+00 1.790e+00 9.790e +00 1.2023e -02 4 24 2.653799e-01 0.000e+00 2.788e+00 5.723e-02 5 27 1.897216e-01 0.000e+00 2.788e+00 1.147e- 02 6 30 1.13701e -01 0.000e+00 9.706e-01 5.764e-02 8 36 1.153330e +00 0.000e+00 1.127e+00 8.169e-02 9 391.198058e-01 0.000e+00 1.000e-01 1.522e-02 10 42 8.910052e-02 0.000e+00 8.378e-01 8.301e-02 12 48 6.437664e-02 0.000e+00 1.146e-01 5.701e-03 13 51 6.329037e-02 0.000e+00 1.883e-02 3.774e-03 14 54 5.161934e-02 0.000e+00 3.016e- 02 4.464e-02 0.000e+00 7.913e-02 7.894e-03 16 60 4.954839e-02 0.000e+00 3.993e-03 2.208e-05 18 66 4.658289e-02 0.000e+00 1.318e-02 1.255e-02 19 694.647011e-02 0.000e+00 8.006e-04 4.940e-04 20 72 4.569141e-02 0.000e+00 3.136e-03 3.379e-03 21 75 4.568281e-02 0.000e+00 6.440e-05 3.974e-05 22 78 4.568281e-02 0.000e+00 8.000e-06 1.084e-07 23 81 4.567641e-02 0.000e+00 1.601e-06 2.793e-05 24 84 4.567482e-02 0.000e+00 2.023e-08 6.916e-06发现满足约束的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。X = 0.7864 0.6177 fval = 0.0457

随着迭代的进行,函数值通常会减少

退出消息告诉您,由于目标函数的导数在约束允许的方向上接近于0,因此搜索受约束的最优值结束了,并且约束满足了所需的精度。邮件中的几个短语包含了关于邮件中使用的术语的更多信息的链接。有关这些链接的详细信息,请参见增强的退出消息

解释结果

实时编辑器任务输出区和MATLAB命令窗口中的迭代表显示了MATLAB如何在单元磁盘中搜索Rosenbrock函数的最小值。根据工具箱版本和计算平台的不同,您的表可能有所不同。以下描述适用于本例中所示的表。

  • 第一列,标记Iter,为从0到24的迭代次数。fmincon需要24次迭代才能收敛。

  • 第二列,标记F-count,报告了Rosenbrock函数被评估的累积次数。最后一行是anF-count84分之一,表明fmincon在寻找最小值的过程中,对Rosenbrock函数求了84次值。

  • 第三列,标记f (x),显示目标函数的值。最后的值,4.567482依照的最小值优化运行,并在命令窗口的退出消息的末尾。

  • 第四列,可行性对于所有迭代,为0。这一列显示约束函数的值unitdisk在约束为正的每次迭代中。因为unitdisk在所有迭代中为负,每次迭代都满足约束。

迭代表的其他列描述在迭代显示

另请参阅

|

相关的话题