咋写代码啊 写了几小时结果错了😭
这个可以这么写哦:
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'