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
解算器,你必须创建一个黑森州是拉格朗日黑森州。拉格朗日黑森州由下式给出
这里,
是bigtoleft
功能和
是两个锥约束功能。该hessinterior
在辅助函数这个例子结束了计算拉格朗日黑森州在一个点X
采用拉格朗日乘子结构拉姆达
。函数首先进行计算
。然后计算两个约束Hessians
和
,用对应的拉格朗日乘数乘以它们lambda.ineqnonlin(1)
和lambda.ineqnonlin(2)
,并添加它们。从。的定义可以看出twocone
约束功能
,从而简化计算。
启用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;结束