www.gusucode.com > ident_featured 案例代码 matlab源码程序 > ident_featured/idnlbbdemo_mimo.m
%% Motorized Camera - Multi-Input Multi-Output Nonlinear ARX and Hammerstein-Wiener Models % This example shows how to estimate multi-input multi-output (MIMO) % nonlinear black box models from data. Two types of nonlinear black box % models are offered in the toolbox - Nonlinear ARX and Hammerstein-Wiener % models. % Copyright 2005-2015 The MathWorks, Inc. %% The Measured Data Set % The data saved in the file motorizedcamera.mat will be used in this % example. It contains 188 data samples, collected from a motorized camera % with a sample time of 0.02 seconds. The input vector u(t) is % composed of 6 variables: the 3 translation velocity components in the % orthogonal X-Y-Z coordinate system fixed to the camera [m/s], and the 3 % rotation velocity components around the X-Y-Z axes [rad/s]. The output % vector y(t) contains 2 variables: the position (in pixels) of a point % which is the image taken by the camera of a fixed point in the 3D space. % We create an IDDATA object z to hold the loaded data: % load motorizedcamera z = iddata(y, u, 0.02, 'Name', 'Motorized Camera', 'TimeUnit', 's'); %% Nonlinear ARX (IDNLARX) Model - Preliminary Estimation Using Wavenet % Let us first try nonlinear ARX models. Two important elements % need to be chosen: the model orders and the nonlinearity estimators. % To try simple things first, let us choose the orders % [na nb nk] = [ones(2,2), ones(2,6), ones(2,6)]. It means that each % output variable is predicted by all the output and input variables, % each being delayed by 1 sample. By using vector notations, the model can % be written in the form of model_output(t) = F(y(t-1), u(t-1)). Let us % choose Wavelet Network (wavenet) as nonlinearity estimator, thus the % vectorial nonlinear function F will be estimated by two wavelet % networks. The function nlarx facilitates estimation of Nonlinear ARX % models. % mw1 = nlarx(z, [ones(2,2), ones(2,6), ones(2,6)], wavenet); %% % Examine the result by comparing the output simulated with the estimated % model and the output in the measured data z: % compare(z,mw1) %% Nonlinear ARX Model - Trying Higher Orders % Let us see if we can do better with higher orders. Note that when % identifying models using basis function expansions to express the % nonlinearity, the number of model parameters can exceed the number of % data samples. In such cases, some estimation metrics such as Noise % Variance and Final Prediction Error (FPE) cannot be reliably calculated. % For the current example, we turn off the warning informing us about this % limitation. ws = warning('off','Ident:estimation:NparGTNsamp'); % mw2 = nlarx(z, [ones(2,2), 2*ones(2,6), ones(2,6)], wavenet); compare(z,mw2) %% % The second model mw2 is pretty good. So let us keep this choice of model % orders in the following examples. % nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)]; %% % The numbers of units (wavelets) of the two WAVENET estimators have been % automatically chosen by the estimation algorithm. These numbers are % displayed below. Notice the abbreviations 'nl'='Nonlinearity' and % 'num'='NumberOfUnits'. % mw2.Nonlinearity(1).NumberOfUnits %using full property names mw2.nl(2).num %using short-hand notations %% Nonlinear ARX Model - Adjusting Number of Units of Nonlinearity Estimators % The number of units in the WAVENET estimators can be explicitly specified % instead of being automatically chosen by the estimation algorithm: mw3 = nlarx(z, nanbnk, [wavenet('num',10); wavenet('num',5)]); %% Nonlinear ARX Model - Trying Other Nonlinearity Estimators % At the place of the WAVENET estimator, other nonlinearity estimators can % also be used. Let us try the TREEPARTITION estimator. % mt1 = nlarx(z, nanbnk, 'treepartition'); %% % In the above call, we have used a character vector ('treepartition') in % place of an object % to specify the nonlinearity estimator. % However, this works only if the nonlinearity is to be used with default % property values. In the following example, the treepartition object % constructor is called to directly create a nonlinearity estimator object. mt2 = nlarx(z, nanbnk, treepartition); %% % The SIGMOIDNET estimator can also be used. Estimation options such as % maximum iterations (MaxIter) and iteration display can be specified using % NLARXOPTIONS command. opt = nlarxOptions('Display','on'); opt.SearchOption.MaxIter = 2; ms1 = nlarx(z, nanbnk, 'sigmoidnet', opt); %% Nonlinear ARX Model with Mixed Nonlinearity Estimators % It is possible to use different nonlinearity estimators on different % output channels in the same model. Suppose we want to use a tree % partition nonlinearity estimator for prediction of first output and use a % wavelet network for prediction of the second output. The model estimation % is shown below. The third input argument (nonlinearity) is now an array of % two different nonlinearity estimator objects. mtw = nlarx(z, nanbnk, [treepartition; wavenet]); %% % The absence of nonlinearity in an output channel can be indicated by % choosing a LINEAR estimator. The following example means that, in % model_output(t) = F(y(t-1), u(t-1), u(t-2)), the function F is composed % of a linear component and a nonlinear component (SIGMOIDNET). opt.Display = 'off'; % do not show estimation progress anymore mls = nlarx(z, nanbnk, [linear; sigmoidnet('NumberOfUnits',5)], opt); % no nonlinearity on first output %% Inspection of Estimation Results % Various models can be compared in the same COMPARE command. % compare(z, mw2, ms1, mls) %% % Function PLOT may be used to view the nonlinearity responses of various % models. plot(mt1,mtw,ms1,mls) %% % Note that the control panel on the right hand side of the plot allows for % regressor selection and configuration. %% % Other functions such as RESID, PREDICT and PE may be used on the % estimated models in the same way as in the case of linear models. %% Hammerstein-Wiener (IDNLHW) Model - Preliminary Estimation % A Hammerstein-Wiener model is composed of up to 3 blocks: a linear % transfer function block is preceded by a nonlinear static block and/or % followed by another nonlinear static block. It is called a Wiener model % if the first nonlinear static block is absent, and a Hammerstein model if % the second nonlinear static block is absent. % % IDNLHW models are typically estimated using the syntax: % % M = NLHW(Data, Orders, InputNonlinearity, OutputNonlinearity). % % where Orders = [nb bf nk] specifies the orders and delay of the linear % transfer function. InputNonlinearity and OutputNonlinearity specify the % nonlinearity estimators for the two nonlinear blocks. The linear output % error (OE) model corresponds to the case of trivial identity (UNITGAIN) % nonlinearities. %% Estimation of Hammerstein Model (No Output Nonlinearity) % Let us choose Orders = [nb bf nk] = [ones(2,6), ones(2,6), ones(2,6)]. It % means that, in the linear block, each output is the sum of 6 first order % transfer functions driven by the 6 inputs. Try a Hammerstein model (no % output nonlinearity) with the piecewise linear estimator. % Notice that the entered single PWLINEAR object is automatically expanded % to all the 6 input channels. UNITGAIN indicates absence of nonlinearity. % opt = nlhwOptions(); opt.SearchOption.MaxIter = 2; mhw1 = nlhw(z,[ones(2,6), ones(2,6), ones(2,6)], pwlinear, unitgain, opt); %% % Examine the result with COMPARE. % compare(z, mhw1); %% % Model properties can be visualized by the PLOT command. % % Click on the block-diagram to choose the view of the input nonlinearity % (UNL), the linear block or the output nonlinearity (YNL). % % When the linear block view is chosen, by default all the 12 channels are % shown in very reduced sizes. Choose one of the channels to have a better % view. It is possible to choose the type of plots within Step response, % Bode plot, Impulse response and Pole-zero map. plot(mhw1) %% % The result shown by COMPARE was quite good, so let us keep the same model % orders in the following trials. % nbnfnk = [ones(2,6), ones(2,6), ones(2,6)]; %% Estimation of Wiener Model (No Input Nonlinearity) % Let us try a Wiener model. Notice that the absence of input nonlinearity % can be indicated by "[]" instead of the UNITGAIN object. % opt.SearchOption.MaxIter = 4; mhw2 = nlhw(z, nbnfnk, [], 'pwlinear', opt); %% Estimation of Hammerstein-Wiener Model (Both Input and Output Nonlinearities) % Indicate both input and output nonlinearities for a Hammerstein-Wiener % model. As in the case of Nonlinear ARX models, we can use a character % vector (rather than object) to specify the nonlinearity estimator. % mhw3 = nlhw(z, nbnfnk,'saturation', 'pwlinear', opt); %% % The limit values of the SATURATION estimators can be accessed. % The short-hands 'u'='input', 'y'='output', and 'nl'='Nonlinearity' are % available. % mhw3.InputNonlinearity(1).LinearInterval % view Linear Interval of SATURATION mhw3.unl(3).LinearInterval % access using using short-hand notation %% % The break points of the PWLINEAR estimator can also be accessed. mhw3.OutputNonlinearity(1).BreakPoints %% Hammerstein-Wiener Model - Using Mixed Nonlinearity Estimators % Different nonlinearity estimators can be mixed in a same model. Suppose % we want a model with: % - No nonlinearity on any output channels ("Hammerstein Model") % - Piecewise linear nonlinearity on input channel #1 with 3 units % - Saturation nonlinearity on input channel #2 % - Dead Zone nonlinearity on input channel #3 % - Sigmoid Network nonlinearity on input channel #4 % - No nonlinearity (specified by a unitgain object) on input channel #5 % - Sigmoid Network nonlinearity on input channel #6 with 5 units % % We can create an array of nonlinearity object estimators of chosen types % and pass it to the estimation function NLHW as input nonlinearity. % inputNL = [pwlinear('num',3); saturation; deadzone; sigmoidnet; unitgain; sigmoidnet('num',5)]; opt.SearchOption.MaxIter = 2; mhw4 = nlhw(z, nbnfnk, inputNL, [], opt); % "[]" for 4th input denotes no output nonlinearity %% Hammerstein-Wiener Model - Specifying Initial Guess for SATURATION and DEADZONE Estimators % The initial guess for the linear interval of SATURATION and the zero % interval of DEADZONE can be directly indicated when the estimator objects % are created. Suppose we want to set the saturation's linear interval % to [10 200] and the deadzone's zero interval to [11 12] as initial guesses. % mhw5 = idnlhw(nbnfnk, [], [saturation([10 200]); deadzone([11 12])],'Ts',z.Ts); % Create nonlinearity estimator with initial guesses for properties. % Notice the use of the IDNLHW model object constructor idnlhw, not the % estimator nlhw. The resulting model object mhw5 is not yet estimated from % data. %% % The limit values of the saturation and deadzone estimators can be % accessed. They still have their initial values, because they are not yet % estimated from data. mhw5.outputNL(1).LinearInterval % show linear interval on saturation at first output channel after estimation mhw5.yNL(2).ZeroInterval % show zero interval on dead zone at second output channel after estimation %% % What are the values of these limits after estimation? opt.SearchOption.MaxIter = 5; mhw5 = nlhw(z, mhw5, opt); % estimate the model from data mhw5.outputNL(1).LinearInterval % show linear interval on saturation at first output channel after estimation mhw5.yNL(2).ZeroInterval % show zero interval on dead zone at second output channel after estimation %% Post Estimation Analysis - Comparing Different Models % Models of different nature (IDNLARX and IDNLHW) can be compared in the % same COMPARE command. % compare(z,mw2,mhw1) warning(ws) % reset the warning state %% Additional Information % For more information on identification of dynamic systems with System % Identification Toolbox visit the % <http://www.mathworks.com/products/sysid/ System Identification Toolbox> product % information page.