主要内容

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

典型的优化问题

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

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

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

问题是最小化罗森布罗克函数

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

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

请注意

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

该图显示了Rosenbrock在单位磁盘中的功能的两个视图。纵轴为对数比例;换句话说,情节显示日志(1 +fx)).等高线在平面图下面。

罗森布罗克函数,对数缩放:两个视图

生成图形的代码

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

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

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

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

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

    新增实时脚本按钮

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

    优化Live Editor任务

  3. 指定的问题类型部分的任务,选择目标>非线性>非线性约束.任务选择求解器约束非线性极小化

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

    函数f = objectiveFcn (optimInput)%的例子:%最小化罗森布罗克函数% f = 100*(y - x)^2 + (1 - x)^2用你的计算编辑下面的行x = optimInput (1);y = optimInput (2);F = 100*(y - x)^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;[];结束
  11. 选择问题数据部分中,选择unitdisk作为约束函数。

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

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

    迭代显示和目标值及可行性图函数

  13. 要运行求解器,请单击选项按钮在任务窗口的右上方,然后选择运行部分.绘图显示在单独的图形窗口和输出区域中。

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

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

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

    从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 = 100*(x(:,2) - x(:,1).^2)^2 + (1 - x(:,1))

    请注意

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

    %% 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;[];
  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(x)可行性优化步骤03 1.000000e+00 0.000e+00 2.000e+00 1 13 7.753537e-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.203e-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- 01 6 301.897216e-01 0.000e+00 2.311e -01 1.147e-01 7 33 1.13701e -01 0.000e+00 9.706e-01 5.764e-02 8 36 1.153330e-01 0.000e+00 1.127e - 00 8.1600e -02 9 39 1.198058e-01 0.000e+00 1.000e-01 1.1600e -02 10 42 8.91005e -02 0.000e+00 8.378e-01 8.301e-02 11 45 6.771960e-02 0.000e+00 1.365e -01 7.149e-02 12 48 6.437664e-02 0.000e+00 1.146e-01 5.701e- 02 13 516.329037e-02 0.000e+00 1.318e-02 3.774e- 02 14 54 4.161934e -02 0.000e+00 3.016e-01 4.464e-02 16 60 4.95540e -02 0.000e+00 5.462e-03 4.185e- 02 2.208e-05 18 66 4.658289e-02 0.000e+00 1.318e-02 1.255e-02 19 69 4.94011e -02 0.000e+00 8.006e-04 4.940e-04 20 724.568281e-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,并且约束满足所需的精度,因此对约束最优值的搜索就结束了。邮件中的几个短语包含了链接,指向邮件中使用的术语的更多信息。有关这些链接的详细信息,请参见增强退出消息

解释结果

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

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

  • 第二列,标记F-count,报告了累计评估罗森布罗克功能的次数。最后一行显示了一个F-count84个,表明fmincon在寻找最小值的过程中,对罗森布罗克函数求了84次值。

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

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

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

另请参阅

|

相关的话题