主要内容

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

典型优化问题

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

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

问题公式: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. 插入一个优化实时编辑器任务。单击插入TAB,然后在代码部分中,选择任务>优化

    优化实时编辑器任务

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

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

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

    这个函数实现了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. 要找到解决方案,请查看任务的顶部。

    解决方案,objectivvalue从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(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)可行性优化步骤03 1.000000e+00 0.000e+00 2.000e+00 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 -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 36 1.153330e-01 0.000e+00 1.127e+00 8.169e-02 9 391.198058e- 02 0.000e+00 1.000e-01 1.301e -02 11 45 6.771960e-02 0.000e+00 1.146e-01 5.701e-03 12 48 6.437664e-02 0.000e+00 1.146e-01 3.774e-03 14 54 5.964194e -02 0.000e+00 3.913e -01 4.464e-02 0.000e+00 7.913e-02 4.894e -02 16 60 4.955404e-02 0.000e+00 3.993e-03 4.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,因此对约束最优的搜索已经结束,并且约束满足了所需的精度。邮件中的几个短语包含有关邮件中使用的术语的更多信息的链接。有关这些链接的详细信息,请参见增强的退出消息

解释结果

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

  • 第一列,标记Iter,为0 ~ 24的迭代数。fmincon花了24次迭代才收敛。

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

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

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

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

另请参阅

|

相关的话题