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

    %% Represent Nonlinear Dynamics Using MATLAB File for Grey-Box Estimation
%
% This example shows how to construct, estimate and analyze nonlinear
% grey-box models. 
%
% Nonlinear grey-box (|idnlgrey|) models are suitable for estimating
% parameters of systems that are described by nonlinear state-space
% structures in continuous or discrete time. You can use both |idgrey|
% (linear grey-box model) and |idnlgrey| objects to model linear systems.
% However, you can only use |idnlgrey| to represent nonlinear dynamics. To
% learn about linear grey-box modeling using |idgrey|, see
% <docid:ident_examples.example-ex32807792>.

%   Copyright 2005-2014 The MathWorks, Inc.

%% About the Model
% In this example, you model the dynamics of a linear DC motor using the
% |idnlgrey| object.
%
% <<../dcmotor.png>>
%
% *Figure 1:* Schematic diagram of a DC-motor.
%
% If you ignore the disturbances and choose |y(1)| as the angular position
% [rad] and |y(2)| as the angular velocity [rad/s] of the motor, you can
% set up a linear state-space structure of the following form (see Ljung,
% L. System Identification: Theory for the User, Upper Saddle River, NJ,
% Prentice-Hall PTR, 1999, 2nd ed., p. 95-97 for the derivation):
%
%     d         | 0      1   |        |   0   |
%     -- x(t) = |            | x(t) + |       | u(t)
%     dt        | 0   -1/tau |        | k/tau |
%
%               | 1   0 |
%        y(t) = |       | x(t)
%               | 0   1 |
%
% |tau| is the time-constant of the motor in [s] and |k| is the static gain
% from the input to the angular velocity in [rad/(V*s)] . See Ljung (1999)
% for how |tau| and |k| relate to the physical parameters of the motor.

%% About the Input-Output Data
%
% 1. Load the DC motor data.
load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'dcmotordata'));

%%
% 2. Represent the estimation data as an |iddata| object. 
z = iddata(y, u, 0.1, 'Name', 'DC-motor');

%%
% 3. Specify input and output signal names, start time and time units. 
z.InputName = 'Voltage';
z.InputUnit =  'V';
z.OutputName = {'Angular position', 'Angular velocity'};
z.OutputUnit = {'rad', 'rad/s'};
z.Tstart = 0;
z.TimeUnit = 's';
%%
% 4. Plot the data.
%
% The data is shown in two plot windows.
figure('Name', [z.Name ': Voltage input -> Angular position output']);
plot(z(:, 1, 1));   % Plot first input-output pair (Voltage -> Angular position).
figure('Name', [z.Name ': Voltage input -> Angular velocity output']);
plot(z(:, 2, 1));   % Plot second input-output pair (Voltage -> Angular velocity).
%%
% *Figure 2:* Input-output data from a DC-motor.

%% Linear Modeling of the DC-Motor
% 1. Represent the DC motor structure in a function.
%
% In this example, you use a MATLAB(R) file, but you can also use C
% MEX-files (to gain computational speed), P-files or function handles. For
% more information, see <docid:ident_examples.example-ex27431674>.
%%
%
% The DC-motor function is called |dcmotor_m.m| and is shown below.
% 
%    function [dx, y] = dcmotor_m(t, x, u, tau, k, varargin)
%
%    % Output equations.
%    y = [x(1);                         ... % Angular position.
%         x(2)                          ... % Angular velocity.
%        ];
%
%    % State equations.
%    dx = [x(2);                        ... % Angular velocity.
%          -(1/tau)*x(2)+(k/tau)*u(1)   ... % Angular acceleration.
%         ];
%
%
% The file must always be structured to return the following:
% 
% Output arguments:
% 
% * |dx| is the vector of state derivatives in continuous-time case, and
%   state update values in the discrete-time case.
%
% * |y| is the output equation
%
% Input arguments:
%
% * The first three input arguments must be: |t| (time), |x| (state vector,
% [] for static systems), |u| (input vector, [] for time-series). 
%
% * Ordered list of parameters follow. The parameters can be
% scalars, column vectors, or 2-dimensional matrices.
% 
% * |varargin| for the auxiliary input arguments

%%
%
% 2. Represent the DC motor dynamics using an |idnlgrey| object.
%
% The model describes how the inputs generate the outputs using the state
% equation(s).
FileName      = 'dcmotor_m';       % File describing the model structure.
Order         = [2 1 2];           % Model orders [ny nu nx].
Parameters    = [1; 0.28];         % Initial parameters. Np = 2.
InitialStates = [0; 0];            % Initial initial states.
Ts            = 0;                 % Time-continuous system.
nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts, ...
                'Name', 'DC-motor');
%%
%
% In practice, there are disturbances that affect the outputs. An
% |idnlgrey| model does not explicitly model the disturbances, but assumes
% that these are just added to the output(s). Thus, |idnlgrey| models are
% equivalent to Output-Error (OE) models. Without a noise model, past
% outputs do not influence prediction of future outputs, which means that
% predicted output for any prediction horizon k coincide with simulated
% outputs.
%%
%
% 3. Specify input and output names, and units.
set(nlgr, 'InputName', 'Voltage', 'InputUnit', 'V',               ...
          'OutputName', {'Angular position', 'Angular velocity'}, ...
          'OutputUnit', {'rad', 'rad/s'},                         ...
          'TimeUnit', 's');
%%
% 
% 4. Specify names and units of the initial states and parameters.
nlgr = setinit(nlgr, 'Name', {'Angular position' 'Angular velocity'});
nlgr = setinit(nlgr, 'Unit', {'rad' 'rad/s'});
nlgr = setpar(nlgr, 'Name', {'Time-constant' 'Static gain'});
nlgr = setpar(nlgr, 'Unit', {'s' 'rad/(V*s)'});
%% 
%
% You can also use |setinit| and |setpar| to assign values, minima, maxima,
% and estimation status for all initial states or parameters
% simultaneously.
%
% 5. View the initial model.
%
% a. Get basic information about the model.
%
% The DC-motor has 2 (initial) states and 2 model parameters.
size(nlgr)
%%
%
% b. View the initial states and parameters.
%
% Both the initial states and parameters are structure arrays. The fields
% specify the properties of an individual initial state or parameter. Type
% |help idnlgrey.InitialStates| and |help idnlgrey.Parameters| for
% more information.
nlgr.InitialStates(1)
nlgr.Parameters(2)
%%
%
% c. Retrieve information for all initial states or model parameters in one
% call.
% 
% For example, obtain information on initial states that are fixed (not
% estimated) and the minima of all model parameters.
getinit(nlgr, 'Fixed')
getpar(nlgr, 'Min')

%%
%
% d. Obtain basic information about the object:
nlgr

%%
% Use |get| to obtain more information about the model properties. The
% |idnlgrey| object shares many properties of parametric linear model
% objects.
get(nlgr)

%% Performance Evaluation of the Initial DC-Motor Model
%
% Before estimating the parameters |tau| and |k|, simulate the output of
% the system with the parameter guesses using the default differential
% equation solver (a Runge-Kutta 45 solver with adaptive step length
% adjustment). The simualtion options are specified using the
% "SimulationOptions" model property.
%
% 1. Set the absolute and relative error tolerances to
% small values (|1e-6| and |1e-5|, respectively).
nlgr.SimulationOptions.AbsTol = 1e-6;
nlgr.SimulationOptions.RelTol = 1e-5;
%%
%
% 2. Compare the simulated output with the measured data.
%
% |compare| displays both measured and simulated outputs of one or more
% models, whereas |predict|, called with the same input arguments, displays
% the simulated outputs.
%
% The simulated and measured outputs are shown in a plot window.
compare(z, nlgr);
%%
% *Figure 3:* Comparison between measured outputs and the simulated outputs
% of the initial DC-motor model.

%% Parameter Estimation
% Estimate the parameters and initial states using |nlgreyest|, which is a
% prediction error minimization method for nonlinear grey box models. The
% estimation options, such as the choice of estimation progress display,
% are specified using the "nlgreyestOptions" option set.
nlgr = setinit(nlgr, 'Fixed', {false false}); % Estimate the initial states.
opt = nlgreyestOptions('Display', 'on');
nlgr = nlgreyest(z, nlgr, opt);

%% Performance Evaluation of the Estimated DC-Motor Model
% 1. Review the information about the estimation process.
%
% This information is stored in the |Report| property of the
% |idnlgrey| object. The property also contains information about how the
% model was estimated, such as solver and search method, data set, and why
% the estimation was terminated.
nlgr.Report
fprintf('\n\nThe search termination condition:\n')
nlgr.Report.Termination

%%
% 2. Evaluate the model quality by comparing simulated and measured
% outputs.
% 
% The fits are 98% and 84%, which indicate that the estimated model
% captures the dynamics of the DC motor well.
compare(z, nlgr);

%%
% *Figure 4:* Comparison between measured outputs and the simulated outputs
% of the estimated IDNLGREY DC-motor model.

%%
%
% 3. Compare the performance of the |idnlgrey| model with a second-order
% ARX model.
na = [2 2; 2 2];
nb = [2; 2];
nk = [1; 1];
dcarx = arx(z, [na nb nk]);
compare(z, nlgr, dcarx);

%%
% *Figure 5:* Comparison between measured outputs and the simulated outputs
% of the estimated IDNLGREY and ARX DC-motor models.

%%
% 4. Check the prediction errors.
%
% The prediction errors obtained are small and are centered around zero
% (non-biased).
pe(z, nlgr);

%%
% *Figure 6:* Prediction errors obtained with the estimated IDNLGREY
% DC-motor model.

%%
%
% 5. Check the residuals ("leftovers").
%
% Residuals indicate what is left unexplained by the model and are small
% for good model quality. Use the |resid| command to view the correlations
% among the residuals. The first column of plots shows the autocorrelations
% of the residuals for the two outputs. The second column shows the
% cross-correlation of these residuals with the input "Voltage". The
% correlations are within acceptable bounds (blue region).
%
figure('Name',[nlgr.Name ': residuals of estimated model']);
resid(z,nlgr);
%%
% *Figure 7:* Residuals obtained with the estimated IDNLGREY DC-motor
% model.

%%
% 6. Plot the step response.
%
% A unit input step results in an angular position showing a ramp-type 
% behavior and to an angular velocity that stabilizes at a constant level.
figure('Name', [nlgr.Name ': step response of estimated model']);
step(nlgr);

%%
% *Figure 8:* Step response with the estimated IDNLGREY DC-motor model.

%%
%
% 7. Examine the model covariance.
%
% You can assess the quality of the estimated model to some extent by
% looking at the estimated covariance matrix and the estimated noise
% variance. A "small" value of the |(i, i)| diagonal element of the
% covariance matrix indicates that the |i|:th model parameter is important
% for explaining the system dynamics when using the chosen model structure.
% Small noise variance (covariance for multi-output systems) elements are
% also a good indication that the model captures the estimation
% data in a good way.
nlgr.CovarianceMatrix
nlgr.NoiseVariance

%%
%
% For more information about the estimated model, use |present| to
% display the initial states and estimated parameter values, and 
% estimated uncertainty (standard deviation) for the parameters.
present(nlgr);

%% Conclusions
%
% This example illustrates the basic tools for performing nonlinear
% grey-box modeling. See the other nonlinear grey-box examples to learn
% about:
%
% * Using nonlinear grey-box models in more advanced
%   modeling situations, such as building nonlinear continuous- and
%   discrete-time, time-series and static models.
%
% * Writing and using C MEX model-files.
%
% * Handling nonscalar parameters.
%
% * Impact of certain algorithm choices.
%
% 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.