Tuning controllers for multiple models or operating conditions

Reliable or fault tolerant control refer to situations where the controlled plant may undergo deviations from its nominal mode of operation. Changes in operational mode may correspond to actuator or detector failures or abrupt changes in the dynamics due to various sources including model uncertainties. We show in this application that hinfstruct can cope with several operiational modes to increase safety of the controlled plant.

Problem borrowed from "A natural approach to high performance robust control: another look at the youla parameterization", K. Zhou, Proc. SICE 2004 pp. 869-874 We consider the synthesis of a 2-DOF control architecture for a family of models involving a nominal model G1 and 9 other models corresponding to faulty operational conditions or mismatch between the actual plant and the nominal model. The control architecture involves a PID feedback controller and a 2nd-order feed-forward block. The objective is to achieve good tracking properties as reflected by a reference model on the entire model family. Such problems are often referred to as multi-model or reliable or fault-tolerant control in the litterature.

Contents

Define nominal model and faulty operational modes

clear all;
s = tf('s') ; nu = 1; ny = 1;
Gmodel{1} = 1/(s-1) ; % nominal  plant
Gmodel{2} = 6.1/( (s-1)*(s+6.1) );
Gmodel{3} = 1.425/(s-1.425);
Gmodel{4} = 0.67/(s-0.67);
Gmodel{5} = (-0.07*s+1)/( (s-1)*(0.07*s+1) ) ;
Gmodel{6} = 70^2/( (s-1)*(s^2 +2*0.15*70*s+70^2) );
Gmodel{7} = 70^2/( (s-1)*(s^2+2*5.6*70*s+70^2) ) ;
Gmodel{8} = (1/(s-1))*( 50/(s+50) )^6 ;
Gmodel{9} = -2.9621*(s-9.837)*(s+0.76892)/( (s+32)*(s-1)*(s+0.56119) ) ;
Gmodel{10} = 4.991*(s^2+3.6722*s+34.848)/( (s+32)*(s+7.2408)*(s-1) ) ;

Build synthesis interconnection including reference model Gref

num = 11.11; den = [1 6 11.11] ;
Gref = tf(num , den); % reference model
G = ss(Gmodel{1});
io = getlinio('TwoDOF');                % r, zu, e and y  I/Os channels
Blocks = {'TwoDOF/Ksim','TwoDOF/Fsim'}; % sub-blocks to be optimized by |hinfstruct|

Define weighting functions

W1 = (0.25*s+0.6)/(s+0.006); % emphasize low frequency range for performance

Define controller blocks of 2-DOF control architecture

K = ltiblock.pid('K','pid');      % PID feedback
F = ltiblock.ss('F',2, nu, ny );  % feed-forward block of order 2
C0 = blkdiag(K,F);                % gather all blocks

Define and aggregate all tracking performance for all models

AllPerf = [];
for ii = 1:10
    G = ss(Gmodel{ii}) ;
    Pperf = linlft('TwoDOF',io([1 3]),Blocks);       % r -> e  perf
    Pu    = linlft('TwoDOF',io([1 2]),Blocks);       % penalize control signal
    AllPerf = blkdiag(AllPerf, W1*lft(Pperf , C0) );
end
CL0 = AllPerf ;

Run hinfstruct with restarts

op = hinfstructOptions('RandomStart',2,'Display','final');
[CL,gam] = hinfstruct(CL0, op);
Final: Failed to meet closed-loop stability constraint (spectral abscissa = 0.072)
Final: Peak gain = 0.0508, Iterations = 182
Final: Peak gain = 0.0631, Iterations = 157

Recover feedback and feed-forward blocks in transfer function format

Kpid = pid(CL.Blocks.K), Ftf = tf(CL.Blocks.F),
Continuous-time PIDF controller in parallel form:
 
           1            s    
Kp + Ki * --- + Kd * --------
           s          Tf*s+1 
 
With Kp = 6.54, Ki = 3.13, Kd = 0.467, Tf = 0.0994
 
 
Transfer function:
103.6 s^2 - 4.253e04 s - 6.77e04
--------------------------------
    s^2 + 4023 s + 2.457e04
 

Simulate set-point responses of all operational modes

figure(9); clf;
for ii = 1:10
  G = ss(Gmodel{ii}) ;
  Psim= linlft('TwoDOF',io([1 4]),Blocks);       % r -> y
  CLsim = lft(Psim, blkdiag(Kpid,Ftf) );
  step(CLsim , 5);  hold on;
end
step(Gref,5);  grid;
hold off;