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

    %% Classical Pendulum: Some Algorithm-Related Issues
% This example shows how the estimation algorithm choices may impact the
% results for a nonlinear grey box model estimation. We use data produced
% by a nonlinear pendulum system, which is schematically shown in Figure 1.
% We show in particular how the choice of differential equation solver 
% impacts the results.
%
% <<../pendulum.png>>
%
% *Figure 1:* Schematic view of a classical pendulum.

%   Copyright 2005-2014 The MathWorks, Inc.

%% Output Data
% We start our modeling tour by loading the output data (time-series data).
% The data contains one output, y, which is the angular position of the
% pendulum [rad]. The angle is zero when the pendulum is pointing
% downwards, and it is increasing anticlockwise. There are 1001 (simulated)
% samples of data points and the sample time is 0.1 seconds. The
% pendulum is affected by a constant gravity force, but no other exogenous
% force affects the motion of the pendulum. To investigate this situation,
% we create an IDDATA object:
load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'pendulumdata'));
z = iddata(y, [], 0.1, 'Name', 'Pendulum');
z.OutputName = 'Pendulum position';
z.OutputUnit = 'rad';
z.Tstart = 0;
z.TimeUnit = 's';

%%
% The angular position of the pendulum (the output) is shown in a plot
% window.
figure('Name', [z.Name ': output data']);
plot(z);

%%
% *Figure 2:* Angular position of the pendulum (output).

%% Pendulum Modeling
% The next step is to specify a model structure for the pendulum system.
% The dynamics of it has been studied in numerous books and articles and
% are well understood. If we choose x1(t) as the angular position [rad] and
% x2(t) as the angular velocity [rad/s] of the pendulum, then it is rather
% straightforward to set up a state-space structure of the following kind:
%
%    d/dt x1(t) = x2(t)
%    d/dt x2(t) = -(g/l)*sin(x1(t)) - (b/(m*l^2))*x2(t)
%
%          y(t) = x1(t)
%
% having parameters (or constants)
%
%    g - the gravity constant [m/s^2]
%    l - the length of the rod of the pendulum [m]
%    b - viscous friction coefficient [Nms/rad]
%    m - the mass of the bob of the pendulum [kg]

%%
% We enter this information into the MATLAB file pendulum_m.m, with contents as
% follows:
%
%    function [dx, y] = pendulum_m(t, x, u, g, l, b, m, varargin)
%    %PENDULUM_M  A pendulum system.
% 
%    % Output equation.
%    y = x(1);                                   % Angular position.
% 
%    % State equations.
%    dx = [x(2);                             ... % Angular position.
%          -(g/l)*sin(x(1))-b/(m*l^2)*x(2)   ... % Angular velocity.
%         ];

%%
% The next step is to create a generic IDNLGREY object for describing the
% pendulum. We also enter information about the names and the units of the
% inputs, states, outputs and parameters. Owing to the physical reality all
% model parameters must be positive and this is imposed by setting the
% 'Minimum' property of all parameters to the smallest recognizable
% positive value in MATLAB(R), eps(0).
FileName      = 'pendulum_m';        % File describing the model structure.
Order         = [1 0 2];             % Model orders [ny nu nx].
Parameters    = [9.81; 1; 0.2; 1];   % Initial parameters.
InitialStates = [1; 0];              % Initial initial states.
Ts            = 0;                   % Time-continuous system.
nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts);
nlgr.OutputName = 'Pendulum position';
nlgr.OutputUnit = 'rad';
nlgr.TimeUnit = 's';
nlgr = setinit(nlgr, 'Name', {'Pendulum position' 'Pendulum velocity'});
nlgr = setinit(nlgr, 'Unit', {'rad' 'rad/s'});
nlgr = setpar(nlgr, 'Name', {'Gravity constant' 'Length' ...
                      'Friction coefficient' 'Mass'});
nlgr = setpar(nlgr, 'Unit', {'m/s^2' 'm' 'Nms/rad' 'kg'});
nlgr = setpar(nlgr, 'Minimum', {eps(0) eps(0) eps(0) eps(0)});   % All parameters > 0.

%% Performance of Three Initial Pendulum Models
% Before trying to estimate any parameter we simulate the system with the
% guessed parameter values. We do this for three of the available solvers,
% Euler forward with fixed step length (ode1), Runge-Kutta 23 with adaptive
% step length (ode23), and Runge-Kutta 45 with adaptive step length
% (ode45). The outputs obtained when using these three solvers are shown in
% a plot window.

% A. Model computed with first-order Euler forward ODE solver.
nlgref = nlgr;
nlgref.SimulationOptions.Solver = 'ode1';        % Euler forward.
nlgref.SimulationOptions.FixedStep = z.Ts*0.1;   % Step size.

% B. Model computed with adaptive Runge-Kutta 23 ODE solver.
nlgrrk23 = nlgr;
nlgrrk23.SimulationOptions.Solver = 'ode23';     % Runge-Kutta 23.

% C. Model computed with adaptive Runge-Kutta 45 ODE solver.
nlgrrk45 = nlgr;
nlgrrk45.SimulationOptions.Solver = 'ode45';     % Runge-Kutta 45.

compare(z, nlgref, nlgrrk23, nlgrrk45, 1, ...
   compareOptions('InitialCondition', 'model'));

%%
% *Figure 3:* Comparison between true output and the simulated outputs of
% the three initial pendulum models.

%%
% As can be seen, the result with the Euler forward method (with a finer
% grid than what is used by default) differs significantly from the results
% obtained with the Runge-Kutta solvers. In this case, it turns out that
% the Euler forward solver produces a rather good result (in terms of model
% fit), whereas the outputs obtained with the Runge-Kutta solvers are a bit
% limited. However, this is somewhat deceiving, as will be evident later
% on, because the initial value of b, the viscous friction coefficient, is
% twice as large as in reality.

%% Parameter Estimation
% The gravitational constant, g, the length of the rod, l, and the mass of
% the bob, m, can easily be measured or taken from a table without
% estimation. However, this is typically not the case with friction
% coefficients, which often must be estimated. We therefore fix the former
% three parameters to g = 9.81, l = 1, and m = 1, and consider only b as a
% free parameter:
nlgref = setpar(nlgref, 'Fixed', {true true false true});
nlgrrk23 = setpar(nlgrrk23, 'Fixed', {true true false true});
nlgrrk45 = setpar(nlgrrk45, 'Fixed', {true true false true});

%%
% Next we estimate b using the three differential equation solvers. We
% start with the Euler forward based model structure.
opt = nlgreyestOptions('Display', 'on');
tef = clock;
nlgref = nlgreyest(z, nlgref, opt);   % Perform parameter estimation.
tef = etime(clock, tef);

%%
% Then we continue with the model based on the Runge-Kutta 23 solver (ode23).
trk23 = clock;
nlgrrk23 = nlgreyest(z, nlgrrk23, opt);   % Perform parameter estimation.
trk23 = etime(clock, trk23);

%%
% We finally use the Runge-Kutta 45 solver (ode45).
trk45 = clock;
nlgrrk45 = nlgreyest(z, nlgrrk45, opt);   % Perform parameter estimation.
trk45 = etime(clock, trk45);

%% Performance of Three Estimated Pendulum Models
% The results when using these three solvers are summarized below. The true
% value of b is 0.1, which is obtained with ode45. ode23 returns a value
% quite close to 0.1, while ode1 returns a value quite a distance from 0.1.
disp('           Estimation time   Estimated b value');
fprintf('   ode1 :  %3.1f               %1.3f\n', tef, nlgref.Parameters(3).Value);
fprintf('   ode23:  %3.1f               %1.3f\n', trk23, nlgrrk23.Parameters(3).Value);
fprintf('   ode45:  %3.1f               %1.3f\n', trk45, nlgrrk45.Parameters(3).Value);

%%
% However, this does not mean that the simulated outputs differ that much
% from the actual output, because the errors produced by the different
% differential equation solvers are typically accounted for in the
% estimation procedure. This is a fact that readily can be seen by
% simulating the three estimated pendulum models.
compare(z, nlgref, nlgrrk23, nlgrrk45, 1, ...
   compareOptions('InitialCondition', 'model'));

%%
% *Figure 4:* Comparison between true output and the simulated outputs of
% the three estimated pendulum models.

%%
% As expected given this figure, the Final Prediction Error (FPE) criterion
% values of these models are also rather close to each other:
fpe(nlgref, nlgrrk23, nlgrrk45);

%% 
% Based on this we conclude that all three models are able to capture the
% pendulum dynamics, but the Euler forward based model reflects the
% underlying physics quite poorly. The only way to increase its "physics"
% performance is to decrease the step length of the solver, but this also
% means that the solution time increases significantly. Our experiments
% indicate that the Runge-Kutta 45 solver is the best solver for non-stiff
% problems when taking both accuracy and computational speed into account.

%% Conclusions
% The Runge-Kutta 45 (ode45) solver often returns high quality results
% relatively fast, and is therefore chosen as the default differential
% equation solver in IDNLGREY. Typing "help idnlgrey.SimulationOptions"
% provides some more details about the available solvers and typing "help
% nlgreyestOptions" provides details on the various estimation options that
% can be used for IDNLGREY modeling.

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