Fmincon
带有分析性黑森州的内点算法
此示例显示了如何使用导数信息使解决方案过程更快,更强大。这Fmincon
内点算法可以接受Hessian函数作为输入。当您提供Hessian时,您可以获得更快,更准确的解决方案,以解决约束最小化问题。
辅助功能Bigtoleft
是一个目标函数,随着x(1)
协调变为负。它的梯度是三元素向量。代码Bigtoleft
辅助功能出现在示例的结尾。
此示例的约束设置是两个圆锥体的内饰的交点 - 一个指向,一个指向。约束函数是一个两个组件向量,该向量包含每个锥体的一个组件。因为此示例是三维的,所以约束的梯度是3 by-2矩阵。代码两次
辅助功能出现在示例的结尾。
创建一个使用目标函数颜色的约束图。
%创建数字图1 =图;%创建轴axes1 =轴(轴“父母”,图1);查看([-63.5 18]);网格('上');抓住('全部');%设置极性坐标和两个锥体r = 0:.1:6.5;th = 2*pi*(0:.01:1);x = r'*cos(th);y = r'*sin(th);z = -10+sqrt(x。^2+y。^2);zz = 3-sqrt(x。^2+y。^2);%评估锥体表面的目标功能newxf = reshape(bigtoleft([x(:),y(:),z(:))),66,101)/3000;newxg = reshape(bigtoleft([x(:),y(:),z(:))),66,101)/3000;%创建下部冲浪,并通过目标设置颜色冲浪(x,y,z,newxf,“父母”,axes1,'edgealpha',0.25);%创建上层冲浪,并通过目标设置颜色冲浪(X,Y,ZZ,NEWXG,“父母”,axes1,'edgealpha',0.25);轴平等的
创建Hessian功能
在Fmincon
求解器,您必须创建一个是拉格朗日人的黑森州的黑森州。拉格朗日的黑森州由等式给出
这里,
是个Bigtoleft
功能,以及
是两个圆锥约束功能。这Hessinterior
辅助功能在示例的结尾在某个时候计算Lagrangian的HessianX
使用Lagrange乘数结构兰姆达
。该功能首先计算
。然后,它计算两个约束Hessians
和
,将它们乘以相应的Lagrange乘数lambda.ineqnonlin(1)
和lambda.ineqnonlin(2)
,并添加它们。您可以从两次
约束功能
,这简化了计算。
创建使用衍生品的选项
启用Fmincon
要使用客观梯度,约束梯度和Hessian,您必须设置适当的选项。这Hessianfcn
使用Lagrangian的Hessian的选项仅适用于内点算法。
选项= optimoptions('fmincon',,,,'算法',,,,“内点”,,,,...“指定限制器”,真的,“指定对象级”,真的,...'Hessianfcn',@hessinterior);
使用所有衍生信息最小化
设定初始点x0 = [-1,-1,-1]
。
x0 = [-1,-1,-1];
该问题没有线性约束或界限。将这些论点设置为[]
。
a = [];b = [];aeq = [];beq = [];lb = [];ub = [];
解决这个问题。
[x,fval,eflag,output] = fmincon(@bigtoleft,x0,...a,b,aeq,beq,lb,ub,@twocone,options);
当地最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
检查解决方案和解决方案过程
检查解决方案,目标函数值,退出标志以及功能评估和迭代次数。
disp(x)
-6.5000 -0.0000 -3.5000
disp(FVAL)
-2.8941e+03
disp(eflag)
1
disp([output.funccount,output.Iterations])
7 6
如果您不使用Hessian功能,Fmincon
需要更多的迭代来收敛并需要更多的功能评估。
options.hessianfcn = [];[x2,fval2,eflag2,output2] = fmincon(@bigtoleft,x0,...a,b,aeq,beq,lb,ub,@twocone,options);
当地最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
disp([[output2.funccount,output2.Iterations])
13 9
如果您还不包括梯度信息,Fmincon
进行相同数量的迭代,但需要更多的功能评估。
options.specifyconstraintgradient = false;options.specifyObjectiveGradient = false;[x3,fval3,eflag3,output3] = fmincon(@bigtoleft,x0,...a,b,aeq,beq,lb,ub,@twocone,options);
当地最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
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(:,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)];结尾结尾
此代码创建两次
助手功能。
功能[C CEQ GARGC 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 = [x(1)/r,x(1)/r;x(2)/r,x(2)/r;-1,1];结尾结尾
此代码创建Hessinterior
助手功能。
功能h = hessInterior(x,lambda)h = [60*x(1)+2*x(3),2*x(2),2*x(1);2*x(2),2*(x(1)+x(3)),2*x(2);2*x(1),2*x(2),0];%f的Hessianr = sqrt(x(1)^2+x(2)^2);% 半径rinv3 = 1/r^3;hessc = [(x(2))^2*rinv3,-x(1)*x(2)*rinv3,0;-x(1)*x(2)*rinv3,x(1)^2*rinv3,0;0,0,0];C(1)和C(2)的Hessian%h = h + lambda.ineqnonlin(1)*hessc + lambda.ineqnonlin(2)*hessc;结尾