echo on
% 	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:

echo off
%	Lennart Ljung
%	Copyright (c) 1986-95 by the MathWorks, Inc.
%	$Revision: 1.6 $  $Date: 1995/05/11 13:59:54 $
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
set(gcf,'NextPlot','replace');

