In this post we will go over a couple of ways to simulate linear systems in Matlab.
You have the transfer-function, say
$$G(s) = \frac{1}{s + 1},$$
and you would like to calculate the response to some input using Matlab. The transfer-function can be represented in Matlab using tf
G = tf([1], [1 1]);
where the two parameters are vectors with the coefficients of the numerator and denominator of the transfer-function.
If your input is bounded and otherwise well behaved you can use lsim
to do it. For example, if your input $u$ is a sinusoid of amplitude $A$ and frequency $\omega=2 \pi f$ then
A = 1; f = 10; T = 1; npoints = 10*T*f; t = linspace(0, T, npoints); u = A * cos(2*pi*f*t);
will construct vectors $u$ and $t$ representing your input samples. Note that npoints
has to be chosen so that $u$ is well represented by its samples. The output $y$ can be calculated using lsim
as in
y = lsim(G, u, t);
Some types of inputs happen so often that matlab will provide specialized functions for simulation. For example, if $u$ is a constant of amplitude $A$ you might as well just use
y = A * step(G);
step
by itself calculates the response to a unit step input. See the livescritps for Chapter 4 for more examples of usage of the function step
.
Another useful function is impulse
, which calculates the unit impulse response. I will comment on that function on a separate note in connection with initial conditions. Indeed, both lsim
and step
, when used as above, assume zero initial conditions.
You can easily use lsim
to simulate the response to multiple inputs as well. For example, you might have calculated closed-loop transfer-functions $H$ and $D$ such that
$$y = H \bar{y} + D w, \qquad H = \frac{G K}{1 + G K}, \qquad D = \frac{G}{1 + G K} $$
using feedback
as in
K = 1; H = feedback(K*G,1); D = feedback(G,K);
I will comment on the use of feedback
for calculating closed-loop transfer-functions on another post. In this case
yBar = ones(size(t)); w = ones(size(t)); y = lsim([H, D], [yBar; w], t);
will calculate the combined response where yBar
and w
are vectors with samples of the corresponding inputs. You can also calculate multiple outputs. For example
S = feedback(1,G*K); ye = lsim([H; S], yBar, t);
will return an array ye
containing both the output signals $e$ and $y$ corresponding to
$$\begin{pmatrix} y \\ e \end{pmatrix} = \begin{bmatrix} H \\ S \end{bmatrix} \bar{y}, \qquad S = \frac{1}{1 + G K}$$
Of course you can do multiple-inputs and multiple-outputs by combining these two ideas.
One thought on “Simulating linear systems with Matlab’s lsim”