Documentation of iddemo5


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


Help text

IDDEMO5

Cross-Reference Information

This script calls This script is called by

Listing of script iddemo5


hold off

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

echo on

%       This demo describes the group of RECURSIVE (ON-LINE)
%       algorithms.  The recursive M-files include: RPEM, RPLR,
%       RARMAX, RARX, ROE, and RBJ.   These algorithms implement
%       all the recursive algorithms described in Chapter 11 of
%       Ljung(1987).
%
%       RPEM is the general Recursive Prediction Error Algorithm
%       for arbitrary multiple-input-single-output models
%       (the same models as PEM works for).
%
%       PRLR is the general Recursive PseudoLinear Regression method
%       for the same family of models.
%
%       RARX is a more efficient version of RPEM (and RPLR) for the
%       ARX-case.
%
%       ROE, RARMAX and RBJ are more efficient versions of RPEM for
%       the OE, ARMAX, and BJ cases (compare these functions to the
%       off-line methods).

pause   % Press any key to continue.

%       ADAPTATION MECHANISMS:  Each of the algorithms implement the
%       four most common adaptation principles:
%
%       KALMAN FILTER approach: The true parameters are supposed to
%       vary like a random walk with incremental covariance matrix
%       R1.
%
%       FORGETTING FACTOR approach: Old measurements are discounted
%       exponentially. The base of the decay is the forgetting factor
%       lambda.
%
%       GRADIENT method: The update step is taken as a gradient step
%       of length gamma (th_new=th_old + gamma*psi*epsilon).
%
%       NORMALIZED GRADIENT method: As above, but gamma is replaced by
%       gamma/(psi'*psi). The Gradient methods are also
%       known as LMS (least mean squares) for the ARX case.

pause   % Press any key to continue.

%       Let's pick a model and generate some input-output data:

u = sign(randn(50,1)); e = 0.2*randn(50,1);
th0 = poly2th([1 -1.5 0.7],[0 1 0.5],[1 -1 0.2]);
y = idsim([u e],th0); z = [y u];

pause, idplot(z), pause   % Press a key to see data.

%       First we build an Output-Error model of the data we just
%       plotted.  Use a second order model with one delay, and apply
%       the forgetting factor algorithm with lambda = 0.98:

thm1 = roe(z,[2 2 1],'ff',0.98);  % It may take a while ....

%       The four parameters can now be plotted as functions of time.

pause, plot(thm1), pause  % Press a key to see plot.

%       The true values are as follows: (Press a key for plot)

pause, hold on, plot(ones(50,1)*[1 0.5 -1.5 0.7]), pause
hold off

%       Now let's try a second order ARMAX model, using the RPLR
%       approach (i.e ELS) with Kalman filter adaptation, assuming
%       a parameter variance of 0.001:

thm2 = rplr(z,[2 2 2 0 0 1],'kf',0.001*eye(6));

pause   % Press any key for plot.
plot(thm2), axis([0 50 -2 2]), pause

% The true values are as follows: (Press any key for plot)

pause, hold on, plot(ones(50,1)*[-1.5 0.7 1 0.5 -1 0.2]), pause
hold off

%       So far we have assumed that all data are available at once.
%       We are thus studying the variability of the system rather
%       than doing real on-line calculations. The algorithms are
%       also prepared for such applications, but they must then
%       store more update information. The conceptual update then
%       becomes:

%  1. Wait for measurements y and u.
%  2. Update: [th,yh,p,phi] = rarx([y u],[na nb nk],'ff',0.98,th',p,phi)
%  3. Use th for whatever on-line application required.
%  4. Go to 1.

%       Thus the previous estimate th is fed back into the algorithm
%       along with the previous value of the "P-matrix" and the data
%       vector phi.

%       We now do an example of this where we plot just the current
%       value of th. The code is as follows:

%      [th,yh,p,phi] = rarx(z(1,:),[2 2 1],'ff',0.98);
%      for k = 2:50
%           [th,yh,p,phi] = rarx(z(k,:),[2 2 1],'ff',0.98,th',p,phi);
%           plot(k,th(1),'*',k,th(2),'+',k,th(3),'o',k,th(4),'*')
%      end


pause   % Press any key to continue

echo off
[th,yh,p,phi] = rarx(z(1,:),[2 2 1],'ff',0.98);
plot(1,th(1),'*',1,th(2),'+',1,th(3),'o',1,th(4),'*'),axis([1 50 -2 2]),hold on;
for kkk = 2:50
        [th,yh,p,phi] = rarx(z(kkk,:),[2 2 1],'ff',0.98,th',p,phi);
        plot(kkk,th(1),'*',kkk,th(2),'+',kkk,th(3),'o',kkk,th(4),'*',...
             'erasemode','xor'),drawnow
end
echo on
pause
hold off
echo off
set(gcf,'NextPlot','replace');