主要内容

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);轴平等的

图包含一个轴对象。轴对象包含2个类型表面对象。

创建Hessian功能

Fmincon求解器,您必须创建一个是拉格朗日人的黑森州的黑森州。拉格朗日的黑森州由等式给出

X X 2 l (( X ,,,, λ = 2 F (( X + λ 一世 2 C 一世 (( X + λ 一世 2 C e 一世 (( X

这里, F (( X 是个Bigtoleft功能,以及 C 一世 (( X 是两个圆锥约束功能。这Hessinterior辅助功能在示例的结尾在某个时候计算Lagrangian的HessianX使用Lagrange乘数结构兰姆达。该功能首先计算 2 F (( X 。然后,它计算两个约束Hessians 2 C 1 (( X 2 C 2 (( X ,将它们乘以相应的Lagrange乘数lambda.ineqnonlin(1)lambda.ineqnonlin(2),并添加它们。您可以从两次约束功能 2 C 1 (( X = 2 C 2 (( X ,这简化了计算。

创建使用衍生品的选项

启用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;结尾

相关话题