主要内容

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

典型的优化问题

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

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

问题制定:Rosenbrock的函数

问题是最小化Rosenbrock函数

f ( x ) = One hundred. ( 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]因为那个点不满足约束条件。

这张图展示了罗森布罗克在单位圆盘上的功能的两种视图。纵轴是对数缩放的;也就是说,从图中可以看出日志(1 +f(x))。等高线位于地表图之下。

Rosenbrock的函数,log - scaling: Two Views

Rosenbrock函数曲面图陡峭,有曲线。底层的水平曲线有些抛物线。

生成图形的代码

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

所有优化工具箱优化函数都最小化一个目标函数。最大化一个函数f,应用优化例程最小化-f。更多关于最大化的细节,请参见最大化客观

使用定义和解决问题优化住编辑任务

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

  1. 通过单击。创建一个新的实时脚本新的生活的脚本按钮文件部分的首页选项卡。

    新的Live Script按钮

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

    优化Live Editor任务

  3. 指定的问题类型段的任务,选择目标>非线性>非线性约束。任务选择求解器fmincon -受限非线性最小化

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

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

    这个函数实现了Rosenbrock的函数。

  5. 选择问题数据段的任务,选择目标函数> objectiveFcn

  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. 要运行求解器,请单击选项按钮在任务窗口的右上角,并选择运行部分。图出现在单独的图形窗口和输出区。

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

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

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

    解决方案,objectivvaluue从fmincon返回

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

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

  15. 按下运行该节按Ctrl + Enter

    解决方案=[0.7864,0.6177]。objectiveValue = 0.0457。

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

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

    控制和代码

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

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

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

在命令行定义和解决问题

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

查阅fmincon函数引用页面。求解器语法如下。

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)

有趣的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

约束函数的形式c(x)≤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. 为本例没有使用的约束创建空条目。

    一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];

打电话解决问题fmincon

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
Iter f -count一阶Norm f(x)可行性优化步骤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 4 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 6 30 1.897216e-01 0.000e+00 2.788e+00 1.147e- 02 7 33 1.513701e-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.522 1.000 1.198058 e-01 0.000 e + 00 e-01 e-02十42 8.910052 e-02 0.000 e + 00 8.378 e-01 8.301 e-02 11 45 6.771960 e-02 0.000 7.149 1.365 e + e + 00 00 e-02 12 48 6.437664 e-02 0.000 e + 00 1.146 e-01 5.701 e 03 13 51 6.329037 e-02 0.000 e + 00 1.883 e-02 3.774 e 03 14 54 5.161934 e-02 0.000 e + 00 3.016 e-01 4.464 e-02 15 57 4.964194 e-02 0.000 e + 00 7.913 e-02 7.894 e 03 16 60 4.955404 e-02 0.000 e + 00 5.462 e 03 4.185 e-04 17 63 4.954839 e-02 0.000 e + 00 3.993 e 03 2.208 e-05 18 66 1.255 1.318 4.658289 e-02 0.000 e + 00 e-02 e-02 19 694.940 8.006 4.647011 e-02 0.000 e + 00 e-04 e-04 72 4.569141 e-02 0.000 e + 00 3.136 e 03 3.379 e 03 21 75 3.974 6.440 4.568281 e-02 0.000 e + 00 e-05 e-05 22 78 1.084 8.000 4.568281 e-02 0.000 e + 00 e-06 e-07 23 81 2.793 1.601 4.567641 e-02 0.000 e + 00 e-06 e-05 24 84 6.916 2.023 4.567482 e-02 0.000 e + 00 e-08 e-06局部最小值发现,满足约束。优化完成,因为目标函数在可行方向上不下降,在最优性公差的值内,约束条件被满足到约束公差的值内。X = 0.7864 0.6177 fval = 0.0457

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

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

解释结果

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

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

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

  • 第三列,标注f (x),显示目标函数的值。最终的价值,4.567482依照中报告的最小值优化run,并在命令窗口的退出消息的末尾。

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

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

另请参阅

|

相关的话题

Baidu
map