Speed up forced_response/lsim#51
Merged
Merged
Conversation
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).
murrayrm
added a commit
that referenced
this pull request
Mar 29, 2015
Speed up forced_response/lsim
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
lsim2function, as inscipy.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.