Documentation of iddemo7


Global Index (short | long) | Local contents | Local Index (short | long)


Help text

   In this demo we shall demonstrate how to use several the SITB to
   estimate parameters in state-space models. We shall investigate
   data produced by a (simulated) dc-motor. We first load the data:

Cross-Reference Information

This script calls This script is called by

Listing of script iddemo7


echo on

echo off
%   Lennart Ljung
%   Copyright (c) 1986-98 by The MathWorks, Inc.
%   $Revision: 3.3 $  $Date: 1997/12/02 03:44:42 $
echo on

load dcmdata

%       The matrix y contains the two outputs: y1 is the angular position of
%       the motor shaft and y2 is the angular velocity. There are 400 data
%       points and the sampling interval is 0.1 seconds. The input is
%       contained in the vector u. It is the input voltage to the motor.
%       Press a key for plots of the input-output data.

z=[y u];

pause,idplot(z,[],0.1,2),pause

%       We shall build a model of the dc-motor. The dynamics of the motor is
%       well known. If we choose x1 as the angular position and x2 as the
%       angular velocity it is easy to set up a state-space model of the
%       following character neglecting disturbances:
%       (see page 84 in Ljung(1987):

%           | 0     1  |      | 0   |
%  d/dt x = |          | x  + |     | u
%           | 0   -th1 |      | th2 |
%
%
%          | 1  0 |
%     y =  |      | x
%          | 0  1 |
%
%
%       The parameter th1 is here the inverse time-constant of the motor and
%       th2 is such that th2/th1 is the static gain from input to the angular
%       velocity. (See Ljung(1987) for how th1 and th2 relate to the physical
%       parameters of the motor.)
%       We shall estimate these two parameters from the observed data. Strike
%       a key to continue.

pause

%       1. FREE PARAMETERS
%
%       We first have to define the structure in terms of the general
%       description
%
%       d/dt x = A x + B u + K e
%
%       y   = C x + D u + e
%
%       Strike a key to continue.

pause

%
%       Any parameter to be estimated is entered as NaN (Not a Number).
%       Thus we have
A=[0 1
   0 NaN];
B=[0
   NaN];
C=[1 0
   0 1];
D=[0
   0];
K=[0 0
   0 0];
X0=[0
    0];   %X0 is the initial value of the state vector; it could also be
          %entered as parameters to be identified.

%       The model structure is now defined by

ms = modstruc(A,B,C,D,K,X0);pause     % Strike a key to continue

%       We shall produce an initial guess for the parameters. Let us guess
%       that the time constant is one second and that the static gain is 0.28.
%       This gives:

th_guess = [-1 0.28];

%       We now collect all this information into the "theta-format" by

dcmodel = ms2th(ms,'c',th_guess,[],0.1);

%       'c' denotes that the parametrization refers to a continuous-time model
%       The last argument, 0.1,is the sampling interval for the collected data

%       The prediction error (maximum likelihood) estimate of the parameters
%       is now computed by (Press a key to continue)

pause, dcmodel = pem(z,dcmodel,'trace');

%       We can display the result by the 'present' command.
%       The imaginary parts denote standard deviation.
%       Strike a key to continue.

pause, present(dcmodel), pause

%       The estimated values of the parameters are quite close to those used
%       when the data were simulated (-4 and 1).

%       To evaluate the model's quality we can simulate the model with the
%       actual input by and compare it with the actual output.
%       Strike a key to continue.

pause, compare(z,dcmodel); pause

%       We can now, for example plot zeros and poles and their uncer-
%       tainty regions. We will draw the regions corresponding to 10 standard
%       deviations, since the model is quite accurate. Note that the pole at
%       the origin is absolutely certain, since it is part of the model
%       structure; the integrator from angular velocity to position.
%       Strike a key to continue.

pause, zpplot(th2zp(dcmodel),10), pause

%       2. COUPLED PARAMETERS
%
%       Suppose that we accurately know the static gain of the dc-motor (from
%       input voltage to angular velocity, e.g. from a previous step-response
%       experiment. If the static gain is G, and the time constant of the
%       motor is t, then the state-space model becomes
%
%            |0     1|    |  0  |
%  d/dt x =  |       |x + |     | u
%            |0  -1/t|    | G/t |
%
%            |1   0|
%     y   =  |     | x
%            |0   1|
%

pause % Press a key to continue

%       With G known, there is a dependence between the entries in the
%       different matrices. In order to describe that, the earlier used way
%       with "NaN" will not be sufficient. We thus have to write an m-file
%       which produces the A,B,C,D,K and X0 matrices as outputs, for each
%       given parameter vector as input. It also takes auxiliary arguments as
%       inputs, so that the user can change certain things in the model
%       structure, without having to edit the m-file. In this case we let the
%       known static gain G be entered as such an argument. The m-file that
%       has been written has the name 'motor'. Press a key for a listing.

pause, type motor

pause % Press a key to continue.

%       We now create a "THETA-structure" corresponding to this model
%       structure:The assumed time constant will be

tc_guess = 1;

%       We also give the value 0.25 to the auxiliary variable G (gain)
%       and sampling interval

aux = 0.25;

dcmm = mf2th('motor','c',tc_guess,aux,[],0.1);

pause   % Press a key to continue

%       The time constant is now estimated by

dcmm = pem([y u],dcmm,'trace');

%       We have thus now estimated the time constant of the motor directly.
%       Its value is in good agreement with the previous estimate.
%       Strike a key to continue.

pause, present(dcmm),  pause

%       With this model we can now proceed to test various aspects as before.
%       The syntax of all the commands is identical to the previous case.


%       3. MULTIVARIATE ARX-MODELS.
%
%       The state-space part of the toolbox also handles multivariate (several
%       outputs) ARX models. By a multivariate ARX-model we mean the
%       following: Strike a key to continue.

pause

%       A(q) y(t) = B(q) u(t) + e(t)
%
%       Here A(q) is a ny | ny matrix whose entries are polynomials in the
%       delay operator 1/q. The k-l element is denoted by a_kl(q):
%
%                          -1                   -nakl
%       a_kl(q) = 1 + a-1 q    + .... + a-nakl q
%
%       It is thus a polynomial in 1/q of degree nakl.

%       Similarly B(q) is a ny | nu matrix, whose kj-element is

%                      -nkkj         -nkkj-1                 -nkkj-nbkj
%       b_kj(q) = b-0 q      +  b-1 q        + ... + b-nbkj q

%       There is thus a delay of nkkj from input number j to output number k

%       The most common way to create those would be to use the ARX-command.
%       The orders are specified as
%       nn = [na nb nk]
%       with na being a ny | ny matrix whose kj-entry is nakj; nb and nk are
%       defined similarly.  Strike a key to continue.

pause

%       Let's test some ARX-models on the dc-data. First we could simply build
%       a general second order model:

na = [ 2 2; 2 2];
nb = [2; 2];
nk = [1;1];

dcarx1 = arx([y u],[na nb nk]);

%       The result, dcarx1, is stored in the THETA-format, and all previous
%       commands apply. We could for example explicitly determine the
%       ARX-polynomials by

[A,B] = th2arx(dcarx1);

%       Strike a key to continue.

pause, A, B, pause

%       We could also test a structure, where we know that y1 is obtained by
%       filtering y2 through a first order filter. (The angle is the integral
%       of the angular velocity). We could then also postulate a first order
%       dynamics from input to output number 2:

na = [1 1; 0 1];
nb = [0 ; 1];
nk = [1 ; 1];

dcarx2 = arx(z,[na nb nk]);
dcarx2 = sett(dcarx2,0.1);   % Setting the sampling interval to 0.1 seconds
[Am, Bm] = th2arx(dcarx2);

Am, Bm

%       Strike a key to continue

pause

%       Finally, we could compare the bodeplots obtained from the input to
%       output one for the different models by

g1 = th2ff(dcmodel); % The first calculated model
g2 = th2ff(dcmm);    % The second model (known dc-gain)
g3 = th2ff(dcarx2);  % The second arx-model

pause,bodeplot([g1 g2 g3]),pause

%       The two first models are in more or less exact agreement. The
%       arx-models are not so good, due to the bias caused by the non-white
%       equation error noise. (We had white measurement noise in the
%       simulations).
pause
echo off
set(gcf,'NextPlot','replace');