主要内容

获得最佳可行点

这个例子展示了如何获得最好的可行的时候遇到的fmincon

辅助函数bigtoleft是一个三次多项式目标函数在一个三维的变量x生长迅速的负面的x (1)协调变得消极。其梯度是一个三元素向量。的代码bigtolefthelper函数出现在这个例子

这个例子的约束集的交集内部的两个cones-one指向上,和一个向下。约束函数是一个向量包含每个锥的一个组件。因为这个例子是三维的,约束的梯度是一个3×2矩阵。的代码twoconehelper函数出现在这个例子

创建一个图的使用目标函数通过调用约束的plottwoconecons函数,其代码出现在这个例子

图1 = plottwoconecons;

图包含一个坐标轴对象。坐标轴对象包含x (1) ylabel x(2)包含2类型的对象的表面。

创建选项使用衍生品

要启用fmincon使用客观的梯度和约束梯度,设置适当的选项。选择“sqp”算法。

选择= optimoptions (“fmincon”,“算法”,“sqp”,“SpecifyConstraintGradient”,真的,“SpecifyObjectiveGradient”,真正的);

检查解决方案过程中,返回迭代显示设置选项。

选项。显示=“通路”;

减少使用导数信息

设置初始点x0 = (-1/20, -1/20, -1/20)

x0 = -1/20 *的(1、3);

没有线性约束条件或边界的问题。这些参数设置为[]

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

解决这个问题。

[x, fval eflag,输出]= fmincon (x0, @bigtoleft说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
Iter Func-count Fval可行性步长一阶最优步规范0 1 -1.625000 e 03 0.000 e + 00 1.000 8.250 0.000 e + e + 00 00 e-02 1 3 e-02 -2.490263 0.000 5.449 8.325 1.000 e + e + 00 00 e-02 e-01 2 5 -2.529919 e + 02年0.000 1.000 e + e + 00 00 2.802 2.585 e + e + 00 02 3 7 -6.408576 e + 03 9.472 1.000 e + e + 00 00 1.538 e + 01 1.771 e + 3 4 9 -1.743599 e + 6 5.301 e + 01 1.000 e + 00 5.991 e + 01 9.216 e + 04 5 11 -5.552305 e + 09年1.893 e + 03 1.000 e + 00 1.900 1.761 e + e + 03 07年6 13 -1.462524 5.632 e + e + 15 04 1.000 8.284 5.636 e + e + 00 04 e + 10 7 15 -2.573346 e + 24 1.471 e + 08年1.000 1.471 e + e + 00 08年1.058 e + 17 8 17 -1.467510 e + 41 2.617 e + 13 1.000 e + 00 2.617 e + 13 1.789 e + 28 9 19 -8.716877 e + 72 2.210 e + 24 1.000 e + 00 2.210 e + 24 21 -2.426511 e + e + 49 135 2.387 8.214 1.000 e + e + 44 00 6.596 -4.721413 1.167 e + e + 44 91 11 23 e e + 9.223 + 258 85 1.806 1.000 8.703 e + e + 00 85 e + 173目标函数返回南;尝试一种新的点……12 300 -4.721413 9.223 e + e + 258 85 1.766 e-43 3.779 e + 141 1.806 e + 173可行点较低的目标函数值。解算器过早地停止。fmincon停止,因为它超过了评价函数极限,选项。MaxFunctionEvaluations = 3.000000 e + 02。

检查解决方案和解决方案的过程

检查解决方案,目标函数值,退出国旗,和功能评估和迭代的数量。

disp (x)
1.0 e + 85 * -7.7428 3.9370 0.5363
disp (fval)
-4.7214 e + 258
disp (eflag)
0
disp (output.constrviolation)
9.2225 e + 85

目标函数值小于1 e250,一个负值。约束违反大于1 e85,大量仍在规模小得多的目标函数值。退出旗还显示返回的解决方案是不可行的。

恢复最好的可行点fmincon遇到,连同其目标函数值,显示output.bestfeasible结构。

disp (output.bestfeasible)
x (-2.9297 -0.1813 -0.1652): fval: -252.9919 constrviolation: 0 firstorderopt: 258.5032

bestfeasible点并不是一个好的解决方案,如你所见下一节。它仅仅是最好的可行点fmincon遇到的迭代。在这种情况下,即使bestfeasible不是一个解决方案,这是一个更好的点返回的不可行解。

表([fval; output.bestfeasible.fval],(output.constrviolation; output.bestfeasible.constrviolation),“VariableNames”,(“Fval”“约束违反”),“RowNames”,(“最后一点”“最佳可行”])
ans =2×2表Fval约束违反_______ ____________________最后一点-4.7214 e + 258 9.2225 e + 85最佳可行-252.99 0

改善方案:设置范围

有几种方法可以获得一个可行的解决方案。一种方法是设置范围的变量。

磅= -10 * 1 (3,1);乌兰巴托=磅;[xb, fvalb eflagb outputb] = fmincon (x0, @bigtoleft说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
Iter Func-count Fval可行性步长一阶最优步规范0 1 -1.625000 e 03 0.000 e + 00 1.000 8.250 0.000 e + e + 00 00 e-02 1 3 e-02 -2.490263 0.000 5.449 8.325 1.000 e + e + 00 00 e-02 e-01 2 5 -2.529919 e + 02年0.000 1.000 e + e + 00 00 2.802 2.585 e + e + 00 02 3 7 -4.867942 e + 03 5.782 1.151 1.000 e + e + 00 00 e + 01 1.525 e + 03年4 9 -1.035980 e + 04 3.536 e + 00 1.000 1.387 9.587 e + e + 00 00 e + 03 5 12 -5.270039 7.000 2.143 e + e + 03 00 e-01 4.865 2.804 e + e + 00 02 6 14 -2.538946 e + 03 2.855 e-02 1.000 1.715 2.229 e + e + 00 00 e + 03 7 16 -2.703320 e + 03 2.330 e-02 1.000 e + 00 5.517 e-01 2.521 e + 02 8 19 -2.845099 e + 03 0.000 e + 00 1.000 8.873 1.752 e + e + 00 00 e + 21 -2.896934 e + 03 2.150 e 03 01 9 1.000 e + 00 1.709 e-01 1.608 e + 01十23 -2.894135 e + 03 7.954 e-06 1.000 1.039 2.028 e-02 e + e + 00 00 11 25 -2.894126 e + 03 4.113 e-07 1.000 e + 00 2.312 e 03 2.100 e-01 12 27 -2.894125 e + 03 4.619 e-09 1.000 e + 00 2.450 e-04 1.471 e-04可行点较低的目标函数值。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。

迭代显示显示fmincon是从一个可行点(0)可行性,花几个迭代不可行,达到0可行性,然后小但非零剩余迭代的不可行性。解决了报告,它找到了一个可行的价值低一点除了最后一点xb。查看最后的点和目标函数值和报道可行点较低的目标函数值。

disp (xb)
-6.5000 -0.0000 -3.5000
disp (fvalb)
-2.8941 e + 03
disp (outputb.bestfeasible)
x: [-6.5000 - 2.4500 e-04 -3.5000] fval: -2.8941 e + 03 constrviolation: 4.1127 e-07 firstorderopt: 0.2100

约束违反的bestfeasible点是关于4.113 e -。在迭代显示,这infeasibiliity发生在迭代11。报告目标函数值迭代-2.894126 e3,这是略低于最终的价值-2.894125 e3。最后的不可行性较低和一阶最优性措施。这一点是更好吗?他们几乎是相同的,但是每个点都有一些要求更好。查看解决方案细节,设置显示格式

格式表([fvalb; outputb.bestfeasible.fval],(outputb.constrviolation; outputb.bestfeasible.constrviolation),(outputb.firstorderopt; outputb.bestfeasible.firstorderopt),“VariableNames”,(“功能价值”“约束违反”“一阶最优性”),“RowNames”,(“最后一点”“最佳可行”])
ans =2×3表函数值约束违反一阶最优性_________________ ____________________ ______________________最后一点-2894.12500606454 - 4.61884486213648 e-09 0.000147102542200628最好的可行的-2894.12553454177 - 4.11274929668082 e-07 0.210022995437075

提高解决方案:使用另一种算法

另一种方式来获得一个可行的解决方案是使用“内点”算法,即使没有界限,

磅= [];乌兰巴托= [];选项。算法=“内点”;[xip, fvalip eflagip outputip] = fmincon (x0, @bigtoleft说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
一阶范数的Iter F-count f (x)可行性最优步骤0 1 -1.625000 7.807 0.000 e + e 03 00 e-02 1 2 -2.374253 e-02 0.000 e + 00 5.222 e-01 8.101 e-02 2 3 -2.232989 e + 02年0.000 2.379 e + e + 00 02 2.684 e + 00 3 4 -3.838433 e + 02 1.768 e-01 3.198 e + 02 5.573 e-01 4 5 -3.115565 e + 03 1.810 e-01 1.028 e + 03 4.660 e + 00 5 6 -3.143463 5.734 2.013 e-01 8.965 e + e + 03 01 e-01 6 7 -2.917730 5.231 1.795 e-02 6.140 e + e + 03 01 e-01 7 8 -2.894095 e + 03 0.000 1.821 9.206 e + e + 00 00 e-02 8 9 -2.894107 e + 03 0.000 3.899 2.500 e + e + 00 00 e 03 9 10 -2.894142 e + 03 1.299 e-05 2.136 e 03 1.371 e-02 10 11 -2.894125 e + 03 3.614 e-08 4.070 e 03 1.739 e-05 11 12 -2.894125 e + 03 0.000 e + 00 5.994 e-06 5.832 e-08可行点较低的目标函数值。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。

迭代显示再次显示fmincon到达点,寻找一个解决方案是不可行的,和fmincon再次发出一个消息,它遇到了一个可行的目标函数值较低。

disp (xip)
-6.499999996950366 -0.000000032933162 -3.500000000098132
disp (fvalip)
-2.894124995999976 e + 03
disp (outputip.bestfeasible)
x: [-6.500000035892771 - -7.634107877056255 e-08 -3.500000000245461] fval: -2.894125047137579 e + 03 constrviolation: 3.613823285064655 e-08 firstorderopt: 0.004069724066085

再一次,两个解决方案几乎是相同金宝搏官方网站的,bestfeasible解决方案来自于迭代结束前。最后的解决方案xip有更好的一阶最优性措施和可行性,但bestfeasible解决方案略低的目标函数值和一个不太大的不可行性。

表([fvalip; outputip.bestfeasible.fval],(outputip.constrviolation; outputip.bestfeasible.constrviolation),(outputip.firstorderopt; outputip.bestfeasible.firstorderopt),“VariableNames”,(“功能价值”“约束违反”“一阶最优性”),“RowNames”,(“最后一点”“最佳可行”])
ans =2×3表函数值约束违反一阶最优性_________________ ____________________ ______________________最后一点-2894.12499599998 0 5.99383553128062 e-06最好的可行的-2894.12504713758 - 3.61382328506465 e-08 0.00406972406608475

最后,重置到默认的格式

格式

辅助函数

这段代码创建了bigtolefthelper函数。

函数[f gradf] = bigtoleft (x)%这是一个简单的函数,它生长迅速的负面% x(1)变得消极%f = 10 * x (: 1)。^ 3 + x (: 1)。* x (:, 2)。^ 2 + x (: 3)。* (x (: 1)。^ 2 + x (:, 2) ^ 2);如果nargout > 1 gradf = [30 * x (1) ^ 2 + (2) ^ 2 + 2 * x (3) * (1);2 * x (1) * (2) + 2 * x (3) * (2);x (x (1) ^ 2 + (2) ^ 2)];结束结束

这段代码创建了twoconehelper函数。

函数[c量表gradc gradceq] = twocone (x)%这个约束是两个锥,z > -10 + r%和z < 3 - r测查= [];r =√x (1) ^ 2 + (2) ^ 2);c = (-10 + r×(3);x (3) 3 + r);如果nargout > 2 gradceq = [];gradc = [(1) / r, x / r (1);(2)/ r, x / r (2);1,1];结束结束

这段代码创建了情节的非线性约束的功能。

函数图1 = plottwoconecons%创建图图1 =图;%建立轴axes1 =轴(“父”,图1);视图(-63.5 [18]);网格(“上”);持有(“所有”);%建立极坐标系和两个锥r = linspace (0、6.5、14);th = 2 *π* linspace (0, 1, 40);x = r ' * cos (th);y = r ' * sin (th);z = -10 +√x ^ 2 + y ^ 2);zz = 3-sqrt (x ^ 2 + y ^ 2);%评估目标函数在圆锥表面newxf =重塑(bigtoleft ([x (:), y (,)、z(:))), 14日,40)/ 3000;newxg =重塑(bigtoleft ([x (:), y (,)、z(:))), 14日,40)/ 3000;%创建低冲浪颜色设定的目标冲浪(x, y, z, newxf“父”axes1,“EdgeAlpha”,0.25);%建立与目标设定的颜色上冲浪冲浪(x, y, zz newxg,“父”axes1,“EdgeAlpha”,0.25);轴平等的包含“x”(1)ylabel“x”(2)zlabel“x”(3)结束

另请参阅

相关的话题