Dynamic-Calibration/utils/YALMIP-master/@sdpvar/quaddecomp.m

88 lines
2.2 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function [Q,c,f,x,info] = quaddecomp(p,z)
%QUADDECOMP Internal function to decompose quadratic expression
[n,m]=size(p);
info = 0;
% Is it a scalar
if (n*m==1)
% Involved in polynomial expression
[mt,variabletype] = yalmip('monomtable');
x_lin = getvariables(p);
x_var = find(any(mt(x_lin,:),1));
if nargin==2
x_var = union(x_var,depends(z));
end
x = recover(x_var);
if all(variabletype(x_lin) ==0)% is(p,'linear')
n = length(x);
Q = spalloc(n,n,0);
fc = getbase(p);
f = fc(1);
if nargin==2
vars = getvariables(p);
c = zeros(length(x),1);
for i = 1:length(vars)
c(find(vars(i)==x_var)) = fc(1+i);
end
else
c = fc(2:end);c=c(:);
end
return
end
variabletype = variabletype(x_lin);
if all(variabletype<=2)
base = getbase(p);
if nnz(base(1))==0
f = 0;
base = base(2:end);
else
f = base(1);
base = base(2:end);
end
mt = mt(x_lin,x_var);
quads = find (variabletype == 2);
bilins = find (variabletype == 1);
linears = find (variabletype == 0);
[varsC,aux1,aux2] = find(mt(linears,:)');
[varsQ,aux1,aux2] = find(mt(quads,:)');
[varsB,aux1,aux2] = find(mt(bilins,:)');
if isempty(varsQ)
varsQ = [];
end
if isempty(varsB)
varsB = [];
end
if isempty(varsC)
varsC = [];
end
c = sparse(varsC,1,base(linears),length(x),1);
ii = [varsQ ; varsB(1:2:end) ; varsB(2:2:end)];
jj = [varsQ ; varsB(2:2:end) ; varsB(1:2:end)];
kk = [base(quads) base(bilins)/2 base(bilins)/2];
Q = sparse(ii,jj,kk,length(x),length(x));
else
if nargout==5
info = 1;
Q = [];
c = [];
f = [];
x = [];
else
error('Function is not quadratic');
end
end
else
if nargout==5
info = 1;
Q = [];
c = [];
f = [];
x = [];
else
error('Function is not scalar');
end
end