Skip to content

Speed up forced_response/lsim#51

Merged
murrayrm merged 2 commits into
python-control:improve-docsfrom
cwrowley:lsim
Mar 29, 2015
Merged

Speed up forced_response/lsim#51
murrayrm merged 2 commits into
python-control:improve-docsfrom
cwrowley:lsim

Conversation

@cwrowley

Copy link
Copy Markdown
Contributor

Fixes #48.

This version of lsim assumes a constant timestep, as in Matlab. This algorithm is much faster than the previous implementation, which used a generic ODE integrator: the example in issue #48 now runs over 400x faster, and is now a little faster than scipy.signal.lsim. This algorithm is more general than the scipy version, since it works even if the system has a pole at the origin.

If we want a version that works with variable timesteps, I suggest adding an lsim2 function, as in scipy.signal, which could call the generic ODE integrator as before. I don't think this is necessary (for instance, there is nothing like that in Matlab, as far as I know), but if anybody needs it, we can always add it.

Fixes python-control#48

The old algorithm called a general-purpose ODE integrator at each
timestep, and this could be extremely slow (hundreds of times slower
than scipy.signal.lsim).  This new algorithm evaluates the matrix
exponential once, and uses it to advance the simulation at each step.

Importantly, the old algorithm would work for variable timesteps, but
the new version assumes a fixed timestep (as does Matlab's lsim).  This
is the usual case, and it is the price one pays for increased speed.

Note that this algorithm is the same idea as the algorithm used in
scipy.signal.lsim, but the scipy version requires inverting the `A`
matrix, and thus does not work if the system has a pole at the origin.
The algorithm used here works even if there is a pole at the origin.
This commit also adds a test for this case (the double integrator).
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.08%) to 72.89% when pulling d7d278b on cwrowley:lsim into 5ac5100 on python-control:improve-docs.

murrayrm added a commit that referenced this pull request Mar 29, 2015
Speed up forced_response/lsim
@murrayrm murrayrm merged commit 4f6165a into python-control:improve-docs Mar 29, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants