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

    %% Simultaneous Stabilization Using Robust Control
% This example uses the Robust Control Toolbox(TM) commands |ucover|
% and |dksyn| to design a high-performance controller for a family of
% unstable plants.

%   Copyright 1986-2012 The MathWorks, Inc.

%% Plant Uncertainty
% The nominal plant model consists of a first-order unstable system.

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

%%
% The family of perturbed plants are variations of |Pnom|.  All plants
% have a single unstable pole but the location of this pole varies 
% across the family.

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

%% Covering the Uncertain Model
% For feedback design purposes, we need to 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')


%% Creating the Open-loop Design Model
% To design a robust controller for the uncertain plant model |P|,
% we choose a desired closed-loop bandwidth and minimize the sensitivity
% to disturbances at the plant output. The control structure is shown below. 
% The signals |d| and |n| are the load disturbance and measurement noise.
% The controller uses a noisy measurement
% of the plant output |y| to generate the control signal |u|.
% 
% <<../designdemoIC.png>>
% 
% *Figure 1*: Control Structure. 
%
% The filters |Wperf| and |Wnoise| are selected to enforce the desired 
% bandwidth and some adequate roll-off. The closed-loop transfer function from
% |[d;n]| to |y| is 
%
%      y = [Wperf * S , Wnoise * T] [d;n]
%
% where |S=1/(1+PC)| and |T=PC/(1+PC)| are the sensitivity 
% and complementary sensitivity functions.
% If we design a controller that keeps the closed-loop gain from |[d;n]| 
% to |y| below 1, then
%
%      |S| < 1/|Wperf| ,    |T| < 1/|Wnoise|
%
% By choosing appropriate magnitude profiles for |Wperf| and |Wnoise|, we 
% can enforce small sensitivity (|S|) inside the bandwidth and adequate 
% roll-off (|T|) outside the bandwidth.
%
% For example, choose |Wperf| as a first-order low-pass filter with a 
% DC gain of 500 and a gain crossover at the desired bandwidth |desBW|: 

desBW = 4.5;
Wperf = makeweight(500,desBW,0.33);
tf(Wperf)

%%
% Similarly, pick |Wnoise| as a second-order high-pass filter
% with a magnitude of 1 at |10*desBW|.  This will 
% force the open-loop gain |PC| to roll-off with a slope of -2 for 
% frequencies beyond |10*desBW|.  

NF = (10*desBW)/20;  % numerator corner frequency
DF = (10*desBW)*50;  % denominator corner frequency
Wnoise = tf([1/NF^2  2*0.707/NF  1],[1/DF^2  2*0.707/DF  1]);
Wnoise = Wnoise/abs(freqresp(Wnoise,10*desBW))

%%
% Verify that the bounds |1/Wperf| and |1/Wnoise| on |S| and |T| 
% do enforce the desired bandwidth and roll-off.

bodemag(1/Wperf,'b',1/Wnoise,'r',{1e-2,1e3}), grid
title('Performance and roll-off specifications')
legend('Bound on |S|','Bound on |T|','Location','NorthEast')

%%
% Next use |connect| to build the open-loop interconnection (block diagram in 
% Figure 1 without the controller block). Specify each block appearing in Figure 1,
% name the signals coming in and out of each block, and let |connect| do the wiring:

P.u = 'u';   P.y = 'yp';
Wperf.u = 'd';   Wperf.y = 'Wperf';
Wnoise.u = 'n';  Wnoise.y = 'Wnoise';
S1 = sumblk('e = -ym');
S2 = sumblk('y = yp + Wperf');
S3 = sumblk('ym = y + Wnoise');
G = connect(P,Wperf,Wnoise,S1,S2,S3,{'d','n','u'},{'y','e'});

%%
% |G| is a 3-input, 2-output uncertain system suitable
% for robust controller synthesis with |dksyn|. 
%
% <<../unstableplantOlic.png>>


%% Robust Controller Synthesis
% The design is carried out with the automated robust design
% command |dksyn|. The target bandwidth is 4.5 rad/s.

ny = 1; nu = 1;
[C,CL,muBound] = dksyn(G,ny,nu);
muBound

%%
% When the robust performance indicator |muBound| is near 1, the controller achieves
% the target closed-loop bandwidth and roll-off. As a rule of thumb, if |muBound| is 
% less than 0.85, then the performance can be improved upon, and if |muBound| is greater 
% than 1.2, then the desired closed-loop bandwidth is not achievable for 
% the specified plant uncertainty.
%
% Here |muBound| is approximately 1 so the objectives  are met. The resulting controller
% |C| has 18 states:

size(C)

%%
% Use the |reduce| command to simplify this controller and approximate it 
% with a 6th-order controller.

Cr = reduce(C,6);
opt = bodeoptions;
opt.Grid = 'on';
opt.PhaseMatching = 'on';
bodeplot(C,'b',Cr,'r--',opt)
legend('18-state controller C','6-state controller Cr','Location','SouthWest')

%% Robust Controller Validation 
% Plot the open-loop responses of the plant models |p1| through |p6|
% with the simplified controller |Cr|. 
bodeplot(Parray*Cr,'g',{1e-2,1e3},opt);

%%
% Plot the responses to a step disturbance at the plant output. These 
% are consistent with the desired closed-loop bandwidth and robust to 
% the plant variations, as expected from a Robust Performance mu-value of 
% approximately 1.

step(feedback(1,Parray*Cr),'g',10/desBW);

%% Varying the Target Closed-Loop Bandwidth
% The same design process can be repeated for different closed-loop bandwidth
% values |desBW|.  Doing so yields the following results:
%
% * Using |desBW| = 8 yields a good design with robust performance |muBound|
% of 1.09. The step responses across the |Parray| family are
% consistent with a closed-loop bandwidth of 8 rad/s.
%
% * Using |desBW| = 20 yields a poor design with robust performance |muBound|
% of 1.35.  This is expected because this target bandwidth is in the vicinity
% of very large plant uncertainty.  Some of the step responses for the plants 
% |p1,...,p6| are actually unstable.
%
% * Using |desBW| = 0.3 yields a poor design with robust performance |muBound|
% of 2.2.  This is expected because |Wnoise|
% imposes roll-off past 3 rad/s, which is too close to the natural 
% frequency of the unstable pole (2 rad/s). In other words, proper control
% of the unstable dynamics requires a higher bandwidth than specified.