fmincon带解析Hessian的内点算法

这个示例展示了如何使用派生信息使解决过程更快、更健壮。该fmincon内点法可以接受的Hessian函数作为输入。当您提供的黑森州,你可以获得更快,更准确地解决了约束最小化问题。

助手功能bigtoleft是长为迅速负的目标函数X(1)协调变得消极。它的梯度是一个三元素向量。该代码bigtoleft的帮助函数出现这个例子结束了

用于该示例的约束集是两个锥体,一个朝上,和一个朝下的内部的交叉点。约束函数是包含用于每个锥形一个组件的两个成分的矢量。因为这个例子中是三维的,该约束的梯度为3×2的矩阵。该代码twocone的帮助函数出现这个例子结束了

创建约束的图形,使用目标函数着色。

%创建人物图1 =图;%建立轴axes1 =轴(“父”,图1);视图(-63.5 [18]);网格('上');保持('所有');%建立极坐标和两个圆锥r = 0: .1:6.5;th = 2 *π* (0:.01:1);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(:)]),66101)/ 3000;newxg =重塑(bigtoleft([X(:),Y(:),Z(:)]),66101)/ 3000;%创建的对象颜色设定下冲浪冲浪(x, y, z, newxf“父”,axes1,'EdgeAlpha', 0.25);%创建的对象色组上冲浪冲浪(X,Y,ZZ,newxg,“父”,axes1,'EdgeAlpha', 0.25);轴等于

创建黑森函数

的二阶导数信息fmincon解算器,你必须创建一个黑森州是拉格朗日黑森州。拉格朗日黑森州由下式给出

X X 2 大号 X λ = 2 F X + Σ λ 一世 2 C 一世 X + Σ λ 一世 2 C Ë q 一世 X

这里, F X bigtoleft功能和 C 一世 X 是两个锥约束功能。该hessinterior在辅助函数这个例子结束了计算拉格朗日黑森州在一个点X采用拉格朗日乘子结构拉姆达。函数首先进行计算 2 F X 。然后计算两个约束Hessians 2 C 1 X 2 C 2 X ,用对应的拉格朗日乘数乘以它们lambda.ineqnonlin(1)lambda.ineqnonlin(2),并添加它们。从。的定义可以看出twocone约束功能 2 C 1 X = 2 C 2 X ,从而简化计算。

创建选项使用衍生工具

启用fmincon使用目标梯度,梯度约束和黑森州,必须设置相应的选项。该HessianFcn用拉格朗日黑森州选项仅适用于内点算法是可用的。

选择= optimoptions (“fmincon”“算法”“内点”...“SpecifyConstraintGradient”,真正,“SpecifyObjectiveGradient”,真正,...“HessianFcn”, @hessinterior);

最小化使用所有的导数信息

设置初始点X0 = [ - 1,-1,-1]

x0 = (1 1 1);

这个问题没有线性约束或界限。将这些参数设置为[]

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

解决这个问题。

[X,FVAL,EFLAG,输出] = fmincon(@ bigtoleft,X0,...A,B,AEQ,BEQ,LB,UB,@ twocone,选项);
当地最低发现满足的约束。优化完成,因为目标函数非递减的可行方向,以最优的公差值的范围内,并且约束约束公差值内满意。

检查解决方案和解决过程

检查解决方案、目标函数值、退出标志以及函数评估和迭代的次数。

DISP(x)的
-6.5000 -0.0000 -3.5000
DISP(FVAL)
-2.8941 e + 03
disp (eflag)
1
DISP([output.funcCount,output.iterations])
7 6

如果你不使用黑森州功能,fmincon需要更多的迭代来收敛,需要更多的函数计算。

选项。HessianFcn = [];(x2, fval2 eflag2 output2] = fmincon (x0, @bigtoleft...A,B,AEQ,BEQ,LB,UB,@ twocone,选项);
当地最低发现满足的约束。优化完成,因为目标函数非递减的可行方向,以最优的公差值的范围内,并且约束约束公差值内满意。
DISP([output2.funcCount,output2.iterations])
13日9

如果您还没有包括梯度信息,fmincon采取迭代次数相同,但需要更多的功能评估。

options.SpecifyConstraintGradient = FALSE;options.SpecifyObjectiveGradient = FALSE;[X3的,fval3,eflag3,输出3] = fmincon(@ bigtoleft,X0,...A,B,AEQ,BEQ,LB,UB,@ twocone,选项);
当地最低发现满足的约束。优化完成,因为目标函数非递减的可行方向,以最优的公差值的范围内,并且约束约束公差值内满意。
DISP([output3.funcCount,output3.iterations])
43 9

辅助函数

此代码创建的bigtoleft助手功能。

函数[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 *×(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)];结束结束

此代码创建的twocone助手功能。

函数并[c CEQ gradc gradceq] = twocone(x)的%这种约束是两个锥体,Z> -10 + R%,且z <3  -  R的CEQ = [];R = SQRT(X(1)^ 2 + X(2)^ 2);C = [-10 + R-X(3);X(3)-3 + R];如果[];gradc = [(1) / r, x / r (1);(2) / r, x / r (2);1,1];结束结束

此代码创建的hessinterior助手功能。

函数h = hessinterior (x,λ)h = [60 * x (1) + 2 * x (3), 2 * x (2), 2 * x (1);2 * x (2), 2 * (x (1) + (3)), 2 * x (2);2 * x (1), 2 * x (2), 0);%F的黑森州r =√x (1) ^ 2 + (2) ^ 2);%半径rinv3 = 1 / r ^ 3;hessc = [(x (2)) ^ 2 * rinv3, x - x (1) * (2) * rinv3, 0;x - x (1) * (2) * rinv3, x (1) ^ 2 * rinv3, 0;0, 0, 0);两个%的C的Hessian(1)和c(2)H = H + lambda.ineqnonlin(1)* + hessc lambda.ineqnonlin(2)* hessc;结束

相关的话题