主要内容

使用约束的非线性问题优化编辑任务或解决生活

典型的优化问题

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

这个示例中提供了两种方法来解决这个问题。一个使用优化生活编辑任务,一个视觉化的方法。另一种使用MATLAB®命令行,一种基于文本的方法。您还可以使用具体问题具体分析的方法解决这种类型的问题;看到解决约束的非线性问题,具体问题具体分析

问题公式化:。海涅的函数

问题是最小化。海涅的功能

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 。这个问题是一个非线性函数的极小化非线性约束。

请注意

。函数是一个标准测试函数的优化。它有一个独特的0达到最小值点[1]。为一些算法找到最低是一个挑战,因为函数有一个浅最低深深地弯内谷。解决这个问题不是在点[1]因为这一点不满足约束条件。

这个图显示了两个单位圆盘。海涅的功能的观点。纵轴是对数;换句话说,情节显示日志(1 +f(x))。等值线躺在表面之下。

。海涅的函数,对数:两个视图

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

代码生成图

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

所有优化工具箱优化函数最小化目标函数。一个函数最大化f,应用一个优化程序,降到最低f。关于最大化的更多细节,请参阅最大化客观

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

优化住编辑任务让你设置和使用可视化的方法解决问题。

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

    新的生活脚本按钮

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

    优化的任务编辑器:具体问题具体分析(推荐)和solver-based之间做出选择

  3. 选择solver-based任务。

    优化现场编辑任务

  4. 指定的问题类型部分的任务,选择目标>非线性>非线性约束。任务选择解算器fmincon——约束非线性最小化

  5. 包括。海涅的函数作为目标函数。在选择问题数据部分的任务,选择目标函数>本地函数然后单击新…按钮。一个新的本地函数出现在章节任务。

    函数f = objectiveFcn (optimInput)%的例子:%减少。海涅的功能% f = 100 * (y - x ^ 2) ^ 2 + (1 - x) ^ 2%编辑下面的线和你的计算x = optimInput (1);y = optimInput (2);f = 100 * (y - x ^ 2) ^ 2 + (1 - x) ^ 2;结束

    这个函数实现。海涅的功能。

  6. 选择问题数据部分的任务,选择目标函数> objectiveFcn

  7. 将初始点x0 = (0, 0)MATLAB的工作区。插入一个新节以上优化任务通过单击任务,然后单击节休息按钮插入选项卡。在上面的新部分任务,输入以下代码初始点。

    x0 = (0, 0);
  8. 运行部分按按Ctrl + Enter。这一行动的地方x0进入工作区。

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

    目标函数和x0

  10. 选择问题数据部分中,选择约束非线性> >本地函数然后单击新…按钮。一个新的本地函数出现在之前的本地函数。

  11. 编辑新的本地函数如下。

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

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

  13. 监控的解决进展,显示进度部分的任务,选择文本显示>每个迭代。另外,选择客观价值和可行性的阴谋。

    绘制函数迭代显示和客观价值和可行性

  14. 解算器,单击选项按钮在任务的右上角的窗口,并选择运行部分。情节出现在一个单独的图窗口和输出区域。

    通常函数值下降是迭代进行

    迭代的输出区域显示一个表,讨论解释结果

  15. 找出解决方案,看起来顶部的任务。

    解决方案,objectiveValue fmincon归来

    变量的解算器的地方解决方案objectiveValue在工作区中。查看他们的价值观通过插入一个新节打破以下任务,进入这些行。

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

  16. 运行部分按按Ctrl + Enter

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

    了解fmincon过程中获取结果,明白了解释结果

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

    控制和代码

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

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

    这段代码是用来解决问题的代码在命令行上,所述下一个。

在命令行定义和解决问题

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

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

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

有趣的nonlcon输入代表了目标函数和非线性约束函数,分别。

表达你的问题如下:

  1. 用MATLAB语言目标函数,定义为一个函数文件或匿名函数。这个例子使用一个函数文件。

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

一个函数文件是一个文本文件,包含MATLAB命令和扩展。m。在任何文本编辑器创建一个函数文件,或者使用内置的MATLAB编辑在这个例子。

  1. 在命令行输入:

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

    % %。(x)预计一个两列矩阵,并返回一个列向量%输出。函数,它有一个最低%(1,1)的值为0,并严格积极的其他地方。函数f =。f (x) = 100 * (x (:, 2) - x (: 1)。^ 2)。^ 2 + (1 - x (: 1)) ^ 2;

    请注意

    是一个矢量函数,可以计算值几个点。看到向量化。一个矢量函数对策划是最好的。nonvectorized版本,输入:

    % % ROSENBROCK1双元素向量(x)预计,并返回一个标量%输出。函数,它有一个最低%(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] = unitdisk c (x) = x (1) ^ 2 + x (2) ^ 2 - 1;测查= [];
  2. 保存文件unitdisk.m

  3. 创建函数处理目标和约束函数。这些函数句柄指向的函数,解决的方式访问功能。

    有趣= @rosenbrock;nonlcon = @unitdisk;

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

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

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

    0 x0 = [0];
  3. 建立空条目约束,本例中没有使用。

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

通过调用解决问题fmincon

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
一阶范数的Iter F-count f (x)可行性最优步骤0 3 e + 00 1.000000 0.000 2.000 e + e + 00 00 1 13 7.753537 e-01 0.000 1.768 6.250 e + e + 00 00 e-01 2 18 6.519648 e-01 0.000 1.679 9.048 e + e + 00 00 e-01 3 21 5.543209 e-01 0.000 1.203 8.033 e + e + 00 00 e-01 4 24 2.985207 e-01 0.000 9.328 1.790 e + e + 00 00 e-02 5 27 2.653799 e-01 0.000 5.723 2.788 e + e + 00 00 e-02 6 30 1.897216 e-01 0.000 1.147 2.311 e + e + 00 00 33 e-01 7 1.513701 e-01 0.000 e + 00 9.706 e-01 5.764 e-02 8 36 1.153330 e-01 0.000 8.169 1.127 e + e + 00 00 e-02 9 39 1.198058 e-01 0.000 e + 00 1.000 e-01 1.522 e-02 10 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 69 4.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方向所允许的限制,并且约束满足所需的精度。几个短语在消息中包含的更多信息的链接中使用的信息。关于这些链接的更多细节,请参阅增强退出消息

解释结果

迭代表在现场编辑任务输出面积和MATLAB命令窗口显示了MATLAB寻找。海涅的函数的最小值在单位圆盘。你的表可以不同,这取决于工具箱版本和计算平台。以下描述适用于本例所示的表。

  • 第一列,标记Iter迭代数量从0至24。fmincon把24迭代收敛。

  • 第二列,标记F-count报道,累计次数。海涅的功能评估。最后一行显示了一个F-count84年,这表明fmincon评估。84倍的功能的过程中找到一个最小值。

  • 第三列,标记f (x),显示目标函数的值。最终的价值,4.567482依照最小的报道优化跑,最后退出的消息在命令窗口。

  • 第四列,可行性,是0迭代。这一列显示了约束函数的值unitdisk在每个迭代约束条件是积极的。因为的价值unitdisk是负面的迭代,每个迭代满足约束条件。

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

另请参阅

|

相关的话题