这个例子展示了如何获得最佳可行点遇到fmincon
.
辅助功能bigtoleft
三次多项式是三维变量中的目标函数吗x
它迅速增长为负x(1)
协调变得消极。它的梯度是一个三元素向量。代码bigtoleft
辅助函数出现在这个例子到此结束.
为该示例设置的约束是两个锥体的内部的交叉点 - 一个指向的,并且一个指向一个指向。约束函数是两个组件向量,其包含每个锥体的一个组件。因为这个例子是三维,所以约束的梯度是3×2的矩阵。代码划线
辅助函数出现在这个例子到此结束.
通过调用来创建使用目标函数彩色的约束图plottwoconecons
函数,其代码出现在这个例子到此结束.
图1 = plottwoconecons;
启用fmincon
要使用客观梯度和约束梯度,设置适当的选项。选择“sqp”
算法。
选择= optimoptions (“fmincon”,'算法',“sqp”,...“specifyconstraintgradient”,真的,“SpecifyObjectiveGradient”,真正的);
要检查解决方案过程,设置选项以返回迭代显示。
options.display =.'iter';
设置初始点x0 = (-1/20, -1/20, -1/20)
.
x0 = -1 / 20 * x0(1,3);
这个问题没有线性约束或边界。将这些参数设置为[]
.
一个= [];b = [];Aeq = [];说真的= [];磅= [];UB = [];
解决这个问题。
[x, fval eflag,输出]= fmincon (x0, @bigtoleft...说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
ITER Func-Count FVAL可行性步长规范一阶步骤最优值0 1 -1.625000E-03 0.000E + 00 1.000E + 00 0.000E + 00 8.250E-02 1 3 -2.490263E-02 0.000E + 00 1.000E + 00 8.325E-02 5.449E-01 2 5 -2.529919E + 02 0.000E + 00 1.000E + 00 2.802E + 00 2.585E + 02 3 7 -6.408576E + 03 9.472E + 00 1.000E + 00 1.538E + 01 1.771E + 03 4 9 -1.743599CE + 06 5.301C + 01 1.000 + 00 5.991C + 01 9.216C + 04 5 11 -5.552305C + 09 1.893E + 03 1.000E + 00 1.900E + 03 1.761E + 07 6 13 -1.462524E + 15 5.632E + 04 1.000E + 00 5.636C + 04 8.284E + 10 7 15 -2.573346E + 24 1.471C + 08 1.000E + 00 1.471E + 08 1.058E + 17 817 -1.467510E + 41 2.617E + 13 1.000E + 00 2.617E + 13 1.789E + 28 9 19 -8.716877E + 72 2.210E + 24 1.000E + 00 2.210E + 24 2.387E + 49 10 21-5.598248E+134 4.090E + 44 1.000E + 00 4.090E + 44 4.368E + 90 11 23-5.691634E + 258 1.3552 + 86 1.000 + 00 1.136E + 86 1.967E + 173 12 25 -4.518887E + 258 8.636E+85 1.000E + 00 7.539E + 85 1.766E + 173 13 70 -4.518887E + 258 8.636E + 85 1.070E-07 3.756E + 78 1.766E + 78 1.766E + 173可行点,具有较低的目标函数值。融合到一个不可行的点。Fmincon停止,因为当前步骤的尺寸小于步长公差的值,但是约束不满足约束公差的值。
检查解决方案、目标函数值、退出标志、函数评估和迭代次数。
disp (x)
1.0.0 e+85 * -7.6403 0.4014 -0.9857
disp (fval)
-4.5189e + 258
disp (eflag)
-2
disp (output.constrviolation)
8.6365 e + 85
目标函数值小于-1e250,这是一个非常负的值。约束违背大于1e85,这是一个很大的量,但在大小上仍然比目标函数值小得多。退出标志还表明返回的解决方案是不可行的。
恢复最好的可行点fmincon
遭遇,连同它的目标函数值,显示输出
结构。
DISP(产出.BESTFEASIBLE)
X:[-2.9297 -0.1813-0.1652] FVAL:-252.9919 CONSTRVIOLATION:0 FirstOrderopt:258.5032
的bestfeasible
点不是一个好的解决方案,您将在下一节中看到。这是最可行的一点fmincon
遇到的迭代。在这种情况下,即使bestfeasible
是不可行的解决方案,它比返回的不可行的解决方案要好一点。
表([fval; output.bestfeasible.fval],...[output.constrviroation; output.bestfeasible.constrviolation],...“VariableNames”,[“Fval”“约束违反”],“RowNames”,[“最后一点”“最佳可行”])
ans =.2×2表Fval约束违反 ____________ ____________________ 最后一点-4.5189 e + 258 8.6365 e + 85最佳可行-252.99 0
有几种方法可以获得可行的解决方案。一种方法是在变量上设置界限。
磅= -10 * 1 (3,1);乌兰巴托=磅;[xb, fvalb eflagb outputb] = fmincon (x0, @bigtoleft...说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
Iter funct -count Fval可行性一阶步长范数01 -1.625000e-03 0.000e+00 1.000e+00 1.000e+00 8.250e-02 1 3 -2.490263e-02 0.000e+00 1.000e+00 8.325e-02 5.449e-01 25 -2.529919e+02 1.000e+00 2.80e +00 2.558e +02 3 7 -4.867942e+03 5.782e+00 1.000e+00 1.151e+01 1.525e+03 49 -1.035980e+04 3.536e+00 1.000e+009.587e+00 1.387e+03 5 12 -5.270039e+03 2.143e+00 7.000e-01 4.865e+00 2.804e+02 6 14 -2.538947e+03 2.855e-02 1.000e+00 2.229e+00 1.715e+03 7 16 -2.703320e+03 2.330e-02 1.000e+00 5.517e-01 2.521e+02 8 19 -2.845099e+03 0.000e+00 1.000e+00 1.752e+00 8.873e+01 9 21 -2.896934e+03 2.150e-03 1.000e+00 1.709e-01 1.608e+01 10 23 -2.894135e+03 7.954e-06 1.000e+00 1.039e-02 2.028e+00 11 25 -2.894126e+03 4.113e-07 1.000e+00 2.312e-03 2.100e-01 12 27 -2.894125e+03 4.619e-09 1.000e+00 2.450e-04 1.471e-04 Feasible point with lower objective function value found. 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.
迭代显示屏显示了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.4500e-04 -3.5000] fval: -2.8941e+03 construe: 4.1127e-07 firstderopt: 0.2100
约束违法行为bestfeasible
点是关于4.113E-7
.在迭代显示中,这种不可行性发生在迭代11。在该迭代时报告的目标函数值为-2.89412
6E3.
,它比的最终值略小-2.89412
5 e3
.末点具有较低的不可行性和一阶最优测度。哪一点更好?它们几乎是一样的,但每一点都有一些优点。要查看解决方案的详细信息,请将显示格式设置为长
.
格式长表([fvalb; outputb.bestfeasible.fval],...(outputb.constrviolation; outputb.bestfeasible.constrviolation),...(outputb.firstorderopt; outputb.bestfeasible.firstorderopt),...“VariableNames”,[“函数值”“约束违反”“一阶最优性”],...“RowNames”,[“最后一点”“最佳可行”])
ans =.2×3表函数值约束违背的一阶优化_________________ ____________________ ______________________ Final Point -2894.12500606462 4.61890525826902e-09 0.000147112019817541 Best Feasible -2894.1255345325 4.11267924604886e-07 0.21002297099706
另一种获得可行解的方法是使用“内点”
算法,即使没有边界,
磅= [];UB = [];options.algorithm =“内部点”;[XIP,FVALIP,EFLAGIP,Outputip] = Fmincon(@ BigtoLeft,X0,...说真的,A、b Aeq磅,乌兰巴托,@twocone,选项);
Iter的一阶范数f(x)可行性优化步骤01 -1.625000e-03 0.000e+00 7.807e-02 1 2 -2.374253e-02 0.000e+00 5.222e-01 8.101e-02 23 -2.232989e+02 0.000e+00 2.379e+02 2.684e+00 34 -3.838433e+02 1.768e-01 3.198e+02 5.573e-01 4 5 -3.115565e+03 1.810e-01 1.028e+03 4.660e+00 56 -3.143463e+03 2.013e-01 8.965e+01 5.734e-01 6 7-2.894095e+03 0.000e+00 9.206e+00 1.821e-02 89 -2.894107e+03 0.000e+00 2.500e+00 3.899e-03 10 11 - 2.89412e +03 3.614e-08 4.070e-03 1.739e-05 11 12 - 2.89412e +03 0.000e+00 5.994e-06 5.832e-08找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
反复显示再次显示fmincon
达到在寻求解决方案时不可行的点,并且fmincon
再次发出一个消息,它遇到了一个目标函数值较低的可行点。
DISP(XIP)
-6.499999996950366 -0.000000032933162 -3.500000000098132
disp (fvalip)
-2.894124995999976 e + 03
DISP(Outputip.bestFeasible)
X: [1x3 double] fval: -2.894125047137579e+03 construct: 3.613823285064655e-08 firstderopt: 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.99383553128062e-06最佳可行-2894.12504713758 3.61382328506465e-08 0.00406972406608475
最后,将格式重置为默认值短的
.
格式短的
此代码创建bigtoleft
helper函数。
函数[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 + x(2)^ 2 + 2 * x(3)* x(1);2 * x(1)* x(2)+ 2 * x(3)* x(2);(x(1)^ 2 + x(2)^ 2)];结尾结尾
此代码创建划线
helper函数。
函数[C CEQ Gradc Gradceq] = TwoCone(X)%这个约束是两个锥体,z> -10 + r%和z <3 - rCEQ = [];r = sqrt(x(1)^ 2 + x(2)^ 2);c = [-10 + r-x(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“父”,斧头1,'edgealpha',0.25);%创建上层冲浪与颜色设置的目标冲浪(x,y,zz,newxg,“父”,斧头1,'edgealpha',0.25);轴平等的包含“x”(1)ylabel“x”(2)Zlabel.'x(3)'结尾