How the Software Computes Hammerstein-Wiener Model Output
This topic describes how the software evaluates the output of nonlinearity estimators and uses this output to compute the response of a Hammerstein-Wiener model.
Evaluating Nonlinearities (SISO)
Evaluating the output of a nonlinearity for an input u requires that you first extract the input or output nonlinearity from the model:
F = M.InputNonlinearity; H = M.OutputNonlinearity;
Evaluate F(u):
w = evaluate(F,u)
where u
is a scalar representing the value
of the input signal at a given time.
You can evaluate output at multiple time instants by evaluating F for several time values simultaneously using a column vector of input values:
w = evaluate(F,[u1;u2;u3])
Similarly, you can evaluate the value of the nonlinearity H using the output of the linear block x(t) as its input:
y = evaluate(H,x)
Evaluating Nonlinearities (MIMO)
For MIMO models, F and H are vectors of length nu and ny, respectively. nu is the number of inputs and ny is the number of outputs. In this case, you must evaluate the predicted output of each nonlinearity separately.
For example, suppose that you estimate a two-input model:
M = nlhw(data,[nb nf nk],[idWaveletNetwork;idPolynomial1D],'idSaturation')
In the input nonlinearity:
F = M.InputNonlinearity F1 = F(1); F2 = F(2);
F
is a vector function containing two elements:
F=[F1(u1_value);F2(u2_value)]
, where F1
is
an idWaveletNetwork
object and
F2
is a idPolynomial1D
object. u1_value
is the first
input signal and u2_value
is the second input signal.
Evaluate F
by evaluating F1
and F2
separately:
w1 = evaluate(F(1),u1_value); w2 = evaluate(F(2),u2_value);
The total input to the linear block, w
, is
a vector of w1
and w2
(w
= [w1 w2]
).
Similarly, you can evaluate the value of the nonlinearity H:
H = M.OutputNonlinearity;
Simulation of Hammerstein-Wiener Model
This example shows how the software evaluates the simulated output by first computing the output of the input and output nonlinearity estimators.
Estimate a Hammerstein-Wiener model.
load twotankdata
estData = iddata(y,u,0.2);
M = nlhw(estData,[1 5 3],idPiecewiseLinear,idPolynomial1D);
Extract the input nonlinearity, linear model, and output nonlinearity as separate variables.
uNL = M.InputNonlinearity; linModel = M.LinearModel; yNL = M.OutputNonlinearity;
Simulate the output of the input nonlinearity estimator.
Input data for simulation.
u = estData.u;
Compute output of input nonlinearity.
w = evaluate(uNL,u);
Compute response of linear model to input w
and zero initial conditions.
x = sim(linModel,w);
Compute the output of the Hammerstein-Wiener model M
as the output of the output nonlinearity estimator to input x
.
y = evaluate(yNL,x);
The previous set of commands are equivalent to directly simulating the output of M
using the sim
command.
ysim = sim(M,u);
Plot y
and ysim
, the manual and direct simulation results, respectively.
time = estData.SamplingInstants; plot(time,y,'b',time,ysim,'--r'); xlabel('Time'); ylabel('Simulated Output')
The plot indicates that y
and ysim
are the same.