www.gusucode.com > robust_featured 案例源码程序 matlab代码 > robust_featured/RobustControlExample.m
%% First-Cut Robust Design % This example shows how to use the Robust Control Toolbox(TM) commands |usample|, % |ucover| and |dksyn| to design a robust controller with standard % performance objectives. It can serve as a template for more complex % robust control design tasks. % Copyright 1986-2012 The MathWorks, Inc. %% Introduction % The plant model consists of a first-order system with uncertain gain and % time constant in series with a mildly underdamped resonance and % significant unmodeled dynamics. The uncertain variables are specified % using |ureal| and |ultidyn| and the uncertain plant model |P| is constructed % as a product of simple transfer functions: 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 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 for randomly sampled uncertainty values % illustrates the plant variability. step(P,5) %% Covering the Uncertain Model % The uncertain plant model |P| contains 3 uncertain elements. % For feedback design purposes, it is often desirable to simplify the % uncertainty model while approximately retaining its overall variability. % This is one use of the command |ucover|. This command % takes an array of LTI responses |Pa| and a nominal response |Pn| and % models the difference |Pa-Pn| as multiplicative uncertainty in the system % dynamics (|ultidyn|). % % To use |ucover|, first map the uncertain model |P| into a family of LTI % responses using |usample|. This command samples the uncertain elements in % an uncertain system. It returns an array of LTI models where each model % representing one possible behavior of the uncertain system. % In this example, generate 60 sample values of |P|: rng('default'); % the random number generator is seeded for repeatability Parray = usample(P,60); %% % Next, use |ucover| to cover all behaviors in |Parray| by a simple % uncertain model of the form % % Usys = Pn * (1 + Wt * Delta) % % where all the uncertainty is concentrated in the "unmodeled dynamics" % component |Delta| (a |ultidyn| object). Choose the nominal value of |P| as % center |Pn| of the cover, and use a 2nd-order shaping filter |Wt| to capture % how the relative gap between |Parray| and |Pn| varies with frequency. Pn = P.NominalValue; orderWt = 2; Parrayg = frd(Parray,logspace(-3,3,60)); [Usys,Info] = ucover(Parrayg,Pn,orderWt,'in'); %% % Verify that the filter magnitude (in red) "covers" the % relative variations of the plant frequency response (in blue). Wt = Info.W1; bodemag((Pn-Parray)/Pn,'b--',Wt,'r') %% Creating the Open-Loop Design Model % To design a robust controller for the uncertain plant |P|, % choose a target closed-loop bandwidth |desBW| and perform a % sensitivity-minimization design using the simplified uncertainty % model |Usys|. The control structure is shown in Figure 1. % The main signals are the disturbance |d|, the measurement noise |n|, % the control signal |u|, and the plant output |y|. % The filters |Wperf| and |Wnoise| reflect % the frequency content of the disturbance and noise signals, or % equivalently, the frequency bands where good disturbance % and noise rejection properties are needed. % % Our goal is to keep |y| close to zero by rejecting the disturbance |d| % and minimizing the impact of the measurement noise |n|. Equivalently, % we want to design a controller that keeps the gain from |[d;n]| to |y| % "small." Note that % % y = Wperf * 1/(1+PC) * d + Wnoise * PC/(1+PC) * n % % so the transfer function of interest consists of performance- and % noise-weighted versions of the sensitivity function % 1/(1+PC) and complementary sensitivity function PC/(1+PC). % % <<../designdemoIC.png>> % % *Figure 1*: Control Structure. %% % Choose the performance weighting function |Wperf| as % a first-order low-pass filter with magnitude greater % than 1 at frequencies below the desired closed-loop bandwidth: desBW = 0.4; Wperf = makeweight(500,desBW,0.5); %% % To limit the controller bandwidth and induce % roll off beyond the desired bandwidth, use a sensor noise % model |Wnoise| with magnitude greater than 1 at frequencies greater % than |10*desBW|: Wnoise = 0.0025 * tf([25 7 1],[2.5e-5 .007 1]); %% % Plot the magnitude profiles of |Wperf| and |Wnoise|: bodemag(Wperf,'b',Wnoise,'r'), grid title('Performance weight and sensor noise model') legend('Wperf','Wnoise','Location','SouthEast') %% % Next build the open-loop interconnection of Figure 1: Usys.InputName = 'u'; Usys.OutputName = 'yp'; Wperf.InputName = 'd'; Wperf.OutputName = 'yd'; Wnoise.InputName = 'n'; Wnoise.OutputName = 'yn'; sumy = sumblk('y = yp + yd'); sume = sumblk('e = -y - yn'); M = connect(Usys,Wperf,Wnoise,sumy,sume,{'d','n','u'},{'y','e'}); %% First Design: Low Bandwidth Requirement % The controller design is carried out with the automated robust design % command |dksyn|. The uncertain open-loop model is given by |M|. [ny,nu] = size(Usys); [K1,ClosedLoop,muBound] = dksyn(M,ny,nu); muBound %% % The |muBound| is a positive scalar. If it is near 1, then the design % is successful and the desired and effective closed-loop bandwidths match % closely. As a rule of thumb, if |muBound| is less than 0.85, then the % achievable performance can be improved. When |muBound| is greater than % 1.2, then the desired closed-loop bandwidth is not achievable for the % given amount of plant uncertainty. % % Since, here, |muBound| is approximately 0.82, the objectives are met, but % could ultimately be improved upon. For validation purposes, create % Bode plots of the open-loop response for different values of the uncertainty % and note the typical zero-dB crossover frequency and phase margin: opt = bodeoptions; opt.PhaseMatching = 'on'; opt.Grid = 'on'; bodeplot(Parray*K1,{1e-2,1e2},opt); %% % Randomized closed-loop Bode plots confirm a % closed-loop disturbance rejection bandwidth of approximately 0.4 rad/s. S1 = feedback(1,Parray*K1); % sensitivity to output disturbance bodemag(S1,{1e-2,1e3}), grid %% % Finally, compute and plot the closed-loop responses to a step disturbance at the % plant output. These are consistent with the desired % closed-loop bandwidth of 0.4, with settling times approximately 7 seconds. step(S1,8); %% % In this naive design strategy, we have correlated the noise bandwidth % with the desired closed-loop bandwidth. This simply helps limit % the controller bandwidth. A fair perspective is % that this approach focuses on output disturbance attenuation in % the face of plant model uncertainty. Sensor noise is not truly % addressed. Problems with considerable amounts of % sensor noise would be dealt with in a different manner. %% Second Design: Higher Bandwidth Requirement % Let's redo the design for a higher target bandwidth and adjusting the noise % bandwidth as well. desBW = 2; Wperf = makeweight(500,desBW,0.5); Wperf.InputName = 'd'; Wperf.OutputName = 'yd'; Wnoise = 0.0025 * tf([1 1.4 1],[1e-6 0.0014 1]); Wnoise.InputName = 'n'; Wnoise.OutputName = 'yn'; M = connect(Usys,Wperf,Wnoise,sumy,sume,{'d','n','u'},{'y','e'}); [K2,ClosedLoop2,muBound2] = dksyn(M,ny,nu); muBound2 %% % With |muBound2| about 0.99, this design achieves a good tradeoff between % performance goals and plant uncertainty. Open-loop Bode plots confirm a % fairly robust design with decent phase margins, but not as good as the lower % bandwidth design. bodeplot(Parray*K2,{1e-2,1e2},opt) %% % Randomized closed-loop Bode plots confirm a % closed-loop bandwidth of approximately 2 rad/s. The frequency response % has a bit more peaking than was seen in the lower bandwidth design, due % to the increased uncertainty in the model at this frequency. Since the % Robust Performance mu-value was 0.99, we expected some degradation in the % robustness of the performance objectives over the lower bandwidth % design. S2 = feedback(1,Parray*K2); bodemag(S2,{1e-2,1e3}), grid %% % Closed-loop step disturbance responses further illustrate the % higher bandwidth response, with reasonable robustness across the % plant model variability. step(S2,8); %% Third Design: Very Aggressive Bandwidth Requirement % Redo the design once more with an extremely optimistic % closed-loop bandwidth goal of 15 rad/s. desBW = 15; Wperf = makeweight(500,desBW,0.5); Wperf.InputName = 'd'; Wperf.OutputName = 'yd'; Wnoise = 0.0025 * tf([0.018 0.19 1],[0.018e-6 0.19e-3 1]); Wnoise.InputName = 'n'; Wnoise.OutputName = 'yn'; M = connect(Usys,Wperf,Wnoise,sumy,sume,{'d','n','u'},{'y','e'}); [K3,ClosedLoop3,muBound3] = dksyn(M,ny,nu); muBound3 %% % Since |muBound3| is greater than 1.5, the closed-loop performance goals % are not achieved under plant uncertainties. The frequency responses of the % closed-loop system have higher peaks indicating the poor performance of % the designed controller. S3 = feedback(1,Parray*K3); bodemag(S3,{1e-2,1e3}), grid %% % Similarly, step responses under uncertainties illustrate the poor % closed-loop performance. step(S3,1); %% Robust Stability Calculations % The Bode and Step response plots shown above are generated from % samples of the uncertain plant model |P|. We can use the % uncertain model directly, and assess the robust stability % of the 3 closed-loop systems. ropt = robOptions('Display','on','MussvOptions','sm5'); stabmarg1 = robstab(feedback(P,K1),ropt); %% stabmarg2 = robstab(feedback(P,K2),ropt); %% stabmarg3 = robstab(feedback(P,K3),ropt); %% % The robustness analysis reports confirm what we have observed by sampling the % closed-loop time and frequency responses. The second design is a good % compromise between performance and robustness, and the third design is % too aggressive and lacks robustness.