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

    %% Creating IDNLGREY Model Files
% This example shows how to write ODE files for nonlinear grey-box
% models as MATLAB and C MEX files.
%
% Grey box modeling is conceptually different to black box modeling in that
% it involves a more comprehensive modeling step. For IDNLGREY (the
% nonlinear grey-box model object; the nonlinear counterpart of IDGREY),
% this step consists of creating an ODE file, also called a "model file".
% The ODE file specifes the right-hand sides of the state and the output
% equations typically arrived at through physical first principle modeling.
% In this example we will concentrate on general aspects of implementing it
% as a MATLAB file or a C MEX file.

%   Copyright 2005-2014 The MathWorks, Inc.

%% IDNLGREY Model Files
% IDNLGREY supports estimation of parameters and initial states in
% nonlinear model structures written on the following explicit state-space
% form (so-called output-error, OE, form, named so as the noise e(t) only
% affects the output of the model structure in an additive manner):
%
%    xn(t) = F(t, x(t), u(t), p1, ..., pNpo);         x(0) = X0;
%     y(t) = H(t, x(t), u(t), p1, ..., pNpo) + e(t)
%
% For discrete-time structures, xn(t) = x(T+Ts) with Ts being the sample
% time, and for continuous-time structures xn(t) = d/dt x(t). In addition,
% F(.) and H(.) are arbitrary linear or nonlinear functions with Nx (number
% of states) and Ny (number of outputs) components, respectively. Any of
% the model parameters p1, ..., pNpo as well as the initial state vector
% X(0) can be estimated. Worth stressing is that
%
%    1. time-series modeling, i.e., modeling without an exogenous input
%       signal u(t), and
%    2. static modeling, i.e., modeling without any states x(t)
%
% are two special cases that are supported by IDNLGREY. (See the tutorials
% idnlgreydemo3 and idnlgreydemo5 for examples of these two modeling
% categories).
                                                                  
%%
% The first IDNLGREY modeling step to perform is always to implement a
% MATLAB(R) or C MEX model file specifying how to update the states and
% compute the outputs. More to the point, the user must write a model file,
% MODFILENAME.m or MODFILENAME.c, defined with the following input and
% output arguments (notice that this form is required for both MATLAB and C
% MEX type of model files)
%
%   [dx, y] = MODFILENAME(t, x, u, p1, p2, ..., pNpo, FileArgument)
%
% MODFILENAME can here be any user chosen file name of a MATLAB or C
% MEX-file, e.g., see twotanks_m.m, pendulum_c.c etc. This file should be
% defined to return two outputs
%
%    dx: the right-hand side(s) of the state-space equation(s) (a column
%        vector with Nx real entries; [] for static models)
%     y: the right-hand side(s) of the output equation(s) (a column vector
%        with Ny real entries)
%
% and it should take 3+Npo(+1) input arguments specified as follows:
%
%     t: the current time
%     x: the state vector at time t ([] for static models)
%     u: the input vector at time t ([] for time-series models)
%     p1, p2, ..., pNpo: the individual parameters (which can be real
%        scalars, column vectors or 2-dimensional matrices); Npo is here
%        the number of parameter objects, which for models with scalar
%        parameters coincide with the number of parameters Np
%     FileArgument: optional inputs to the model file

%%
% In the onward discussion we will focus on writing model using either
% MATLAB language or using C-MEX files. However, IDNLGREY also supports
% P-files (protected MATLAB files obtained using the MATLAB command
% "pcode") and function handles. In fact, it is not only possible to use C
% MEX model files but also Fortran MEX files. Consult the MATLAB
% documentation on External Interfaces for more information about the
% latter.

%%
% What kind of model file should be implemented? The answer to this
% question really depends on the use of the model.
%
% Implementation using MATLAB language (resulting in a *.m file) has some
% distinct advantages. Firstly, one can avoid time-consuming, low-level
% programming and concentrate more on the modeling aspects. Secondly, any
% function available within MATLAB and its toolboxes can be used directly
% in the model files. Thirdly, such files will be smaller and, without any
% modifications, all built-in MATLAB error checking will automatically be
% enforced. In addition, this is obtained without any code compilation.
%
% C MEX modeling is much more involved and requires basic knowledge about
% the C programming language. The main advantage with C MEX model files is
% the improved execution speed. Our general advice is to pursue C MEX
% modeling when the model is going to be used many times, when large data
% sets are employed, and/or when the model structure contains a lot of
% computations. It is often worthwhile to start with using a MATLAB file
% and later on turn to the C MEX counterpart.

%% IDNLGREY Model Files Written Using MATLAB Language
% With this said, let us next move on to MATLAB file modeling and use a
% nonlinear second order model structure, describing a two tank system, as
% an example. See idnlgreydemo2 for the modeling details. The contents of
% twotanks_m.m are as follows.
type twotanks_m.m

%%
% In the function header, we here find the required t, x, and u input
% arguments followed by the six scalar model parameters, A1, k, a1, g, A2
% and a2. In the MATLAB file case, the last input argument should always be
% varargin to support the passing of an optional model file input argument,
% FileArgument. In an IDNLGREY model object, FileArgument is stored as a
% cell array that might hold any kind of data. The first element of
% FileArgument is here accessed through varargin{1}{1}.
%
% The variables and parameters are referred in the standard MATLAB way. The
% first state is x(1) and the second x(2), the input is u(1) (or just u in
% case it is scalar), and the scalar parameters are simply accessed through
% their names (A1, k, a1, g, A2 and a2). Individual elements of vector and
% matrix parameters are accessed as P(i) (element i of a vector parameter
% named P) and as P(i, j) (element at row i and column j of a matrix
% parameter named P), respectively.

%% IDNLGREY C MEX Model Files
% Writing a C MEX model file is more involved than writing a MATLAB model file.
% To simplify this step, it is recommended that the available IDNLGREY
% C MEX model template is copied to MODFILENAME.c. This template contains
% skeleton source code as well as detailed instructions on how to customize
% the code for a particular application. The location of the template file
% is found by typing the following at the MATLAB command prompt.
%
%    fullfile(matlabroot, 'toolbox', 'ident', 'nlident', 'IDNLGREY_MODEL_TEMPLATE.c')
%

%%
% For the two tank example, this template was copied to twotanks_c.c. After
% some initial modifications and configurations (described below) the state
% and output equations were entered, thereby resulting in the following
% C MEX source code.
type twotanks_c.c

%%
% Let us go through the contents of this file. As a first observation, we
% can divide the work of writing a C MEX model file into four separate
% sub-steps, the last one being optional:
%
%    1. Inclusion of C-libraries and definitions of the number of outputs.
%    2. Writing the function computing the right-hand side(s) of the state
%       equation(s), compute_dx.
%    3. Writing the function computing the right-hand side(s) of the output
%       equation(s), compute_y.
%    4. Optionally updating the main interface function which includes
%       basic error checking functionality, code for creating and handling
%       input and output arguments, and calls to compute_dx and compute_y.

%%
% Before we address these sub-steps in more detail, let us briefly
% comment upon a couple of general features of the C programming language.
%
%    A. High-precision variables (all inputs, states, outputs and
%       parameters of an IDNLGREY object) should be defined to be of the
%       data type "double".
%    B. The unary * operator placed just in front of the variable or
%       parameter names is a so-called dereferencing operator. The
%       C-declaration "double *A1;" specifies that A1 is a pointer to a
%       double variable. The pointer construct is a concept within C that
%       is not always that easy to comprehend. Fortunately, if the
%       declarations of the output/input variables of compute_y and
%       compute_x are not changed and all unpacked model parameters are
%       internally declared with a *, then there is no need to know more
%       about pointers from an IDNLGREY modeling point of view.
%    C. Both compute_y and compute_dx are first declared and implemented,
%       where after they are called in the main interface function. In the
%       declaration, the keyword "void" states explicitly that no value is
%       to be returned.
%
% For further details of the C programming language we refer to the book
%
%     B.W. Kernighan and D. Ritchie. The C Programming Language, 2nd
%     edition, Prentice Hall, 1988.

%%
% 1. In the first sub-step we first include the C-libraries "mex.h"
% (required) and "math.h" (required for more advanced mathematics). The
% number of outputs is also declared per modeling file using a standard
% C-define:
%
%    /* Include libraries. */
%    #include "mex.h"
%    #include "math.h"
%
%    /* Specify the number of outputs here. */
%    #define NY 1
%
% If desired, one may also include more C-libraries than the ones above.

%%
% The "math.h" library must be included whenever any state or output
% equation contains more advanced mathematics, like trigonometric
% and square root functions. Below is a selected list of functions included
% in "math.h" and the counterpart found within MATLAB:
%
%    C-function              MATLAB function
%    ========================================
%    sin, cos, tan           sin, cos, tan
%    asin, acos, atan        asin, acos, atan   
%    sinh, cosh, tanh        sinh, cosh, tanh
%    exp, log, log10         exp, log, log10
%    pow(x, y)               x^y
%    sqrt                    sqrt
%    fabs                    abs
%
% Notice that the MATLAB functions are more versatile than the
% corresponding C-functions, e.g., the former handle complex numbers,
% while the latter do not.

%%
% 2-3. Next in the file we find the functions for updating the states,
% compute_dx, and the output, compute_y. Both these functions hold argument
% lists, with the output to be computed (dx or y) at position 1, after
% which follows all variables and parameters required to compute the
% right-hand side(s) of the state and the output equations, respectively.
%
% All parameters are contained in the parameter array p. The first step in
% compute_dx and compute_y is to unpack and name the parameters to be used
% in the subsequent equations. In twotanks_c.c, compute_dx declares six
% parameter variables whose values are determined accordingly:
%
%    /* Retrieve model parameters. */
%    double *A1, *k, *a1, *g, *A2, *a2;
%    A1 = p[0];   /* Upper tank area.        */
%    k  = p[1];   /* Pump constant.          */
%    a1 = p[2];   /* Upper tank outlet area. */
%    g  = p[3];   /* Gravity constant.       */
%    A2 = p[4];   /* Lower tank area.        */
%    a2 = p[5];   /* Lower tank outlet area. */
%
% compute_y on the other hand does not require any parameter for computing
% the output, and hence no model parameter is retrieved.

%%
% As is the case in C, the first element of an array is stored at position
% 0. Hence, dx[0] in C corresponds to dx(1) in MATLAB (or just dx in case
% it is a scalar), the input u[0] corresponds to u (or u(1)), the parameter
% A1[0] corresponds to A1, and so on.
%
% In the example above, we are only using scalar parameters, in which case
% the overall number of parameters Np equals the number of parameter
% objects Npo. If any vector or matrix parameter is included in the model,
% then Npo < Np.
%
% The scalar parameters are referenced as P[0] (P(1) or just P in a MATLAB
% file) and the i:th vector element as P[i-1] (P(i) in a MATLAB file). The
% matrices passed to a C MEX model file are different in the sense that the
% columns are stacked upon each other in the obvious order. Hence, if P is
% a 2-by-2 matrix, then P(1, 1) is referred as P[0], P(2, 1) as P[1],
% P(1, 2) as P[2] and P(2, 2) as P[3]. See "Tutorials on Nonlinear Grey Box
% Identification: An Industrial Three Degrees of Freedom Robot : C MEX-File
% Modeling of MIMO System Using Vector/Matrix Parameters", idnlgreydemo8,
% for an example where scalar, vector and matrix parameters are used.

%%
% The state and output update functions may also include other computations
% than just retrieving parameters and computing right-hand side
% expressions. For execution speed, one might, e.g., declare and use
% intermediate variables, whose values are used several times in the coming
% expressions. The robot tutorial mentioned above, idnlgreydemo8, is a good
% example in this respect.

%%
% compute_dx and compute_y are also able to handle an optional
% FileArgument. The FileArgument data is passed to these functions in the
% auxvar variable, so that the first component of FileArgument (a cell
% array) can be obtained through
%
%    mxArray* auxvar1 = mxGetCell(auxvar, 0);
%
% Here, mxArray is a MATLAB-defined data type that enables interchange of
% data between the C MEX-file and MATLAB. In turn, auxvar1 may contain any
% data. The parsing, checking and use of auxvar1 must be handled solely
% within these functions, where it is up to the model file designer to
% implement this functionality. Let us here just refer to the MATLAB
% documentation on External Interfaces for more information about functions
% that operate on mxArrays. An example of how to use optional C MEX model
% file arguments is provided in idnlgreydemo6, "Tutorials on Nonlinear Grey
% Box Identification: A Signal Transmission System : C MEX-File Modeling
% Using Optional Input Arguments".

%%
% 4. The main interface function should almost always have the same
% content and for most applications no modification whatsoever is needed.
% In principle, the only part that might be considered for changes is where
% the calls to compute_dx and compute_y are made. For static systems, one
% can leave out the call to compute_dx. In other situations, it might be
% desired to only pass the variables and parameters referred in the state
% and output equations. For example, in the output equation of the two tank
% system, where only one state is used, one could very well shorten the
% input argument list to
%
%    void compute_y(double *y, double *x)
%
% and call compute_y in the main interface function as
%
%    compute_y(y, x);

%%
% The input argument lists of compute_dx and compute_y might also be
% extended to include further variables inferred in the interface function.
% The following integer variables are computed and might therefore be
% passed on: nu (the number of inputs), nx (the number of states), and np
% (here the number of parameter objects). As an example, nx is passed to
% compute_y in the model investigated in the tutorial idnlgreydemo6.

%%
% The completed C MEX model file must be compiled before it can be used for
% IDNLGREY modeling. The compilation can readily be done from the MATLAB
% command line as
%
%    mex MODFILENAME.c
%
% Notice that the mex-command must be configured before it is used for the
% very first time. This is also achieved from the MATLAB command line via
%
%    mex -setup

%% IDNLGREY Model Object
% With an execution ready model file, it is straightforward to create
% IDNLGREY model objects for which simulations, parameter estimations, and
% so forth can be carried out. We exemplify this by creating two different
% IDNLGREY model objects for describing the two tank system, one using the
% model file written in MATLAB and one using the C MEX file detailed above
% (notice here that the C MEX model file has already been compiled).
Order         = [1 1 2];               % Model orders [ny nu nx].
Parameters    = [0.5; 0.003; 0.019; ...
                 9.81; 0.25; 0.016];   % Initial parameter vector.
InitialStates = [0; 0.1];              % Initial initial states.
nlgr_m    = idnlgrey('twotanks_m', Order, Parameters, InitialStates, 0)
nlgr_cmex = idnlgrey('twotanks_c', Order, Parameters, InitialStates, 0)

%% Conclusions
% In this tutorial we have discussed how to write IDNLGREY MATLAB and C MEX
% model files. We finally conclude the presentation by listing the
% currently available IDNLGREY model files and the tutorial/case study
% where they are being used. To simplify further comparisons, we list both
% the MATLAB (naming convention FILENAME_m.m) and the C MEX model files
% (naming convention FILENAME_c.c), and indicate in the tutorial column
% which type of modeling approach that is being employed in the tutorial or
% case study.
%
%    Tutorial/Case study       MATLAB file               C MEX-file
%    ======================================================================
%    idnlgreydemo1   (MATLAB)   dcmotor_m.m              dcmotor_c.c
%    idnlgreydemo2   (C MEX)    twotanks_m.m             twotanks_c.c
%    idnlgreydemo3   (MATLAB)   preys_m.m                preys_c.c
%                    (C MEX)    predprey1_m.m            predprey1_c.c
%                    (C MEX)    predprey2_m.m            predprey2_c.c
%    idnlgreydemo4   (MATLAB)   narendrali_m.m           narendrali_c.c
%    idnlgreydemo5   (MATLAB)   friction_m.m             friction_c.c
%    idnlgreydemo6   (C MEX)    signaltransmission_m.m   signaltransmission_c.c
%    idnlgreydemo7   (C MEX)    twobodies_m.m            twobodies_c.c
%    idnlgreydemo8   (C MEX)    robot_m.m                robot_c.c
%    idnlgreydemo9   (MATLAB)   cstr_m.m                 cstr_c.c
%    idnlgreydemo10  (MATLAB)   pendulum_m.m             pendulum_c.c
%    idnlgreydemo11  (C MEX)    vehicle_m.m              vehicle_c.c
%    idnlgreydemo12  (C MEX)    aero_m.m                 aero_c.c
%    idnlgreydemo13  (C MEX)    robotarm_m.m             robotarm_c.c
%
% The contents of these model files can be displayed in the MATLAB command
% window through the command "type FILENAME_m.m" or "type FILENAME_c.c".
% All model files are found in the directory returned by the following
% MATLAB command.
%
%    fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'examples')

%% 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.