www.gusucode.com > ident_featured 案例代码 matlab源码程序 > ident_featured/idnlbbdemo_customreg.m

    %% Nonlinear ARX Models with Custom Regressors
% This example shows how to use custom regressors in nonlinear ARX
% (IDNLARX) models, including single-input-single-output (SISO) and
% multi-input-multi-output (MIMO) systems.

% Copyright 2005-2014 The MathWorks, Inc.

%% Introduction
% In an IDNLARX model, each output is a function of regressors which are
% transformations of past inputs and past outputs. Typical regressors are
% simply delayed input or output variables. They are referred to as
% STANDARD REGRESSORS. It is also possible to use more advanced 
% regressors in the form of arbitrary user-defined functions of delayed 
% input and output variables. Such regressors are referred to as CUSTOM
% REGRESSORS. 
%
% Consider the example of an electric system with both the voltage V 
% and the current I as inputs. If it is known that the electric power is 
% an important quantity of the system, then it makes sense to form the 
% custom regressor V*I. It may be more efficient to use appropriately 
% defined custom regressors than to use standard regressors only.

%% SISO Example: Modeling an Internal Combustion Engine
% The file icEngine.mat contains one data set with 1500 input-output 
% samples collected at the a sampling rate of 0.04 second. The input u(t) 
% is the voltage [V] controlling the By-Pass Idle Air Valve (BPAV), and the
% output y(t) is the engine speed [RPM/100]. The data is loaded and split
% into a data set ze for model estimation and another data set zv for model
% validation.

load icEngine
z = iddata(y,u, 0.04);
ze = z(1:1000); 
zv = z(1001:1500); 

%% Model Orders
% Model orders [na nb nk], which are also used in the linear ARX model,
% allow to easily define standard regressors. The choice of model orders 
% requires trials and errors. For this example let us use 
% [na nb nk] = [4 2 10], corresponding to the standard regressors
% y(t-1),y(t-2),y(t-3),y(t-4),u(t-10),u(t-11).

%%
% First try with the standard regressors only. Notice that the LINEAR 
% estimator is used, thus the resulting model is similar to a linear ARX
% model.

m0 = nlarx(ze, [4 2 10], linear);

%%
% The input name, output name and the list of regressors of this model
% are displayed below. Notice that the default names 'u1', 'y1' are used.

m0.InputName
m0.OutputName
getreg(m0)

%% Simple Regressors Defined by Character Vectors
% Simple custom regressors can be created in the character vector form as in the
% following example.

m1 = nlarx(ze, [4 2 10], linear, 'customreg', {'u1(t-10)^2', 'y1(t-1)^2'});

%%
% The total list of regressors, both standard and custom, is returned by
% GETREG.

getreg(m1)

%%
% Let us compare the two models on the validation data set zv.
compare(zv,m0,m1)

%%
% Custom regressors can be defined from any past input and output
% variables, not necessarily within the list of standard regressors. In the
% following example, there is no standard regressor at all.
m2 = nlarx(ze, [0 0 0], 'linear', 'customreg', ...
           {'u1(t-10)^3', 'u1(t-11)^3', 'y1(t-1)', 'sin(y1(t-4))'});
getreg(m2)

%% Polynomial Regressors
% Polynomial regressors can be easily created with the command POLYREG.

m3 = nlarx(ze, [4 2 10], 'lin');
pr = polyreg(m3, 'maxpower', 2, 'crossterm', 'off');
m3 = addreg(m3, pr);
m3 = nlarx(ze, m3);

getreg(m3)

%% The Custom Regressor Object Constructor
% The character vector form is convenient for the creation of simple custom
% regressors. The custom regressor object constructor is more powerful for
% the creation of arbitrary regressors.
%
% In the following example, a regressor is created as the cos function of
% the variable named 'u1' and delayed 10 samples, in other words:
% r1 = cos(u1(t-10)). The logic value at the last input argument indicates if 
% the custom regressor is vectorized or not. Vectorized regressors are
% faster in computations, but require cares in the function indicated at
% the first input argument.

r1 = customreg(@cos, 'u1', 10, true) 

%%
% In this example, 3 variables are involved. Notice the operator ".*"
% instead of "*" for vectorized regressor.

F = @(x1,x2,x3)sin(x1.*x2+x3); % Anonymous function
r2 = customreg(F, {'y1', 'u1', 'u1'}, [1 10 11], true)

%%
% The two created custom regressors can be used in an IDNLARX model. 

m4 = nlarx(ze, [4 2 10], 'lin', 'customreg',  [r1;r2]);
getreg(m4)

%% Using Custom Regressors with Nonlinearity Estimators
% Typically the LINEAR estimator is used with custom regressors, as in the
% previous examples. It is also possible to apply nonlinearity estimators.
 
m5 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2]);
getreg(m5)

%%
% Because custom regressors are typically nonlinear, there is thus a
% redundancy of nonlinearity when a nonlinearity estimator is applied to
% custom regressors. To avoid such redundancy, custom regressors can be
% excluded from the nonlinear block of the IDNLARX model, by specifying
% that only the standard regressors are nonlinear.

m6 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2], 'nlreg', 'standard');
m6.nlreg % Indices of nonlinear regressors in the following list.
getreg(m6)

%%
% The various models can be compared together (may take a long time).

compare(zv, m1,m2,m3,m4,m5,m6)

%% MIMO Example: Modeling a Motorized Camera
% The file motorizedcamera.mat contains one data set with 188 data 
% samples, collected from a motorized camera at a sampling rate of 0.02 
% second. 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 axis [rad/s]. The output vector y(t) contains 2 variables: the 
% position (in pixel) 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');

%%
% Using custom regressors in the MIMO case is not very different from the 
% SISO case. It essentially needs to know that each output has its own
% custom regressors. The custom regressors of all the outputs are packed
% into a cell array before being inserted into the MIMO IDNLARX model.
%
% When the character vector form is used, the custom regressors are given as an
% ny-by-1 cell array of cell arrays of character vectors, ny being the number of
% outputs of the model.

nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)];
m11 = nlarx(z, nanbnk, 'lin', 'customreg', ...
      {{'u1(t-1)^2', 'y2(t-1)^3'};{'u5(t-1)*u6(t-1)'}});

%%
% The custom regressor constructor can also be used. The following 
% regressors are equivalent to the previous ones created in the character vector 
% form, except that here the regressors can be made vectorized with the 
% custom regressor constructor.

F1 = @(x)x.^2;
r1 = customreg(F1, 'u1', 1, true);
F2 = @(x)x.^3;
r2 = customreg(F2, 'y2', 1, true);
F3 = @(x1,x2)x1.*x2;
r3 = customreg(F3, {'u5','u6'}, [1 1], true);

m12 = nlarx(z, nanbnk, 'lin', 'customreg', {[r1; r2], r3});

%% 
% The numerical equivalence of the two models can be checked by comparing
% them with the data.

compare(z,m11,m12)

%% Additional Information
% For more information on identification of dynamic systems with System Identification Toolbox(TM) 
% visit the
% <http://www.mathworks.com/products/sysid/ System Identification Toolbox> product
% information page.