这个例子展示了如何使用优化工具箱™求解器解决一个有约束的非线性问题。该示例演示了典型的工作流:创建目标函数,创建约束,解决问题,并检查结果。
这个例子提供了解决这个问题的两种方法。一个使用优化实时编辑任务,视觉方法。另一个使用matlab®命令行,一种基于文本的方法。您也可以使用基于问题的方法来解决这类问题;看到解决受约束的非线性问题,基于问题。
问题是最小化RosenBrock的函数
结束了单位圆也就是说,半径1的磁盘以原点为中心。换句话说,找到X这最小化了功能F(X)在一组 。该问题是具有非线性约束的非线性函数的最小化。
笔记
RosenBrock的功能是优化中的标准测试功能。它在该点处具有独特的最小值0[1,1]
。发现最小是某些算法的挑战,因为该功能在深度弯曲的山谷内具有浅的最小值。这个问题的解决方案不是目的[1,1]
因为那点不满足约束。
此图显示了Rosenbrock的功能在单位磁盘的两个视图。纵轴是对数比例的;换句话说,情节显示日志(1+F(X)))。轮廓线位于表面图下方。
RosenBrock的函数,记录:两个视图
功能F(X)被称为目标函数。目标函数是你想最小化的函数。的不平等 被称为约束。约束限制集合X求解器搜索最少。您可以拥有任何数量的约束,这些约束是不平等或平等。
所有优化工具箱优化功能最小化目标函数。最大化功能F,应用一个优化程序来最小化-F。有关最大化的更多详细信息,请参阅最大化目标。
这优化Live Editor任务允许您使用视觉方法设置并解决问题。
属性创建一个新的活动脚本新的直播脚本纽约州文件部分家标签。
插入A.优化住编辑任务。单击插TAB,然后在代码部分中,选择任务>优化。
在里面指定的问题类型任务的一部分,选择目标>非线性和约束>非线性。任务选择求解器Fmincon - 约束非线性最小化
。
将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的函数。
在里面选择问题数据任务的一部分,选择目标函数> ObjectiveFCN。
放置初始点x0 = [0; 0]
进入matlab工作区。在上面插入一个新部分优化任务,然后单击部分休息纽约州插标签。在上面的任务上的新部分中,输入初始点的以下代码。
x0 = (0, 0);
按按键运行该部分Ctrl + Enter.。这个行动的地方x0
进入工作区。
在里面选择问题数据任务的一部分,选择初始点(x0) > x0。
在里面选择问题数据部分中,选择约束>非线性>本地功能然后点击新的...按钮。新的本地功能显示在上一个本地功能下方。
编辑新的本地功能如下。
功能[c,ceq] = unitdisk(x) ^2 + x(2)^2 - 1;Ceq = [];结尾
在里面选择问题数据部分中,选择unitdisk
作为约束函数。
监控求解器进度,在显示进度任务的一部分,选择文本显示>每次迭代。另外,选择客观价值及可行性的阴谋。
要运行求解器,请单击“选项”按钮⁝在任务窗口的右上方,并选择运行部分。该曲线显示在单独的数字窗口和输出区域中。
输出区域显示了中讨论的迭代表解释结果。
要找到解决方案,看看任务的顶部。
求解器放置变量解决方案
和objectiveValue
在工作区中。通过在任务下面插入一个新的分段并输入这些行来查看它们的值。
按按键运行该部分Ctrl + Enter.。
理解这一点粉刺
获得结果的过程,见解释结果。
显示代码优化生成解决问题,单击“选项”按钮⁝在任务窗口的右上方,并选择控制和代码。
在任务的底部,出现以下代码。
%set nondefault solver选项选择= optimoptions (“fmincon”那“显示”那'iter'那'plotfcn'那......'OptimplotFvalconstr');% 解决[解决方案,目标值] = Fmincon(@ ObjectiveFCN,X0,[],[],[],[],[],[],......@ UnitDisk,选项);
此代码是用于在命令行中解决问题的代码,如下所述。
在命令行处解决优化问题的第一步是选择一个求解器。咨询优化决策表。对于非线性目标函数和非线性约束的问题,通常您使用粉刺
求解器。
咨询粉刺
功能参考页面。求解器语法如下。
[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
这乐趣
和nonlcon
输入分别表示目标函数和非线性约束函数。
表达您的问题如下:
定义MATLAB语言的目标函数,作为函数文件或匿名功能。此示例使用函数文件。
将约束定义为单独的文件或匿名函数。
函数文件是一个包含MATLAB命令并具有扩展名的文本文件.m
。在任何文本编辑器中创建功能文件,或者使用内置的MATLAB编辑器如此示例中。
在命令行,输入:
编辑rosenbrock.
在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;
以该名称保存文件rosenbrock.m
。
约束函数具有表单C(X)≤0.或者CEQ.(X)= 0。约束 不是求解器处理的形式。要具有正确的语法,重新制定约束 。
非线性约束的语法返回平等和不等式约束。此示例仅包含不等式约束,因此您必须传递空数组[]
作为等式约束函数CEQ.。
考虑到这些考虑,为非线性约束写一个函数文件。
创建一个名为的文件UnitDisk.m.
包含下列代码:
功能[c,ceq] = unitdisk(x) ^2 + x(2)^2 - 1;Ceq = [];
保存文件UnitDisk.m.
。
现在您已定义目标和约束函数,创建另一个粉刺
输入。
创建选项粉刺
使用'OptimplotFvalconstr'
绘图函数和返回迭代显示。
选择= optimoptions (“fmincon”那......'plotfcn'那'OptimplotFvalconstr'那......“显示”那'iter');
创建初始点。
x0 = [0 0];
为此示例不使用的约束创建空条目。
一个= [];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
在所有迭代中都是消极的,每次迭代都满足了约束。
中描述了迭代表的其他列迭代显示。