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

77 lines
2.1 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function p = pwaproj(h,w)
if prod(size(h))>1
error('pwaproj is currently only applicable to scalars');
end
hvars = getvariables(h);
wvars = getvariables(w);
basis = getbase(h);
coefficients = basis(2:end);
Complicating = find(ismember(hvars,yalmip('extvariables')));
if length(Complicating)==length(hvars)
LinearTerm = 0;
else
NonComplicating = find(~ismember(hvars,yalmip('extvariables')));
LinearwIndex = find(ismember(hvars,wvars));
NonComplicating = setdiff(NonComplicating,LinearwIndex);
LinearTerm = recover(hvars(NonComplicating))'*coefficients(NonComplicating)';
if isempty(LinesarwIndex)
Linearw = 0;
else
Linearw = recover(hvars(LinearwIndex))'*coefficients(LinearwIndex)';
end
end
if isempty(Complicating)
p = h;
return
end
basis = getbase(h);
coefficients = basis(2:end);
totalobjective = 0;
totalF = [];
allz = [];
allargs = [];
if ~isempty(Complicating)
for i = 1:length(Complicating)
extstruct = yalmip('extstruct',hvars(Complicating(i)));
[properties{i},F{i},arguments{i}]=model(recover(hvars(Complicating(i))));
if intersect(depends(arguments{i}),wvars)
RequiresEpi(i) = 1;
z = sdpvar(size(arguments{i},1),size(arguments{i},2));
allz = [allz;z];
allargs = [allargs;arguments{i}];
extstruct.arg{1} = z;
t = feval(properties{i}{1}.name,z);
f = eval(['@' properties{i}{1}.name]);
t = f(extstruct.arg{1:end-1});
[dummy{i},thisF]=model(t);
totalF = totalF + thisF;
totalobjective=coefficients(Complicating(i))*t+totalobjective;
else
LinearTerm = LinearTerm + recover(hvars(Complicating(i)))'*coefficients(Complicating(i))';
end
end
end
sdpvar t
totalF = [totalF, totalobjective < t];
P = projection([totalF,t<1234],[allz;t]);
P = full(getbase(P));
b = P(:,1);
A = P(:,2:end);
rmv = find(A(:,end)== 0);
A(rmv,:)=[];
b(rmv) = [];
rmv = find(abs(b-1234)<1e-8);
A(rmv,:)=[];
b(rmv) = [];
p = basis(1)+LinearTerm+max((A(:,1:end-1)*allargs-b)./A(:,end));