matlab 凸二次规划

咋写代码啊 写了几小时结果错了😭

img


感觉网上比较有用的凸二次规划讲解比较少 也可能是我理解不到位 这个式子纯套公式似乎很多地方不太一样

这个可以这么写哦:

sigma = [];%3x3的样本协方差矩阵
mu = []; % 样本均值矩阵
e = [1;1;1];
[x,zmin] = quadprog(sigma,[0;0;0],-mu,-1.15,e,1,[0;0;0])

这样的话,z就是所求规划变量,zmin就是最小的z值

用matlab这样来实现:

clear all
clc
%一般凸二次规划有效集算法
% find 函数——集合中找到符合要求的数值位置
% intersect函数——求两个集合的交集
% setdiff函数——求两集合的差
% union函数——求两集合的并集
% 以下面的例题为例
% min x1^2+x2^2-2*x1-4*x2
% s.t. x1      >=0
%           x2 >=0
%       -x1-x2+1>=0

syms x1 x2
%=============求解任意函数时需要改变的参数=============
f=x1^2+x2^2-2*x1-4*x2;      % CHANGE 1
g=jacobian(f,[x1;x2]);
G=jacobian([g(1);g(2)],[x1,x2]);
%Initial Value x_1 初始值
x_1=[0;0];                  % CHANGE 2—x_1=[1;0] x_1=[0.5;0.5]
%Coefficient Matrix Named A 约束系数矩阵
AM=[1,0,-1;0,1,-1]          % CHANGE 3
%约束条件个数
an=size(AM,2);
%Constant 约束中的常系数
b=[0 0 -1];                 % CHANGE 4
%Initial Available Aggregate 初始有效集
%定义有效集为大于零的数
I=[1 2 0];                  % CHANGE 5—I=[0 2 3] I=[0 0 3]
%======================================================

%用 find 函数找到I中的有效集
I1=find(I);
%Define Matrix A & O 定义A O矩阵
%The Number Of Available Aggregate 有效集个数
n=size(I1,2);
% 其中I1(i)为有效集值
% AM(:,I1(i))为有效集对应的约束矩阵A的分量
A=[];
for i=1:n
    A=[A AM(:,I1(i))];
end
A
%=========================================
%Circulating Body 循环体
k=0;
N=10;
while k<N
X=x_1;
%========================================
%说明
%   在循环赋值中,运用jacobian,subs 函数
%   只有通过重新jacobian 后在subs 赋予新值
%   才可以生效。下述 X,即x_1变化后,必须先
%   g=jacobian,再g=subs 方可生效!
%========================================
g=jacobian(f,[x1;x2]);
g=subs(g,{x1,x2},{X(1),X(2)});
% 将g向量变成列向量
g=g(:)
G=subs(G,{x1,x2},{X(1),X(2)});

O=zeros(n,n);
Ap=[G,-A;A',O]
% bo Denotes Zero Vector In S.t. bo表示约束中的0向量
bgn=size(Ap,1)-2;
bgo=zeros(bgn,1);
bg=[-g; bgo]

%Solvinge Quations 求解方程组
r=inv(Ap)*bg;
rn=size(r,1);
% ================Step 2================
d=r(1:2)
dflag=[0;0];
% ======Step 3======
if d==dflag
    % lemta Vector
    B=r(3:rn);
    lemta=zeros(1,an);
    for i=1:n
        lemta(I1(i))=B(i);
    end
    minlemta=min(lemta);
    if minlemta>=0
        xbest=x_1;
        break;
    else
        %===确定s,并将I(s)=0,即有效集合中排除s===
        for i=1:n
            if lemta(i)==minlemta
               s=i;
               break;
            end
        end
        I(s)=0; 
        %=======================================
        %===重新赋值===
        x_2=x_1;
        %I1=setdiff(I1,s);
        I1=find(I);
        n=size(I1,2);
        A=[];
        for i=1:n
            A=[A AM(:,I1(i))];
        end
        A
        %=============
    end
end
%===End of step3
% ======Step 4======
if d(1)~=dflag(1)|d(2)~dflag(2)
    alf=ones(1,an);
    for i=1:an
        a=AM(:,i);
        if a'*d<0
            alf(i)=(b(i)-a'*x_1)/(a'*d);
        end
    end
    alf
    alfk=min(alf);
    x_2=x_1+alfk*d;
    % ===Step 5===
    if alfk<1
        for i=1:an
            if alf(i)==alfk
                t=i;
                break;
            end
        end
        %确定要并入有效集的值 t
        I(t)=t;
        %==重新赋值==
        %I1=union(I1,t);
        I1=find(I);
        n=size(I1,2);
        A=[];
        for i=1:n
            A=[A AM(:,I1(i))];
        end
        A
        %============
    end
    %=== End of step5

end
% ===end of step 4

x_1=x_2;
k=k+1;
end %End of while

% The Result
disp 'The Best Result:'
xbest
disp 'Correlative Assistant Parameter: '
lemta=lemta'