主要内容

带有二次约束的线性或二次目标

这个例子展示了如何解决具有线性或二次目标和二次不等式约束的优化问题。实例生成并使用了目标函数和约束函数的梯度和Hessian。

二次约束问题

假设您的问题具有这样的形式

最小值 x 1 2 x T x + f T x + c

1 2 x T H x + k T x + d 0

在哪里1≤.假设至少有一个H非零;否则,您可以使用quadproglinprog来解决这个问题。与非零H,约束是非线性的,这意味着fmincon是适当的求解器根据优化决策表

这个例子假设二次矩阵是对称的而又不失一般性。你可以替换一个非对称的H(或)矩阵的等效对称版本H+HT) / 2

如果xN组件,然后而且HN——- - - - - -N矩阵,f而且kN-乘1向量,和c而且d是标量。

目标函数

fmincon语法。假设x而且f都是列向量。(x列向量是初始向量吗x0是列向量。)

函数[y, grady] = quadobj (x, Q, f, c) y = 1/2 * x ' * Q * x + f ' * x + c;如果nargout > 1 grady = Q*x + f;结束

约束函数

为了一致性和易于索引,将每个二次约束矩阵放在一个单元格数组中。类似地,将线性项和常数项放在单元格数组中。

函数[y,yeq,grady,gradyeq] = quadconstr(x,H,k,d) jj =长度(H);% jj是不等式约束的个数Y = 0 (1,jj);i = 1:jj y(i) = 1/2*x'*H{i}*x + k{i}'*x + d{i};结束Yeq = [];如果Nargout > 2 grady = 0(长度(x),jj);i = 1:jj grady(:,i) = H{i}*x + k{i};结束结束Gradyeq = [];

数值例子

假设您有以下问题。

Q = [3,2,1;2 4 0;1 0 5);F = [-24;-48;-130];C = -2;rng默认的%用于再现性%两组随机二次约束:H{1} =画廊(“randcorr”3);%随机正定矩阵H{2} =画廊(“randcorr”3);K {1} = randn(3,1);K {2} = randn(3,1);D {1} = randn;D {2} = randn;

黑森

创建一个黑森函数。拉格朗日的黑森量由方程给出

x x 2 l x λ 2 f x + λ 2 c x + λ 2 c e x

fmincon计算拉格朗日乘子的近似集合λ,并将它们打包到一个结构中。要包含黑森,请使用以下函数。

函数hess = quadhess(x,lambda,Q,H) hess = Q;jj =长度(H);% jj是不等式约束的个数i = 1:jj hess = hess + lambda.ineqnonlin(i)*H{i};结束

解决方案

使用fmincon内点最有效地解决问题的算法。该算法接受您提供的Hessian函数。设置这些选项。

选项= optimoptions(@fmincon,“算法”“内点”...“SpecifyObjectiveGradient”,真的,“SpecifyConstraintGradient”,真的,...“HessianFcn”@ (x,λ)quadhess (x,λ,Q, H));

调用fmincon解决问题。

fun = @(x)quadobj(x,Q,f,c);nonlconstr = @(x)quadconstr(x,H,k,d);X0 = [0;0;0];列向量[x,fval,eflag,output,lambda] = fmincon(fun,x0,...[],[],[],[],[],[], nonlconstr选项);

检查拉格朗日乘子。

lambda.ineqnonlin
Ans = 12.8412 39.2337

两个非线性不等式乘子都是非零的,因此两个二次约束在解处都是有效的。

提供黑森时的效率

带梯度和黑森的内点算法是有效的。查看函数求值的个数。

输出
输出= iterations: 9 funcCount: 10 constrviolation: 0 stepsize: 5.3547 -04 algorithm: ' internal -point' firstorderopt: 1.5851e-05 cgiterations: 0 message: '发现满足约束的局部最小值。优化惠……”

fmincon只需要10个函数求值就能解决问题。

将此结果与没有黑森的解决方案进行比较。

选项。黑森Fcn = []; [x2,fval2,eflag2,output2,lambda2] = fmincon(fun,[0;0;0],...[],[],[],[],[],[], nonlconstr选项);output2
output2 = iterations: 17 funcCount: 22 constrviolation: 0 stepsize: 2.8475e-04 algorithm: ' internal -point' firstorderopt: 1.7680e-05 cgiterations: 0 message: '发现满足约束的局部最小值。优化惠……”

在这种情况下,fmincon大约需要两倍的迭代和函数计算。解决方法万博 尤文图斯在公差范围内是相同的。

二次等式约束的推广

如果你也有二次等式约束,你可以用同样的技巧。问题是一样的,只是有额外的限制

1 2 x T J x + p T x + 0.

方法重新表述约束以使用Jp,变量。的lambda.eqnonlin(我)结构具有相等约束的拉格朗日乘子。

相关的话题