Dynamic-Calibration/utils/YALMIP-master/extras/setduals.m

67 lines
1.7 KiB
Matlab
Executable File

function setduals(F,D_struc,K)
D_struc = full(D_struc);
if ~isempty(D_struc)
% Equality constraints might have been converted
% to inequalities
if isfield(K,'fold')
D_struc = [-D_struc(1:K.fold)+D_struc(1+K.fold:2*K.fold);D_struc(2*K.fold+1:end)];
K.f = K.fold;
K.l = K.l-2*K.fold;
end
Z = dual2cell(D_struc,K);
Finfo = lmiinfo(F);
lmi_index = [];
j=1;
if ~isempty(Finfo.sdp)
for i = 1:size(Finfo.sdp,1)
lmi_index = [lmi_index;Finfo.sdp(i,3)];
duals{j}=(Z.s{i}+Z.s{i}')/2;j = j+1;
end
end
if ~isempty(Finfo.soc)
k = 1;
for i = 1:size(Finfo.soc,1)
lmi_index = [lmi_index;Finfo.soc(i,3)];
duals{j}=[Z.q{k:k+Finfo.soc(i,2)-1}];
j = j+1;
k = k + Finfo.soc(i,2);
end
end
if ~isempty(Finfo.rlc)
for i = 1:size(Finfo.rlc,1)
lmi_index = [lmi_index;Finfo.rlc(i,3)];
duals{j}=Z.r{i};j = j+1;
end
end
if ~isempty(Finfo.lin)
top=1;
for i = 1:size(Finfo.lin,1)
lmi_index = [lmi_index;Finfo.lin(i,3)];
duals{j}=reshape(Z.l(top:top+Finfo.lin(i,1)*Finfo.lin(i,2)-1),Finfo.lin(i,1),Finfo.lin(i,2));j = j+1;
top = top+Finfo.lin(i,1)*Finfo.lin(i,2);
end
end
if ~isempty(Finfo.equ)
top=1;
for i = 1:size(Finfo.equ,1)
lmi_index = [lmi_index;Finfo.equ(i,3)];
duals{j}=reshape(Z.f(top:top+Finfo.equ(i,1)*Finfo.equ(i,2)-1),Finfo.equ(i,1),Finfo.equ(i,2));j = j+1;
top = top+Finfo.equ(i,1)*Finfo.equ(i,2);
end
end
if ~isempty(lmi_index)
yalmip('setdual',lmi_index,duals);
end
end