Dynamic-Calibration/utils/YALMIP-master/extras/derivedualBoundsParameterFr...

102 lines
2.5 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function [dualUpper,L,U] = derivedualBoundsParameterFree(H,c,A,b,E,f,ops,parametricDomain)
if isempty(A)
dualUpper = [];
L = [];
U = [];
return
end
n = length(c);
m = length(b);
me = length(f);
x = sdpvar(n,1);
Lambda = sdpvar(m,1);
mu = sdpvar(me,1);
% Homogenization
alpha = sdpvar(1);
F = [];
% Start by computing primal lower bounds
if nargin < 7
ops = sdpsettings('verbose',0);
end
ops2 = ops;
ops2.verbose = max(0,ops.verbose-1);;
all_bounded = 1;
if ops.verbose
disp(['*Computing ' num2str(length(x)) ' primal bounds (required for dual bounds)']);
end
z = recover(unique([depends(c);depends(b)]));
xz = [x;z];
nz = length(z);
nTOT = n + length(z);
rhs = 0;
if ~isempty(b)
rhs = rhs + A'*Lambda;
end
if ~isempty(f)
rhs = rhs + E'*mu;
end
[c0,C] = deParameterize(c,z);
[b0,B] = deParameterize(b,z);
delta = binvar(length(b),1);
UpperBound = .1;
parametricDomainH = homogenize(sdpvar(parametricDomain),alpha) >= 0;
w1 = binvar(length(Lambda),1);
w2 = binvar(length(Lambda),1);
eta1 = sdpvar(length(Lambda),1);
eta2 = sdpvar(length(Lambda),1);
v = sdpvar(size(A,2),1);
Model = [parametricDomainH,H*x + alpha*c0 + C*z + rhs==0,
delta >= Lambda >= 0,
1-delta >= b0*alpha+B*z-A*x>=0,
sum(Lambda) >= alpha*UpperBound,
% sum(delta)<=1,
];
Model = [Model, Lambda + A*v + eta2-eta1 == 0,
0 <= eta1 <= w1, 0 <= delta - Lambda <= 1-w1,
0 <= eta2 <= w2, 0 <= Lambda <= 1-w2];
solvesdp(Model,-alpha)
while double(alpha) >= 1e-5
UpperBound = UpperBound*1.1;
Model = [parametricDomainH,H*x + alpha*c0 + C*z + rhs==0,
delta >= Lambda >= 0,
1-delta >= b0*alpha+B*z-A*x>=0,
sum(Lambda) >= alpha*UpperBound];
Model = [Model, Lambda + A*v + eta2-eta1 == 0,
0 <= eta1 <= w1, 0 <= delta - Lambda <= 1-w1,
0 <= eta2 <= w2, 0 <= Lambda <= 1-w2];
solvesdp(Model,-alpha);
end
dualUpper = min(U,UpperBound);
function [c0,C] = deParameterize(c,z);
n = length(c);
c0C = full(getbase(c));
c0 = c0C(:,1);
C = c0C(:,2:end);
if nnz(C)==0
C = spalloc(n,length(z),0);
else
if length(z)>0 & size(C,2) < length(z)
C = [];
for i = 1:length(z)
C = [C getbasematrix(c,getvariables(z(i)))];
end
end
end
if isempty(C)
C = zeros(length(C),length(z));
end