Design a linear quadratic temperature controller

Since version 9.
------------------------------------------------------------------------
See also AC, C2DZOH, QCR, Plot2D, TimeLabl
------------------------------------------------------------------------

Contents

%--------------------------------------------------------------------------
%    Copyright (c) 2010 Princeton Satellite Systems, Inc.
%    All Rights Reserved
%--------------------------------------------------------------------------

clear T; clear Q; clear H;

Create a test conductance matrix

dT/dt = aT + bq where q is the input heat flux or loss

%---------------------------------------
n = 10;
a = zeros(n,n);
for k = 1:n
	a(k,k) = -2;
	j = k+1;
	if( j < n+1 )
    a(j,k) = 1;
	end
	j = k-1;
	if( j >  0 )
     a(j,k) = 1;
	end
end

a(1,1)   = -1;
a(n,n)   = -1;

disp('Eigenvalues of a')
eig(a)

b        = eye(n);
r        = eye(n);
q        = eye(n);

dT       = 10;

gain     = QCR( a, b, q, 100000*r );

disp('Eigenvalues of the closed loop system')
eig(a-b*gain)

[aC,gain] = C2DZOH( a, gain, dT );
[a, b]    = C2DZOH( a, b, dT );

eig(a-b*gain)

x        = 300*ones(n,1);
xS       = x;
qC       = zeros(n,1);

nSim     = 2000;
xP       = zeros(3*n,nSim);
t        = 0;

qH       = (rand(n,1) - 0.5);
Eigenvalues of a
ans =
      -3.9021
       -3.618
      -3.1756
       -2.618
           -2
       -1.382
     -0.82443
     -0.38197
    -0.097887
  -1.1143e-17
Eigenvalues of the closed loop system
ans =
      -3.9021
       -3.618
      -3.1756
       -2.618
           -2
       -1.382
     -0.82444
   -0.0031623
    -0.097938
     -0.38198
ans =
      0.68377
      0.37366
     0.021849
   0.00025384
  -8.9856e-07
  -6.2294e-07
  -2.7864e-07
  -1.5614e-07
  -1.0557e-07
  -8.4153e-08

Simulation loop

%----------------
for k = 1:nSim

    % Bidirectional input heat flux
    %------------------------------
    if( k < 100 || (k > 300 && k < 700)  )
        q = qH;
    else
        q = zeros(n,1);
    end

    qC      = -gain*(x - xS);

    j       = find(qC < 0);
    qC(j)   = 0;

    xP(:,k) = [x;q;qC];

    % State update
    %-------------
    x       = a*x + b*(q + qC);
    t       = t + dT;
end

Set the time label

%-------------------
[t, tL] = TimeLabl((0:nSim-1)*dT);

T = cell(1,n);
Q = cell(1,n);
H = cell(1,n);

for k = 1:n
	T{k} = sprintf('T%d',k);
	Q{k} = sprintf('Q%d',k);
	H{k} = sprintf('H%d',k);
end

Plotting

%---------
Plot2D( t, xP( 1: n,:), tL, T, 'Temperatures' )
Plot2D( t, xP( n+1:2*n,:), tL, Q, 'Flux'      )
Plot2D( t, xP(2*n+1:3*n,:), tL, H, 'Heater'   )

%--------------------------------------