Dynamic-Calibration/utils/SDPT3-4.0/Examples/control.m

102 lines
3.1 KiB
Matlab
Executable File

%%******************************************************
%% control: a SDP problem from control theory.
%%
%% max t
%% s.t Bk'*P + P*Bk <= 0, k = 1:L
%% P <= I,
%% P >= t*I, P = P'.
%%------------------------------------------------------
%% [blk,Avec,C,b,X0,y0,Z0,objval,P] = control(B,solve),
%%
%% where B{k} = Bk, k = 1:L.
%%
%% For example, B1 = [-0.8 1.2 -0.5;
%% -1.1 -1.0 -2.5;
%% 2.0 0.2 -1.0];
%%
%% B2 = [-1.5 0.5 -2.0;
%% 1.1 -2.0 0.2;
%% -1.4 1.1 -1.5];
%%
%% solve = 0 just to initialize
%% = 1 if want to solve the problem
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [blk,Avec,C,b,X0,y0,Z0,objval,P] = control(B,solve);
if nargin < 2; solve = 0; end;
if ~iscell(B); error('B must be a cell array such that B{k} = Bk'); end;
L = size(B,2);
N = length(B{1});
m = N*(N+1)/2 + 1;
n = N*(L+2);
blk{1,1} = 's'; blk{1,2} = N*ones(1,L+2);
C = sparse(n,n);
C(L*N+1:(L+1)*N,L*N+1:(L+1)*N) = speye(N);
b = [zeros(m-1,1); 1];
A = cell(1,N*(N+1)/2+1);
count = 1;
for k = 1:N
for j = k:N
ak = []; aj = []; row1 = []; row2 = []; col1 = []; col2 = [];
for l = 1:L
G = B{l};
ak = [ak; G(k,:)'];
aj = [aj; G(j,:)'];
col1 = [col1; ((l-1)*N+j)*ones(N,1)];
col2 = [col2; ((l-1)*N+k)*ones(N,1)];
row1 = [row1; [(l-1)*N+1:l*N]'];
row2 = [row2; [(l-1)*N+1:l*N]'];
end;
ek = [zeros(k-1,1); 0.5 ;zeros(N-k,1)];
ej = [zeros(j-1,1); 0.5 ;zeros(N-j,1)];
ak = [ak; ek; -ek];
aj = [aj; ej; -ej];
col1 = [col1; (L*N+j)*ones(N,1); (L*N+N+j)*ones(N,1)];
col2 = [col2; (L*N+k)*ones(N,1); (L*N+N+k)*ones(N,1)];
row1 = [row1; [L*N+1:(L+1)*N]'; [L*N+N+1:(L+2)*N]' ];
row2 = [row2; [L*N+1:(L+1)*N]'; [L*N+N+1:(L+2)*N]' ];
if j ~= k;
tmp = sparse([row1; row2],[col1; col2],[ak; aj],n,n);
elseif (j == k);
tmp = sparse(row1,col1,ak,n,n);
end;
A{count} = tmp + tmp';
count = count+1;
end;
end;
tmp = sparse(n,n);
tmp((L+1)*N+1:(L+2)*N,(L+1)*N+1:(L+2)*N) = speye(N);
A{N*(N+1)/2+1} = tmp;
%%
%% initial iterate
%%
Avec = svec(blk,A,ones(size(blk,1),1));
[X0,y0,Z0] = infeaspt(blk,Avec,C,b);
%%
if (solve)
[obj,X,y,Z] = sqlp(blk,Avec,C,b,[],X0,y0,Z0);
objval = mean(obj);
idx1 = 1;
for k = 1:N
idx2 = idx1 + N-k;
P(k:N,k) = y(idx1 : idx2);
idx1 = idx2+1;
end;
P = P + tril(P,-1)';
else
objval = []; P = [];
end
%%======================================================