source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/usertest/helmersson.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 6.2 KB
Line 
1function pass = helmersson
2
3% this example is from scherer, lpv control and full block
4% multipliers, automatica 37 (2001), pp. 361-375.
5
6clear all
7
8if ~exist ('a', 'var'),
9  a = 1.0;
10elseif size (a) ~= [1 1],
11  a = 1.0;
12end
13
14sz = 3;
15if ~exist ('ndd', 'var'),
16  ndd = sz;
17elseif size (ndd) ~= [1 1],
18  ndd = sz;
19end
20
21if ~exist ('nddr', 'var'),
22  nddr = sz;
23elseif size (nddr) ~= [1 1],
24  nddr = sz;
25end
26
27ddr = 2.0/nddr;
28dd = ddr/ndd;
29
30if ~exist('slack_factor', 'var'),
31  slack_factor = 1.0;
32elseif size (slack_factor) ~= [1 1],
33  slack_factor = 1.0;
34end
35
36A = -1;
37B = [1 1 1 1 0 1];
38C = [0; 0; 0; 0; 0; 1];
39D = [0     1 0   1 0 0;
40     0.5   0 0.5 0 1 0;
41     2*a   0 a   0 0 0;
42     0  -2*a 0  -a 0 1;
43     0     1  0  0 0 0;
44     1     0  0  0 0 0];
45
46I = eye(size([A B],2));
47     
48blk = [1 4 1 1];  % states deltas perf control
49ABCD = [A B; C D];
50
51
52deltar = 0.9*(-1+0.5*ddr:ddr:1-0.5*ddr);
53
54Deltars = zeros (4, 4, length(deltar)^2);
55m = 0;
56nd = length (deltar);
57for i1 = 1:nd,
58  d1 = deltar(i1);
59  for i2 = 1:nd,
60    d2 = deltar(i2);
61    m = m + 1;
62    Deltars(:,:,m) = blkdiag (d1*eye(2), d2*eye(2));
63  end
64end
65
66nr = size(Deltars,3);
67
68delta = 0.9*(-0.5*ddr:dd:0.5*ddr);
69
70maxsize = max ([0 diff(delta); diff(delta) 0]);
71Deltas = zeros (4, 4, length(delta)^2, nr);
72slack = slack_factor * ones (length(delta)^2, 2);
73
74for ir = 1:nr
75  maxsize = max ([0 diff(delta); diff(delta) 0]);
76  slack = slack_factor * ones (length(delta)^2, 2);
77
78  m = 1;
79  nd = length (delta);
80  for i1 = 1:nd,
81    d1 = delta(i1);
82    for i2 = 1:nd,
83      d2 = delta(i2);
84      Deltas(:,:,m,ir) = blkdiag (d1*eye(2), d2*eye(2)) + Deltars(:,:,ir);
85      slack(m,:) = slack_factor * [maxsize(i1) maxsize(i2)];
86      m = m + 1;
87    end
88  end
89
90  DDeltas = [];
91  DDeltas(:,:,1) = blkdiag (eye(2), 0*eye(2));
92  DDeltas(:,:,2) = blkdiag (0*eye(2), eye(2));
93end
94 
95[P, R, gam, F] = synlpv (ABCD, blk, Deltas, DDeltas, slack);
96
97% evaluation
98
99Pd = P(3:10,3:10);
100Rd = R(3:10,3:10);
101
102pass = norm(gam-1.527)<1e-2;
103
104
105function [P_feas, R_feas, gam_feas, F] = synlpv (ABCD, blk, Deltas, ...
106                                              DDeltas, slack)
107
108if nargin < 3,
109  disp ('usage:  [P, R, gam] = synlpv (A, blk, Deltas, DDeltas, slack)');
110  return;
111end
112
113if nargin < 4, DDeltas = []; end
114
115n = sum(blk(1:3));
116A = ABCD(1:n,1:n);
117B = ABCD(1:n,n+1:end);
118C = ABCD(n+1:end,1:n);
119
120n1 = blk(1);  % states
121n2 = blk(2);  % deltas
122n3 = blk(3);  % H-inf
123[n, k]      = size (A);
124[kd, nd, q, r] = size (Deltas);
125[kdd, ndd, qd] = size (DDeltas);
126if isempty (DDeltas), qd = 0; end
127
128if n ~= n1+n2+n3, error ('blk not compatible with A'); end
129if n ~= n1+n2+n3, error ('blk not compatible with A'); end
130if k ~= n1+n2+n3, error ('blk not compatible with A'); end
131
132if n2 ~= nd | n2 ~= kd, error ('blk not compatible with Deltas'); end
133
134if qd > 0 & (kdd ~= kd | ndd ~= nd),
135  error ('DDeltas not compatible with Deltas');
136end
137
138if nargin < 5 & qd > 1,
139  slack = ones(q,qd);
140end
141
142if length (slack) ~= q,
143  error ('slack not compatible with Deltas');
144end
145
146slackvar = any (slack(:) > 0);
147
148ns = n1;
149ks = n1;   % state block is always square
150
151np = n3;   % performance block (H-inf)
152kp = n3;
153
154tic
155yalmip ('clear');
156
157% define the block diagonal structure of P and R
158
159Ps = sdpvar (ns, ns, 'symmetric');
160Rs = sdpvar (ns, ns, 'symmetric');
161zs = zeros(ns,ns);
162
163gam  = sdpvar (1, 1);
164gami = sdpvar (1, 1);
165
166for ir = 1:r,
167  Pd(ir).var = sdpvar (nd+kd, nd+kd, 'symmetric');
168  P(ir).var  = blkdiag ([zs Ps; Ps zs], Pd(ir).var);
169  Rd(ir).var = sdpvar (nd+kd, nd+kd, 'symmetric');
170  R(ir).var  = blkdiag ([zs Rs; Rs zs], Rd(ir).var);
171
172  % Hinf outputs and inputs
173  P(ir).var = blkdiag (P(ir).var, gami*eye(np), -gam*eye(kp));
174  R(ir).var = blkdiag (R(ir).var, gam*eye(np), -gami*eye(kp));
175
176  if slackvar,
177    % define slack variables of Delta inequalities
178    for iq = 1:qd,
179      DDP(iq,ir).var = sdpvar (nd, nd, 'symmetric');
180      DDR(iq,ir).var = sdpvar (nd, nd, 'symmetric');
181    end
182  end
183end
184
185Pswap = [1:ns n+(1:ks) ns+(1:nd) n+ns+(1:kd) ...
186        ns+nd+(1:np) n+ns+nd+(1:kp)];
187
188Rswap = [1:ks k+(1:ns) ks+(1:kd) k+ns+(1:nd) ...
189        ks+kd+(1:kp) k+ns+nd+(1:np)];
190
191AI = [A; eye(k)];
192IA = [eye(n); -A'];
193
194ACp = AI(Pswap,:)*null(C);
195
196ABp = IA(Rswap,:)*null(B');
197
198%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
199% gam*gami > 1
200F = lmi;
201
202% [gam 1; 1 gami] > 0,
203% which is equivalent to gam > 0 and gami > 1/gam
204% even if gami > 1/gam we can replace it by 1/gam and still
205% satisfying the quadratic constraints since gami terms appears as
206% in the P and R inequalities as
207% ... + U' gami U < 0 and ... - V' gami V > 0, respectively
208F = addlmi (F, [gam 1; 1 gami]);
209
210% state-space multipliers defined by [Ps I; I Rs] > 0
211F = addlmi (F, [Ps eye(ns); eye(ns) Rs]);
212
213for ir = 1:r
214  % Cp' [A;I]' P(ir) [A;I] Cp < 0
215  F = addlmi (F, -ACp'*P(ir).var*ACp);
216
217  % Bp' [I;A']' R(ir) [I;A'] Cp > 0
218  F = addlmi (F, ABp'*R(ir).var*ABp);
219
220  if slackvar,
221    % slack variables
222    for iq = 1:qd,
223      % DDP(iq,ir) > [0; DD]' Pd(ir) [0; DD]
224      ZDD = [zeros(nd,nd); DDeltas(:,:,iq)];
225
226      F = addlmi (F, DDP(iq,ir).var - ZDD'*Pd(ir).var*ZDD);
227
228      % DDP(iq,ir) > 0
229      F = addlmi (F, DDP(iq,ir).var);
230 
231      % DDR(iq,ir) + [-DD'; 0]' Rd(ir) [-DD'; 0] > 0
232      DDZ = [-DDeltas(:,:,iq)'; zeros(kd,kd)];
233      F = addlmi (F, DDR(iq,ir).var + DDZ'*Rd(ir).var*DDZ);
234
235      % DDR(iq,ir) > 0
236      F = addlmi (F, DDR(iq,ir).var);
237    end
238  end
239
240  for iq = 1:q,
241    % [I; D]' Pd(ir) [I; D] > 0.25 * sum DDP
242    sumDDP = 0;
243    if slackvar,
244      for iqd = 1:qd,
245        sumDDP = sumDDP + slack(iq,iqd)^2*DDP(iqd,ir).var;
246      end
247    end
248   
249    ID = [eye(nd); Deltas(:,:,iq,ir)];
250    F = addlmi (F, ID'*Pd(ir).var*ID - 0.25*sumDDP);
251
252    % [-D'; I]' Rd(ir) [-D'; I] + 0.25 * sum DDR < 0
253    sumDDR = 0;
254    if slackvar,
255      for iqd = 1:qd,
256        sumDDR = sumDDR + slack(iq,iqd)^2*DDR(iqd,ir).var;
257      end
258    end
259    DI = [-Deltas(:,:,iq,ir)'; eye(kd)];
260    F = addlmi (F, -DI'*Rd(ir).var*DI - 0.25*sumDDR);
261  end
262end
263
264toc
265
266% minimize gam
267%[c,A,b,K] = sedumidata(F,gam)
268%save dummy c A b K
269%break
270sol = solvesdp (F,gam)
271
272if isempty (sol),
273  disp ('no solution found');
274  P = [];
275  R = [];
276else
277  gam_feas = sdp2mat (gam, sol); 
278  gami_feas = sdp2mat (gami, sol);
279  disp (sprintf ('gam = %8.3e', gam_feas))
280  disp (sprintf ('gam*gami - 1 = %8.3e', gam_feas*gami_feas - 1))
281  P_feas = sdp2mat (P(1).var, sol);
282  R_feas = sdp2mat (R(1).var, sol);
283end
284
285
286
Note: See TracBrowser for help on using the repository browser.