Contents

Example of decLMI decentralized controller synthesis

This demo file shows how to use the DECLMI class to synthesize three LTI proportional controllers that guarantees stability while fulfilling constraints for the netwotk depicted below:

Controllers are:

Moreover, a stochastic controller is also computed, which guarantees closed-loop stability in the mean-square sense. It exploits a model of the packet dropouts as given by a two-state Markov chain. In this case the constraints are not guaranteed to hold at every time step.

clear variables
clear globals
close all
clc

Plant model

Net describes how the network is connected: * 1 = wired (reliable); * -1 = wireless (unreliable, i.e., seubject to dropouts); * 0 = no link.

      % e  f  g  h  j  k  l  m
Net = [ 1  1  1  0  0 -1  0  0   % a
       -1  1  0  1  1  0  0  0   % b
        0  0  1  0  0  1  1 -1   % c
        0  0  0 -1  1  0  1  1]; % d
[m,n]=size(Net);

State space matrices of the LTI discrete-time model $x(k+1) = A x(k) + B u(k)

A =[0.2843   -0.2895    0.1268   -0.0624   -0.2098  0.1882 -0.0061  0.2227;
   -0.2729    0.5052    0.0129   -0.1057   -0.1361  0.2154  0.2799 -0.0183;
    0.1610   -0.1229    0.1829   -0.4267    0.0589 -0.0905 -0.0417 -0.1709;
   -0.1084   -0.0138   -0.4611   -0.0735   -0.2013  0.1463  0.0854 -0.1567;
   -0.0300   -0.1167   -0.0012   -0.1847    0.3547  0.2081  0.0567  0.1566;
    0.2852    0.3036   -0.0994    0.1240    0.1099  0.1262  0.0229 -0.1599
   -0.0032    0.1558   -0.1285    0.1898   -0.0040  0.0017  0.7065 -0.1697;
    0.1961   -0.0173   -0.1023   -0.1888    0.0327 -0.2866 -0.1202  0.3198];
B =[     0   -2.2374   -0.4531         0;
   -0.1794    1.0976    1.3995    0.4287;
   -1.4671         0   -0.4620   -0.7370;
    1.3953   -1.6146    0.0327    0.5649;
    0.4408   -1.2287    0.7988   -1.3842;
    0.5654    0.2074    0.8968    0.4603;
         0         0    0.1379         0;
         0   -1.0061         0    0.3798];

Sample time

Ts = 1;

Constraints on input and state sqrt(x'x) <= xmax, sqrt(u'u)<=umax

xmax = 150;
umax = 150;
%Weights
Qx = eye(n);
Qu = 1e-2*eye(m);

Vertices of the initial state uncertainty polytope

X0 = [
    7.7618    7.7618    8.7618    8.7618
    6.0485    7.0485    6.0485    7.0485
    6.2866    6.2866    6.2866    6.2866
    6.6018    6.6018    6.6018    6.6018
    5.1547    5.1547    5.1547    5.1547
    7.8859    7.8859    7.8859    7.8859
    5.1507    5.1507    5.1507    5.1507
    5.0470    5.0470    5.0470    5.0470];

Markov chain description

The two-state Markov chain is described by:

Mc.d = [.1 .5];
Mc.q = [.8 .5];

Computation instance creation

obj = decLMI(Net,A,B,Qx,Qu,X0,xmax,umax,Mc);

Now all the controller synthesis problems are formulated and solved. The time needed for each computation is stored for comparison purposes.

Centralized ideal

tic
obj=obj.solve_centralized_lmi();
CPUtime.centralized = toc;
Solving centralized SDP problem...
SeDuMi 1.3 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
eqs m = 69, order n = 101, dim = 1573, blocks = 9
nnz(A) = 1872 + 0, nnz(ADA) = 4761, nnz(L) = 2415
 it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
  0 :            7.53E+004 0.000
  1 : -1.78E+004 2.49E+004 0.000 0.3311 0.9000 0.9000   1.07  1  1  8.5E+000
  2 : -1.94E+004 6.62E+003 0.000 0.2654 0.9000 0.9000   1.41  1  1  2.8E+000
  3 : -5.13E+003 2.66E+003 0.000 0.4016 0.9000 0.9000   2.59  1  1  7.4E-001
  4 : -4.41E+002 6.11E+002 0.000 0.2299 0.9000 0.9000   2.61  1  1  3.3E-001
  5 : -1.02E+002 1.50E+002 0.000 0.2449 0.9000 0.9000   1.20  1  1  2.8E-001
  6 : -7.92E+001 8.63E+001 0.000 0.5769 0.9000 0.9000   0.98  1  1  2.2E-001
  7 : -1.33E+002 4.53E+001 0.000 0.5247 0.9000 0.9000   0.39  1  1  1.4E-001
  8 : -1.77E+002 1.70E+001 0.000 0.3752 0.9000 0.9000   0.43  1  1  6.9E-002
  9 : -1.92E+002 1.18E+001 0.008 0.6939 0.9000 0.9000   0.47  1  1  5.6E-002
 10 : -2.25E+002 6.00E+000 0.000 0.5095 0.9000 0.9000   0.17  1  1  5.1E-002
 11 : -2.47E+002 3.89E+000 0.000 0.6483 0.9000 0.9000   0.04  1  1  5.1E-002
 12 : -3.03E+002 1.59E+000 0.000 0.4079 0.9000 0.9000   0.17  1  1  3.1E-002
 13 : -3.32E+002 8.80E-001 0.000 0.5545 0.9000 0.9000   0.31  1  1  2.5E-002
 14 : -3.60E+002 4.66E-001 0.000 0.5296 0.9000 0.9000   0.42  1  1  1.8E-002
 15 : -3.82E+002 2.60E-001 0.000 0.5568 0.9000 0.9000   0.55  1  1  1.2E-002
 16 : -3.98E+002 1.47E-001 0.000 0.5652 0.9000 0.9000   0.66  1  1  8.2E-003
 17 : -4.10E+002 7.85E-002 0.000 0.5347 0.9000 0.9000   0.76  1  1  5.0E-003
 18 : -4.19E+002 3.92E-002 0.000 0.5001 0.9000 0.9000   0.84  1  1  2.7E-003
 19 : -4.24E+002 1.71E-002 0.000 0.4348 0.9000 0.9000   0.91  1  1  1.3E-003
 20 : -4.27E+002 5.79E-003 0.000 0.3394 0.9000 0.9000   0.95  1  1  4.4E-004
 21 : -4.28E+002 1.32E-003 0.000 0.2271 0.9000 0.9000   0.98  1  1  1.0E-004
 22 : -4.29E+002 8.26E-005 0.192 0.0628 0.9900 0.9900   0.99  1  1  6.5E-006
 23 : -4.29E+002 4.75E-006 0.000 0.0575 0.9900 0.9900   1.00  1  1  3.7E-007
 24 : -4.29E+002 1.56E-008 0.398 0.0033 0.9990 0.9990   1.00  4  4  1.2E-009
Run into numerical problems.

iter seconds digits       c*x               b*y
 24      1.5   9.3 -4.2868543504e+002 -4.2868543527e+002
|Ax-b| =  2.7e-011, [Ay-c]_+ =  1.1E-008, |x|= 4.3e+002, |y|= 1.1e+003

Detailed timing (sec)
   Pre          IPM          Post
7.970E-001    1.703E+000    7.799E-002    
Max-norms: ||b||=1, ||c|| = 22500,
Cholesky |add|=1, |skip| = 9, ||L.L|| = 94286.7.
\nCentralized SDP problem solved!\n

Decentralized ideal

tic
obj = obj.solve_dec_ideal_lmi();
CPUtime.dec_ideal = toc;
\nSolving decentralized SDP problem...\n
SeDuMi 1.3 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
eqs m = 29, order n = 101, dim = 1573, blocks = 9
nnz(A) = 616 + 0, nnz(ADA) = 841, nnz(L) = 435
 it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
  0 :            7.53E+004 0.000
  1 : -1.76E+004 2.43E+004 0.000 0.3227 0.9000 0.9000   1.07  1  1  8.2E+000
  2 : -1.92E+004 6.63E+003 0.000 0.2727 0.9000 0.9000   1.44  1  1  2.7E+000
  3 : -5.30E+003 2.85E+003 0.000 0.4299 0.9000 0.9000   2.68  1  1  7.4E-001
  4 : -4.06E+002 5.81E+002 0.000 0.2038 0.9000 0.9000   2.43  1  1  3.7E-001
  5 : -1.02E+002 1.51E+002 0.000 0.2593 0.9000 0.9000   1.14  1  1  3.2E-001
  6 : -8.58E+001 8.72E+001 0.000 0.5790 0.9000 0.9000   0.96  1  1  2.5E-001
  7 : -1.34E+002 5.06E+001 0.000 0.5807 0.9000 0.9000   0.35  1  1  1.6E-001
  8 : -1.94E+002 1.77E+001 0.226 0.3498 0.9000 0.9000   0.38  1  1  7.5E-002
  9 : -2.12E+002 1.25E+001 0.280 0.7077 0.9000 0.9000   0.47  1  1  6.1E-002
 10 : -2.26E+002 9.76E+000 0.039 0.7784 0.9000 0.9000   0.23  1  1  5.8E-002
 11 : -2.34E+002 7.31E+000 0.000 0.7492 0.9000 0.9000  -0.31  1  1  7.0E-002
 12 : -2.95E+002 3.23E+000 0.000 0.4419 0.9000 0.9000  -0.15  1  1  5.7E-002
 13 : -3.83E+002 1.02E+000 0.000 0.3148 0.9000 0.9000   0.18  1  1  2.7E-002
 14 : -4.30E+002 4.25E-001 0.000 0.4176 0.9000 0.9000   0.39  1  1  1.7E-002
 15 : -4.56E+002 2.25E-001 0.000 0.5300 0.9000 0.9000   0.47  1  1  1.2E-002
 16 : -4.87E+002 8.19E-002 0.000 0.3637 0.9000 0.9000   0.64  1  1  5.6E-003
 17 : -5.00E+002 3.65E-002 0.000 0.4455 0.9000 0.9000   0.79  1  1  2.8E-003
 18 : -5.09E+002 1.11E-002 0.000 0.3053 0.9000 0.9000   0.90  1  1  9.4E-004
 19 : -5.12E+002 3.43E-003 0.000 0.3078 0.9000 0.9000   0.95  1  1  3.0E-004
 20 : -5.13E+002 3.06E-004 0.000 0.0894 0.9900 0.9900   0.98  1  1  2.7E-005
 21 : -5.13E+002 7.36E-005 0.000 0.2402 0.9000 0.9000   1.00  1  1  6.6E-006
 22 : -5.13E+002 2.61E-007 0.294 0.0035 0.9990 0.9990   1.00  1  1  2.3E-008
 23 : -5.13E+002 5.16E-008 0.000 0.1978 0.9000 0.9000   1.00  2  2  4.6E-009
 24 : -5.13E+002 1.39E-009 0.000 0.0269 0.9900 0.9900   1.00  2  2  1.2E-010

iter seconds digits       c*x               b*y
 24      0.7  10.3 -5.1298252214e+002 -5.1298252217e+002
|Ax-b| =  2.8e-012, [Ay-c]_+ =  1.1E-009, |x|= 5.1e+002, |y|= 9.8e+002

Detailed timing (sec)
   Pre          IPM          Post
6.301E-002    3.440E-001    1.501E-002    
Max-norms: ||b||=1, ||c|| = 22500,
Cholesky |add|=0, |skip| = 0, ||L.L|| = 362.831.
\nDecentralized SDP problem solved!\n

Decentralized lossy (robust)

tic
obj = obj.solve_dec_lossy_lmi();
CPUtime.dec_lossy = toc;
\nSolving dec. lossy SDP problem...\n
SeDuMi 1.3 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
eqs m = 37, order n = 941, dim = 19333, blocks = 54
nnz(A) = 6056 + 0, nnz(ADA) = 1273, nnz(L) = 691
 it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
  0 :            1.78E+006 0.000
  1 : -1.93E+004 4.80E+005 0.000 0.2692 0.9000 0.9000   1.01  1  1  1.0E+002
  2 : -3.01E+004 4.34E+004 0.000 0.0906 0.9900 0.9900   1.14  1  1  9.3E+000
  3 : -2.40E+004 1.34E+004 0.000 0.3093 0.9000 0.9000   1.36  1  1  3.3E+000
  4 : -6.26E+003 4.85E+003 0.000 0.3608 0.9000 0.9000   2.43  1  1  7.9E-001
  5 : -7.24E+002 1.03E+003 0.000 0.2117 0.9000 0.9000   1.99  1  1  4.1E-001
  6 : -3.94E+002 5.58E+002 0.000 0.5441 0.9000 0.9000   1.13  1  1  3.7E-001
  7 : -3.69E+002 4.89E+002 0.000 0.8763 0.9000 0.9000   1.01  1  1  3.5E-001
  8 : -4.46E+002 3.58E+002 0.000 0.7310 0.9000 0.9000   0.55  1  1  2.7E-001
  9 : -5.19E+002 2.28E+002 0.000 0.6362 0.9000 0.9000   0.56  1  1  1.9E-001
 10 : -5.62E+002 1.46E+002 0.000 0.6404 0.9000 0.9000   0.64  1  1  1.3E-001
 11 : -5.74E+002 1.30E+002 0.133 0.8925 0.9000 0.9000   0.60  1  1  1.2E-001
 12 : -6.23E+002 8.46E+001 0.000 0.6501 0.9000 0.9000   0.35  1  1  1.1E-001
 13 : -6.76E+002 5.40E+001 0.000 0.6387 0.9000 0.9000   0.29  1  1  8.7E-002
 14 : -7.84E+002 1.85E+001 0.000 0.3432 0.9000 0.9000   0.54  1  1  3.5E-002
 15 : -8.24E+002 8.69E+000 0.000 0.4686 0.9000 0.9000   0.67  1  1  2.0E-002
 16 : -8.48E+002 4.24E+000 0.000 0.4886 0.9000 0.9000   0.78  1  1  1.1E-002
 17 : -8.69E+002 9.78E-001 0.000 0.2305 0.9000 0.9000   0.89  1  1  2.7E-003
 18 : -8.75E+002 2.06E-001 0.000 0.2101 0.9000 0.9000   0.96  1  1  5.8E-004
 19 : -8.76E+002 5.68E-002 0.000 0.2762 0.9000 0.9000   0.99  1  1  1.6E-004
 20 : -8.76E+002 1.91E-002 0.000 0.3359 0.9000 0.9000   1.00  1  1  5.5E-005
 21 : -8.76E+002 4.35E-003 0.000 0.2283 0.9000 0.9000   1.00  1  1  1.2E-005
 22 : -8.76E+002 8.86E-004 0.000 0.2035 0.9000 0.9000   1.00  1  1  2.5E-006
 23 : -8.76E+002 6.95E-005 0.403 0.0785 0.9900 0.9900   1.00  1  3  2.0E-007
 24 : -8.76E+002 1.73E-005 0.000 0.2490 0.9000 0.9000   1.00  7  7  5.0E-008
 25 : -8.76E+002 1.67E-006 0.433 0.0967 0.9900 0.9900   1.00 15 15  4.8E-009
 26 : -8.76E+002 3.76E-007 0.000 0.2244 0.9000 0.9000   1.00 26 26  1.1E-009
 27 : -8.76E+002 2.43E-007 0.000 0.6456 0.9000 0.9000   1.00 51 51  7.0E-010

iter seconds digits       c*x               b*y
 27      9.5   9.0 -8.7629587526e+002 -8.7629587608e+002
|Ax-b| =  5.5e-011, [Ay-c]_+ =  2.1E-009, |x|= 8.8e+002, |y|= 1.4e+003

Detailed timing (sec)
   Pre          IPM          Post
7.800E-002    4.766E+000    0.000E+000    
Max-norms: ||b||=1, ||c|| = 22500,
Cholesky |add|=4, |skip| = 6, ||L.L|| = 66994.4.
Closed loop max eig: 0.76382
Closed loop max eig: 0.76244
Closed loop max eig: 0.76016
Closed loop max eig: 0.75831
Closed loop max eig: 0.76902
Closed loop max eig: 0.76786
Closed loop max eig: 0.76324
Closed loop max eig: 0.76252
Closed loop max eig: 0.76201
Closed loop max eig: 0.76155
Closed loop max eig: 0.75941
Closed loop max eig: 0.75855
Closed loop max eig: 0.77144
Closed loop max eig: 0.77039
Closed loop max eig: 0.76748
Closed loop max eig: 0.76679

Decentralized stochastic

tic
obj = obj.solve_dec_stoch_lmi();
CPUtime.dec_stoch = toc;
\nSolving decentralized stoch. SDP problem...\n
SeDuMi 1.3 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
Put 2 free variables in a quadratic cone
eqs m = 47, order n = 758, dim = 226511, blocks = 13
nnz(A) = 10685 + 0, nnz(ADA) = 2029, nnz(L) = 1038
 it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
  0 :            5.13E+001 0.000
  1 : -9.89E+003 1.44E+001 0.000 0.2810 0.9000 0.9000  -0.72  1  1  2.4E+002
  2 : -8.93E+003 7.30E+000 0.000 0.5066 0.9000 0.9000  -0.60  1  1  2.1E+002
  3 : -8.68E+003 5.00E+000 0.000 0.6848 0.9000 0.9000  -0.49  1  1  1.9E+002
  4 : -7.37E+003 2.50E+000 0.000 0.4997 0.9000 0.9000  -0.42  1  1  1.5E+002
  5 : -5.18E+003 8.68E-001 0.000 0.3475 0.9000 0.9000  -0.25  1  1  9.3E+001
  6 : -3.00E+003 2.08E-001 0.000 0.2397 0.9000 0.9000   0.05  1  1  3.7E+001
  7 : -1.72E+003 6.69E-003 0.000 0.0322 0.9900 0.9900   0.46  1  1  1.7E+000
  8 : -1.64E+003 1.37E-004 0.000 0.0204 0.9900 0.9900   0.98  1  1  3.4E-002
  9 : -1.10E+003 3.39E-005 0.000 0.2479 0.9000 0.9000   1.68  1  1  5.7E-003
 10 : -9.14E+002 1.48E-005 0.000 0.4378 0.9000 0.9000   1.61  1  1  2.1E-003
 11 : -8.84E+002 6.51E-006 0.000 0.4386 0.9000 0.9000   1.15  1  1  8.9E-004
 12 : -8.79E+002 2.31E-006 0.000 0.3544 0.9000 0.9000   1.03  1  1  3.1E-004
 13 : -8.76E+002 1.95E-007 0.000 0.0846 0.9900 0.9900   1.01  1  1  2.6E-005
 14 : -8.76E+002 9.14E-009 0.000 0.0468 0.9900 0.9900   1.00  1  1  1.2E-006
 15 : -8.76E+002 7.45E-010 0.000 0.0815 0.9900 0.9900   1.00  1  1  1.0E-007
 16 : -8.76E+002 6.33E-011 0.000 0.0850 0.9900 0.9900   1.00  2  2  8.6E-009
 17 : -8.76E+002 3.35E-012 0.142 0.0530 0.9900 0.9900   1.00  3  3  4.5E-010

iter seconds digits       c*x               b*y
 17     76.3   8.9 -8.7629588185e+002 -8.7629588070e+002
|Ax-b| =  3.2e-007, [Ay-c]_+ =  1.4E-011, |x|= 5.3e+004, |y|= 1.7e+003

Detailed timing (sec)
   Pre          IPM          Post
1.560E-001    4.700E+001    1.570E-001    
Max-norms: ||b||=1000, ||c|| = 1.752360e+001,
Cholesky |add|=0, |skip| = 0, ||L.L|| = 26676.2.
\nDecentralized stoch. SDP problem solved!\n

Simulation

Random initial state in X0

x0 =[
    8.3272
    5.7953
    7.2282
    8.6640
    5.8317
    6.6488
    8.1784
    6.5376];

Simulation length

Tsim = 50;

Number of simulations to be carried out

Nsim = 50;

For a proper comparison, a sequence of states and emissions of the Markov chain model is stored.

load Statechange_paper
load Randvals_paper

Sim = [];
for iter=1:Nsim

Generate realizations of Markov chain

    statechange = Statechange(1,:,iter);
    randvals = Randvals(1,:,iter);

Initial Markov chain state

    initialstate = 1;

Compute sequence of Markov chain states

    trc = cumsum(obj.Mc.T,2);
    ec = cumsum(obj.Mc.E,2);
    currentstate = initialstate;
    numStates = size(obj.Mc.T,1);
    numEmissions = size(obj.Mc.E,2);
    for i = 1:Tsim

Calculate state transition

        stateVal = statechange(i);
        state = 1;
        for innerState = numStates-1:-1:1
            if stateVal > trc(currentstate,innerState)
                state = innerState + 1;
                break
            end
        end

Calculate emission

        val = randvals(i);
        emit = 1;
        for inner = numEmissions-1:-1:1
            if val > ec(state,inner)
                emit = inner + 1;
                break
            end
        end

Add values and states to output

        seq(i) = emit;
        states(i) = state;
        currentstate = state;
    end

Get controllers gains from decLMI obj

    Kc=obj.K.ci;
    Kd=obj.K.di;
    Kl=obj.K.dl;
    Ks=obj.K.ds;

Init states, inputs, state norms and input norms

    Xc = x0;
    Xd = x0;
    Xn = x0;
    Xl = x0;
    Xs = x0;

    Uc = [];
    Ud = [];
    Un = [];
    Ul = [];
    Us = [];

    Xcnorm = [];
    Xdnorm = [];
    Xnnorm = [];
    Xlnorm = [];
    Xsnorm = [];

    Ucnorm = [];
    Udnorm = [];
    Unnorm = [];
    Ulnorm = [];
    Usnorm = [];

Perform current simulation

    for i=1:Tsim

Centralized

        Uc(:,i) = Kc*Xc(:,i);
        Xc(:,i+1) = A*Xc(:,i) + B*Uc(:,i);
        Xcnorm(i) = norm(Xc(:,i));
        Ucnorm(i) = norm(Uc(:,i));

Decentralized with ideal network

        Ud(:,i) = Kd*Xd(:,i);
        Xd(:,i+1) = A*Xd(:,i) + B*Ud(:,i);
        Xdnorm(i) = norm(Xd(:,i));
        Udnorm(i) = norm(Ud(:,i));

Decentralized with lossy network and robust stability

        Ul(:,i) = Kl{seq(i)}*Xl(:,i);
        Xl(:,i+1) = A*Xl(:,i) + B*Ul(:,i);
        Xlnorm(i) = norm(Xl(:,i));
        Ulnorm(i) = norm(Ul(:,i));

Decentralized with lossy network and stoch. stability

        Us(:,i) = Ks{seq(i),states(i)}*Xs(:,i);
        Xs(:,i+1) = A*Xs(:,i) + B*Us(:,i);
        Xsnorm(i) = norm(Xs(:,i));
        Usnorm(i) = norm(Us(:,i));
    end

Performance indices initialization

    Jc = [];
    Jd = [];
    Jl = [];
    Js = [];

The used performance index is a sum over the entire simulation horizon of the state and input norms weighted by the Riccati equation weights.

    for i=1:Tsim
        Jc(i) = sqrt(Xc(:,i)'*Qx*Xc(:,i) + Uc(:,i)'*Qu*Uc(:,i));
        Jd(i) = sqrt(Xd(:,i)'*Qx*Xd(:,i) + Ud(:,i)'*Qu*Ud(:,i));
        Jl(i) = sqrt(Xl(:,i)'*Qx*Xl(:,i) + Ul(:,i)'*Qu*Ul(:,i));
        Js(i) = sqrt(Xs(:,i)'*Qx*Xs(:,i) + Us(:,i)'*Qu*Us(:,i));
    end

store the current simulation results

    Sim.Jc(iter) = sum(Jc);
    Sim.Jd(iter) = sum(Jd);
    Sim.Jl(iter) = sum(Jl);
    Sim.Js(iter) = sum(Js);
end

fprintf('\n\nGlobal results over %d simulations: \n\n',Nsim);
fprintf('Central. ideal performance: %.2f\n',sum(Sim.Jc));
fprintf('Decentr. ideal performance: %.2f\n',sum(Sim.Jd));
fprintf('Decentr. lossy performance: %.2f\n',sum(Sim.Jl));
fprintf('Decentr. stoch performance: %.2f\n',sum(Sim.Js));

fprintf('\nCentral. ideal performance AVG: %.2f\n',mean(Sim.Jc));
fprintf('Decentr. ideal performance AVG: %.2f\n',mean(Sim.Jd));
fprintf('Decentr. lossy performance AVG: %.2f\n',mean(Sim.Jl));
fprintf('Decentr. stoch performance AVG: %.2f\n',mean(Sim.Js));

fprintf('\nCentral. ideal performance STD: %.2f\n',std(Sim.Jc));
fprintf('Decentr. ideal performance STD: %.2f\n',std(Sim.Jd));
fprintf('Decentr. lossy performance STD: %.2f\n',std(Sim.Jl));
fprintf('Decentr. stoch performance STD: %.2f\n',std(Sim.Js));

CPUtime

Global results over 50 simulations: 

Central. ideal performance: 2048.67
Decentr. ideal performance: 2251.93
Decentr. lossy performance: 2487.44
Decentr. stoch performance: 2351.85

Central. ideal performance AVG: 40.97
Decentr. ideal performance AVG: 45.04
Decentr. lossy performance AVG: 49.75
Decentr. stoch performance AVG: 47.04

Central. ideal performance STD: 0.00
Decentr. ideal performance STD: 0.00
Decentr. lossy performance STD: 1.55
Decentr. stoch performance STD: 1.44

CPUtime = 

    centralized: 5.3040
      dec_ideal: 0.8137
      dec_lossy: 6.8474
      dec_stoch: 51.0777

Conclusions

Performance evaluation

As expected, the best performance is achieved by the centralized ideal controller, as it can use all the state measurements for all actuators at all time steps.

However, the decentralized ideal controller achieves a performance which is only 10% higher than the ideal centralized one, while using much less communications between sensors and actuators.

A robustly stabilizing controller has been found also for the case where some of the links are subject to possible packet dropouts. In this case constraints are fulfilled at every time step, regardless of the occurrence of the dropouts in the network.

Exploiting a stochastic model of the packet dropouts, a stochastic controller has been computed which obtaines an improvement on the performance index of around 6% with respect to the robust control scheme.