Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Speed up forced_response/lsim #51

Merged
merged 2 commits into from Mar 29, 2015
Merged

Conversation

cwrowley
Copy link
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

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.

None yet

3 participants