求解QCQP问题可转化为SQP:
首先理解泰勒展开:
在函数为标量和矢量的情况下分别作出二阶和一阶展开,这里泰勒公式是解QCQP问题的基础
对于标准QCQP:
把目标函数视为一个整体,找到一个dx,使X=Xk+dx的目标函数值缩小,直到目标函数收敛到指定精度,多次迭代,即可解QCQP,这里的关键就是如何求dx
因此,利用泰勒展开式,针对每个X值,求dx
在matlab里简单做了个历程,可供参考:
function [DD,Y,X]=simple_SQP() Q=[2 -3 -1;-3 4 -6;-1 -6 6]; P=[2;3;4]; %%定义QCQP问题中,优化问题的二次项系数: min f=X'*Q*X+P'X; X=[x1 x2 x3]' H=1; b=16; %%二次约束:% st: X'*H*X<=b;>>x1^2+x2^2+x3^2<=16 x0=[2;2.5;2]; %%优化开始点 Y=x0'*Q*x0+P'*x0; X=x0; for i=1:5 Qi=2*Q; Pi=(2*Q*x0+P); A=(2*H*x0)'; B=b-x0'*H*x0; dx=quadprog(Qi,Pi,A,B); %%调用QP求解器,求子问题最优值 x0=x0+dx; %%下一次优化起点 DD(:,i)=dx; y=x0'*Q*x0+P'*x0; Y=[Y y]; X=[X x0]; end end