主要内容

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

典型的优化问题

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

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

问题表述:Rosenbrock的函数

问题是最小化RosenBrock的函数

F X = 100. X 2 - X 1 2 2 + 1 - X 1 2

结束了单位圆也就是说,半径1的磁盘以原点为中心。换句话说,找到X这最小化了功能FX在一组 X 1 2 + X 2 2 ≤. 1 。该问题是具有非线性约束的非线性函数的最小化。

笔记

RosenBrock的功能是优化中的标准测试功能。它在该点处具有独特的最小值0[1,1]。发现最小是某些算法的挑战,因为该功能在深度弯曲的山谷内具有浅的最小值。这个问题的解决方案不是目的[1,1]因为那点不满足约束。

此图显示了Rosenbrock的功能在单位磁盘的两个视图。纵轴是对数比例的;换句话说,情节显示日志(1+FX)))。轮廓线位于表面图下方。

RosenBrock的函数,记录:两个视图

生成图的代码

功能FX被称为目标函数。目标函数是你想最小化的函数。的不平等 X 1 2 + X 2 2 ≤. 1 被称为约束。约束限制集合X求解器搜索最少。您可以拥有任何数量的约束,这些约束是不平等或平等。

所有优化工具箱优化功能最小化目标函数。最大化功能F,应用一个优化程序来最小化-F。有关最大化的更多详细信息,请参阅最大化目标

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

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

  1. 属性创建一个新的活动脚本新的直播脚本纽约州文件部分标签。

    新实时脚本按钮

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

    优化实时编辑器任务

  3. 在里面指定的问题类型任务的一部分,选择目标>非线性约束>非线性。任务选择求解器Fmincon - 约束非线性最小化

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

    功能f = ObjectiveFCN(OptiminInput)%的例子:%最小化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) ^2 + x(2)^2 - 1;Ceq = [];结尾
  11. 在里面选择问题数据部分中,选择unitdisk作为约束函数。

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

  12. 监控求解器进度,在显示进度任务的一部分,选择文本显示>每次迭代。另外,选择客观价值及可行性的阴谋。

    迭代显示和客观值和可行性绘图功能

  13. 要运行求解器,请单击“选项”按钮在任务窗口的右上方,并选择运行部分。该曲线显示在单独的数字窗口和输出区域中。

    随着迭代的继续,函数值通常会减少

    输出区域显示了中讨论的迭代表解释结果

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

    解决方案,客观从Fmincon返回

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

    DISP(解决方案);DISP(客观客观)

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

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

    理解这一点粉刺获得结果的过程,见解释结果

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

    控制和代码

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

    %set nondefault solver选项选择= optimoptions (“fmincon”“显示”'iter''plotfcn'......'OptimplotFvalconstr');% 解决[解决方案,目标值] = Fmincon(@ ObjectiveFCN,X0,[],[],[],[],[],[],......@ UnitDisk,选项);

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

在命令行定义和解决问题

在命令行处解决优化问题的第一步是选择一个求解器。咨询优化决策表。对于非线性目标函数和非线性约束的问题,通常您使用粉刺求解器。

咨询粉刺功能参考页面。求解器语法如下。

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

乐趣nonlcon输入分别表示目标函数和非线性约束函数。

表达您的问题如下:

  1. 定义MATLAB语言的目标函数,作为函数文件或匿名功能。此示例使用函数文件。

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

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

  1. 在命令行,输入:

    编辑rosenbrock.
  2. 在Matlab编辑器中,输入:

    %% rosenbrock(x)期望双列矩阵并返回列向量%输出是rosenbrock函数,其最小值值0的%(1,1),并且在其他地方严格呈正。功能f = rosenbrock(x)f = 100 *(x(:,2) -  x(:,1)。^ 2)。^ 2 +(1  -  x(:,1))。^ 2;

    笔记

    rosenbrock.是一个矢量化函数,可以同时计算几个点的值。看向量化。矢量化功能最适合绘制。对于非传输版本,请输入:

    %% rosenbrock1(x)期望两个元素矢量并返回标量%输出是rosenbrock函数,其最小值值0的%(1,1),并且在其他地方严格呈正。功能f = rosenbrock1(x)f = 100 *(x(2) -  x(1)^ 2)^ 2 +(1  -  x(1))^ 2;
  3. 以该名称保存文件rosenbrock.m

约束函数具有表单CX)≤0.或者CEQ.X)= 0。约束 X 1 2 + X 2 2 ≤. 1 不是求解器处理的形式。要具有正确的语法,重新制定约束 X 1 2 + X 2 2 - 1 ≤. 0.

非线性约束的语法返回平等和不等式约束。此示例仅包含不等式约束,因此您必须传递空数组[]作为等式约束函数CEQ.

考虑到这些考虑,为非线性约束写一个函数文件。

  1. 创建一个名为的文件UnitDisk.m.包含下列代码:

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

现在您已定义目标和约束函数,创建另一个粉刺输入。

  1. 创建选项粉刺使用'OptimplotFvalconstr'绘图函数和返回迭代显示。

    选择= optimoptions (“fmincon”......'plotfcn''OptimplotFvalconstr'......“显示”'iter');
  2. 创建初始点。

    x0 = [0 0];
  3. 为此示例不使用的约束创建空条目。

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

通过呼叫来解决问题粉刺

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
一阶规范ITER F COUNT F(x)可行性最优性步骤0 3 1.000000E + 00 0.000E + 00 2.000E + 00 1 13 7.753537E-01 0.000E + 00 6.250E + 00 1.768E-01 2 186.519648E-01 0.000E + 00 9.048E + 00 1.679E-01 3 21 5.543209E-01 0.000E + 00 8.033E + 00 1.2030-01 4 24 2.985207E-01 0.000E + 00 1.790E + 00 9.328E-02 5 27 2.653799E-01 0.000E + 00 2.788E + 00 5.723E-02 6 30 1.897216E-01 0.000E + 00 2.311E + 00 1.147E-01 7 33 1.513701CE-01 0.000E + 00 9.706E-01 5.764E-02 8 36 1.153330E-01 0.000E + 00 1.127E + 00 8.169E-02 9 39 1.198058E-01 0.000E + 00 1.000E-01 1.522E-02 10 42 8.910052E-02 0.000E+0.0.8.378e-01 8.301e-02 11 45 6.771960e-02 0.000e+00 1.365e+00 7.149e-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-01 4.464e-02 15 57 4.964194e-02 0.000e+00 7.913e-02 7.894e-03 16 60 4.955404e-02 0.000e+00 5.462e-03 4.185e-04 17 63 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 69 4.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 Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. x = 0.7864 0.6177 fval = 0.0457

随着迭代的继续,函数值通常会减少

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

解释结果

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

  • 第一列,标记Iter,迭代号为0到24。粉刺拍了24次迭代来融合。

  • 第二列,标记为F计数,报告RosenBrock函数的累积次数进行了评估。最后一行显示了一个F计数84,表明这一点粉刺在寻找最小值的过程中,对Rosenbrock函数进行了84次评估。

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

  • 第四列,可行性,所有迭代都是0。此列显示约束函数的值unitdisk在约束是正的每次迭代。因为价值unitdisk在所有迭代中都是消极的,每次迭代都满足了约束。

中描述了迭代表的其他列迭代显示

也可以看看

|

相关话题