www.gusucode.com > robust_featured 案例源码程序 matlab代码 > robust_featured/ucover_demo.m

    %% Modeling a Family of Responses as an Uncertain System
% This example shows how to use the Robust Control Toolbox(TM)
% command |ucover| to model a family of LTI responses as 
% an uncertain system. This command is useful to fit an uncertain 
% model to a set of frequency responses representative of the system
% variability, or to reduce the complexity
% of an existing uncertain model to facilitate the synthesis of
% robust controllers with |dksyn|.

%   Copyright 1986-2012 The MathWorks, Inc.

%% Modeling Plant Variability as Uncertainty
% In this first example, we have a family of models describing the plant
% behavior under various operating conditions. The nominal plant model 
% is a first-order unstable system.

Pnom = tf(2,[1 -2])

%%
% The other models are variations of |Pnom|. They all have a single unstable 
% pole but the location of this pole may vary with the operating condition.

p1 = Pnom*tf(1,[.06 1]);              % extra lag
p2 = Pnom*tf([-.02 1],[.02 1]);       % time delay
p3 = Pnom*tf(50^2,[1 2*.1*50 50^2]);  % high frequency resonance
p4 = Pnom*tf(70^2,[1 2*.2*70 70^2]);  % high frequency resonance
p5 = tf(2.4,[1 -2.2]);                % pole/gain migration
p6 = tf(1.6,[1 -1.8]);                % pole/gain migration

%%
% To apply robust control tools, we can replace this set of models
% with a single uncertain plant model whose range of behaviors includes 
% |p1| through |p6|.
% This is one use of the command |ucover|.  This command takes
% an array of LTI models |Parray| and a nominal model |Pnom| and
% models the difference |Parray-Pnom| as multiplicative uncertainty in 
% the system dynamics.
%
% Because |ucover| expects an array of models, use the |stack|
% command to gather the plant models |p1| through |p6| into one array.

Parray = stack(1,p1,p2,p3,p4,p5,p6); 

%%
% Next, use |ucover| to "cover" the range of behaviors |Parray| with an
% uncertain model of the form
%
%  P = Pnom * (1 + Wt * Delta)
%
% where all uncertainty is concentrated in the "unmodeled dynamics"
% |Delta| (a |ultidyn| object). Because the gain of |Delta| is uniformly 
% bounded by 1 at all frequencies, a "shaping" filter |Wt| is used 
% to capture how the relative amount of uncertainty varies with frequency.
% This filter is also referred to as the uncertainty weighting function.
% 
% Try a 4th-order filter |Wt| for this example:

orderWt = 4;
Parrayg = frd(Parray,logspace(-1,3,60));
[P,Info] = ucover(Parrayg,Pnom,orderWt,'InputMult');

%%
% The resulting model |P| is a single-input, single-output uncertain state-space (USS)
% object with nominal value |Pnom|.

P

%%
tf(P.NominalValue)

%% 
% A Bode magnitude plot confirms that the shaping filter |Wt| "covers" 
% the relative variation in plant behavior.
% As a function of frequency, the uncertainty level is 
% 30% at 5 rad/sec (-10dB = 0.3) , 50% at 10 rad/sec, and 100% beyond 29 rad/sec.

Wt = Info.W1;
bodemag((Pnom-Parray)/Pnom,'b--',Wt,'r'); grid
title('Relative Gaps vs. Magnitude of Wt')

%% 
% You can now use the uncertain model |P| to design a robust controller for the original
% family of plant models, see <docid:robust_examples.example-ex90119326> for
% details.



%% Simplifying an Existing Uncertain Model
% In this second example, we start with a detailed uncertain model of the plant.
% This model consists of first-order dynamics with uncertain gain and 
% time constant, in series with a mildly underdamped resonance and 
% significant unmodeled dynamics.   This model is created using
% the |ureal| and |ultidyn| commands for specifying uncertain variables:

gamma = ureal('gamma',2,'Perc',30);  % uncertain gain
tau = ureal('tau',1,'Perc',30);      % uncertain time-constant
wn = 50; xi = 0.25;
P = tf(gamma,[tau 1]) * tf(wn^2,[1 2*xi*wn wn^2]);

% Add unmodeled dynamics and set SampleStateDim to 5 to get representative
% sample values of the uncertain model P
delta = ultidyn('delta',[1 1],'SampleStateDim',5,'Bound',1);
W = makeweight(0.1,20,10);
P = P * (1+W*delta)

%%
% A collection of step responses illustrates the plant variability.

step(P,4)
title('Sampled Step Responses of Uncertain System')


%%
% The uncertain plant model |P| contains 3 uncertain elements.
% For control design purposes, it is often desirable to simplify this
% uncertainty model while approximately retaining its overall variability.
% This is another use of the command |ucover|.
%
% To use |ucover| in this context, first map the uncertain model |P| into an
% array of LTI models using |usample|. This command samples the uncertain elements in 
% an uncertain system and returns the corresponding LTI models, each model
% representing one possible behavior of the uncertain system.
% In this example, sample |P| at 60 points (the random number generator is 
% seeded for repeatability):

rng(0,'twister');
Parray = usample(P,60);

%%
% Next, use |ucover| to cover all behaviors in |Parray| by a simple
% uncertainty model |Usys|. Choose the nominal value of |P| as 
% center of the cover, and use a 2nd-order filter to model 
% the frequency distribution of the unmodeled dynamics.

orderWt = 2;
Parrayg = frd(Parray,logspace(-3,3,60));
[Usys,Info] = ucover(Parrayg,P.NominalValue,orderWt,'InputMult');

%%
% A Bode magnitude plot shows how the filter magnitude (in red) "covers" the 
% relative variability of the plant frequency response (in blue).

Wt = Info.W1;
bodemag((P.NominalValue-Parray)/P.NominalValue,'b--',Wt,'r')
title('Relative Gaps (blue) vs. Shaping Filter Magnitude (red)')

%% 
% You can now use the simplified uncertainty model |Usys| to design a robust 
% controller for the original plant, see <docid:robust_examples.example-ex80678924> for details.


%% Adjusting the Uncertainty Weighting
% In this third example, we start with 40 frequency responses of a 
% 2-input, 2-output system. This data has been collected with a 
% frequency analyzer under various operating conditions. A two-state 
% nominal model is fitted to the most typical response:

A = [-5 10;-10 -5];
B = [1 0;0 1];
C = [1 10;-10 1];
D = 0;
Pnom = ss(A,B,C,D);

%%
% The frequency response data is loaded into a 40-by-1 array of
% FRD models:

load ucover_demo
size(Pdata)

%%
% Plot this data and superimpose the nominal model.
bode(Pdata,'b--',Pnom,'r',{.1,1e3}), grid
legend('Frequency response data','Nominal model','Location','NorthEast')

%%
% Because the response variability is modest, try modeling this family
% of frequency responses using an additive uncertainty model of the form
%
%  P = Pnom + w * Delta
%
% where |Delta| is a 2-by-2 |ultidyn| object representing the unmodeled 
% dynamics and |w| is a scalar weighting function reflecting the frequency
% distribution of the uncertainty (variability in Pdata).
%
% Start with a first-order filter |w| and compare the magnitude of |w| with 
% the minimum amount of uncertainty needed at each frequency:

[P1,InfoS1] = ucover(Pdata,Pnom,1,'Additive');
w = InfoS1.W1;
bodemag(w,'r',InfoS1.W1opt,'g',{1e-1 1e3})
title('Scalar Additive Uncertainty Model')
legend('First-order w','Min. uncertainty amount','Location','SouthWest')

%%
% The magnitude of |w| should closely match the minimum uncertainty amount.
% It is clear that the first-order fit is too conservative and
% exceeds this minimum amount at most frequencies.  Try again with a third-order 
% filter |w|. For speed, reuse the data in |InfoS1| to avoid recomputing
% the optimal uncertainty scaling at each frequency.

[P3,InfoS3] = ucover(Pnom,InfoS1,3,'Additive');
w = InfoS3.W1;
bodemag(w,'r',InfoS3.W1opt,'g',{1e-1 1e3})
title('Scalar Additive Uncertainty Model')
legend('Third-order w','Min. uncertainty amount','Location','SouthWest')

%%
% The magnitude of |w| now closely matches the minimum uncertainty amount.
% Among additive uncertainty models, |P3| provides a tight 
% cover of the behaviors in |Pdata|. Note that |P3| has a total of 8 states 
% (2 from the nominal part and 6 from |w|).

P3

%% 
% You can refine this additive uncertainty model by using
% non-scalar uncertainty weighting functions, for example
% 
%   P = Pnom + W1*Delta*W2
%
% where |W1| and |W2| are 2-by-2 diagonal filters. In this example, restrict
% use |W2=1| and allow both diagonal entries of W1 to be third order.

[PM,InfoM] = ucover(Pdata,Pnom,[3;3],[],'Additive');

%%
% Compare the two entries of |W1| with the 
% minimum uncertainty amount computed earlier.  Note that
% at all frequencies, one of the diagonal entries of |W1| has magnitude much smaller 
% than the scalar filter |w|. This suggests that the diagonally-weighted 
% uncertainty model yields a less conservative cover of the frequency response 
% family.

bodemag(InfoS1.W1opt,'g*',...
    InfoM.W1opt(1,1),'r--',InfoM.W1(1,1),'r',...
    InfoM.W1opt(2,2),'b--',InfoM.W1(2,2),'b',{1e-1 1e3});
title('Diagonal Additive Uncertainty Model')
legend('Scalar Optimal Weight',...
    'W1(1,1), pointwise optimal',...
    'W1(1,1), 3rd-order fit',...
    'W1(2,2), pointwise optimal',...
    'W1(2,2), 3rd-order fit',...
    'Location','SouthWest')

%%
% The degree of conservativeness of one cover over another can
% be partially quantified by considering the two frequency-dependent
% quantities:
%
%  Fd2s = norm(inv(W1)*w) ,   Fs2d = norm(W1/w)
%
% These quantities measure by how much one uncertainty model needs to be 
% scaled to cover the other. For example, the uncertainty model
% |Pnom + W1*Delta| needs to be enlarged by a factor |Fd2s| 
% to include all of the models represented by the uncertain model
% |Pnom + w*Delta|.
%
% Plot |Fd2s| and |Fs2d| as a function of frequency.

Fd2s = fnorm(InfoS1.W1opt*inv(InfoM.W1opt));
Fs2d = fnorm(InfoM.W1opt*inv(InfoS1.W1opt));
semilogx(fnorm(Fd2s),'b',fnorm(Fs2d),'r'), grid
axis([0.1 1000 0.5 2.6])
xlabel('Frequency (rad/s)'), ylabel('Magnitude')
title('Scale factors relating different covers')
legend('Diagonal to Scalar factor',...
    'Scalar to Diagonal factor','Location','SouthWest');

%%
% This plot shows that:
%
% * |Fs2d = 1| in a large frequency range so |Pnom+w*Delta| 
% includes all the behaviors modeled by |Pnom+W1*Delta|
%
% * In that same frequency range, |Pnom+W1*Delta| 
% does not include all of the behaviors  modeled by |Pnom+w*Delta|
% and, in fact, would need to be enlarged by a factor between
% 1.2 and 2.6 in order to do so.
%
% * In the frequency range [1 20], neither uncertainty model contains the
% other, but at all frequencies, making |Pnom+W1*Delta|
% cover |Pnom+w*Delta| requires a much smaller scaling factor than the converse.
%
% This indicates that the |Pnom+W1*Delta| model provides a less conservative
% cover of the frequency response data in |Pdata|.