本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

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

典型优化问题

此示例说明如何使用 Optimization Toolbox™ 求解器求解受约束的非线性问题。该示例展示了典型的工作流:创建目标函数、创建约束、求解问题和检查结果。

要了解如何通过基于问题的方法处理此问题,请参阅基于问题求解有约束非线性问题:

问题表示:Rosenbrock 函数

假定您的问题是要在单位圆盘(即以原点为中心、半径为 1 的圆盘)上对 Rosenbrock 函数

f(x)=100(x2x12)2+(1x1)2,

进行最小化。也就是说,基于数据集 x12+x221,求使函数 f(x) 最小的 x。此问题是最小化具有非线性约束的非线性函数。

注意

Rosenbrock 函数是优化中的标准测试函数。它在点 [1,1] 点达到唯一最小值 0。对于某些算法来说,求最小值是一个挑战,因为函数在深度弯曲的波谷中有一个浅最小值。此问题的解不在 [1,1] 点处,因为该点不满足约束。

以下图窗显示单位圆盘中 Rosenbrock 函数的两个视图。垂直轴采用对数刻度;换句话说,绘图显示 log(1+f(x))。等高线位于曲面图下方。

经过对数尺度变换的 Rosenbrock 函数:两个视图。

 用于生成图窗的代码

函数 f(x) 称为目标函数。目标函数是您要进行最小化的函数。不等式 x12+x221 称为约束。约束限制求解器用于搜索最小值的 x 集。您可以使用任意数量的约束,约束可以是不等式,也可以是方程。

所有 Optimization Toolbox 优化函数都可用于最小化目标函数。要最大化函数 f,请应用优化例程来最小化 –f。有关最大化的详细信息,请参阅对目标进行最大化

使用工具箱语法定义问题

要使用 Optimization Toolbox 软件,请以如下方式表达您的问题:

  1. 以 MATLAB® 语言将目标函数定义为函数文件或匿名函数。此示例使用一个函数文件。

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

目标函数的函数文件

函数文件是包含 MATLAB 命令的文本文件,扩展名为 .m。在任何文本编辑器中创建函数文件,或像此示例中一样使用内置的 MATLAB 编辑器。

  1. 在命令行中输入:

    edit rosenbrock
  2. 在 MATLAB 编辑器中输入:

    %% ROSENBROCK(x) expects a two-column matrix and returns a column vector
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock(x)
    
    f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;

    注意

    rosenbrock 是向量化函数,它可以一次计算多个点处的值。请参阅向量化。向量化函数最适合绘图。对于非向量化版本,请输入:

    %% ROSENBROCK1(x) expects a two-element vector and returns a scalar
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock1(x)
    
    f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
  3. 使用名称 rosenbrock.m 保存文件。

约束的函数文件

约束函数的形式为 c(x) ≤ 0ceq(x) = 0.约束 x12+x221 未采用求解器处理的形式。要使用正确的语法,请将约束重新表示为 x12+x2210

此外,非线性约束的语法会同时返回等式和不等式约束。此示例仅包含一个不等式约束,因此您必须将空数组 [] 作为等式约束函数 ceq 进行传递。

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

  1. 创建一个名为 unitdisk.m 的文件,其中包含以下代码:

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. 保存 unitdisk.m 文件。

运行优化

运行优化有两种方式:

使用 Optimization 工具最小化 Rosenbrock 函数

注意

Optimization 工具会显示警告,说明它将在以后的版本中被删除。有关备选方法,请参阅Optimization App Alternatives

  1. 在命令行中输入 optimtool 启动 Optimization 工具。有关此工具的详细信息,请参阅Optimization 工具

    默认 Solver,即 “fmincon - Constrained nonlinear minimization”,处于选中状态。此求解器适用于此问题,因为 Rosenbrock 函数是非线性的,并且此问题有一个约束。有关选择求解器的详细信息,请参阅优化决策表

    默认 Algorithm,即 “Interior point”,也处于选中状态。

  2. Objective function 框中,输入 @rosenbrock。@ 字符表示文件 rosenbrock.m函数句柄

  3. Start point 框中,输入 [0 0] 以指定 fmincon 开始搜索最小值的初始点。

  4. Nonlinear constraint function 框中,输入 @unitdisk,即 unitdisk.m 的函数句柄。

    请确保您的 Problem Setup and Results 窗格与以下图窗匹配。

  5. Options 窗格中,在 Display to command window(在窗格底部)下,从 Level of display 列表中选择 “iterative”。(如果您没有看到该选项,请点击 Display to command window。)此设置在命令行窗口中显示 fmincon 的进度。

  6. Problem Setup and Results 窗格中的 Run solver and view results 下,点击 Start

以下消息出现在 Run solver and view results 框中:

Optimization running.
Objective function value: 0.04567482475812774
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.
根据您的计算机系统和 Optimization Toolbox 的版本,您的目标函数值可能略有不同。

这条消息告诉您:

  • 由于目标函数的导数在约束允许的方向上接近 0,因此对受约束的最优值的搜索结束。

  • 在要求的准确度内满足约束。

Problem Setup and Results 窗格的底部,最小值点 x 出现在 Final point 下。有关退出消息的详细信息,请参阅退出标志和退出消息

使用命令行方式最小化 Rosenbrock 函数

您可以从命令行运行相同的优化。

  1. 创建用于选择迭代输出和 interior-point 算法的选项。

    options = optimoptions(@fmincon,...
        'Display','iter','Algorithm','interior-point');
  2. options 结构体运行 fmincon 求解器,报告最小值的位置 x 和目标函数达到的值 fval

    [x,fval] = fmincon(@rosenbrock,[0 0],...
        [],[],[],[],[],[],@unitdisk,options)

    六组空方括号表示在此示例中未使用的可选约束。有关语法,请参阅 fmincon 函数参考页。

MATLAB 输出一个包含迭代和优化结果的表。

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,因此对约束下的最优值的搜索结束,并且解在要求的准确度内满足约束。消息中有一些语句包含指向所用词语的详细信息链接。有关这些链接的详细信息,请参阅增强版退出消息

解释结果

命令行窗口中的迭代表显示 MATLAB 如何在单位圆盘中搜索 Rosenbrock 函数的最小值。无论您使用 Optimization 工具还是命令行,该表都是相同的。MATLAB 按如下所示报告最小化过程:

                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    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      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-02
    6      30    1.897216e-01    0.000e+00    2.311e+00    1.147e-01
    7      33    1.513701e-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+00    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.437e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.083e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    1.996e-08    6.916e-06

根据您使用的工具箱版本和计算平台的不同,该表可能有所不同。以下说明适用于上面显示的表。

  • 第一列(标记为 Iter)是从 0 到 24 的迭代编号。fmincon 经过 24 次迭代后收敛。

  • 第二列(标记为 F-count)报告计算 Rosenbrock 函数的累计次数。最后一行显示 F-count 为 84,表明 fmincon 在求解最小值的过程中对 Rosenbrock 函数进行了 84 次计算。

  • 第三列(标记为 f(x))显示目标函数值。最后一个值 0.04567482 是 Optimization 工具的 Run solver and view results 框中报告的最小值,位于命令行窗口中退出消息的末尾。

  • 第四列 Feasibility 对于所有迭代均为 0。此列显示在约束为正的每次迭代中约束函数 unitdisk 的值。由于 unitdisk 的值在所有迭代中均为负数,因此每次迭代都满足约束。

迭代表的其他列在迭代输出中有说明。

另请参阅

相关主题