主要内容

获得最佳可行点

这个例子展示了如何获得最佳可行点遇到fmincon

辅助功能bigtoleft三次多项式是三维变量中的目标函数吗x它迅速增长为负x(1)协调变得消极。它的梯度是一个三元素向量。代码bigtoleft辅助函数出现在这个例子到此结束

为该示例设置的约束是两个锥体的内部的交叉点 - 一个指向的,并且一个指向一个指向。约束函数是两个组件向量,其包含每个锥体的一个组件。因为这个例子是三维,所以约束的梯度是3×2的矩阵。代码划线辅助函数出现在这个例子到此结束

通过调用来创建使用目标函数彩色的约束图plottwoconecons函数,其代码出现在这个例子到此结束

图1 = plottwoconecons;

图中包含一个坐标轴。轴包含2个类型为surface的对象。

创建选项以使用衍生品

启用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.894126E3.,它比的最终值略小-2.894125 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

最后,将格式重置为默认值短的

格式短的

辅助功能

此代码创建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 + 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)'结尾

也可以看看

相关的话题