[SciPy-User] Discretisation of continuous state space model almost 20 times slower than manual code
Clancy Rowley
clancyr at gmail.com
Fri Oct 25 08:50:55 EDT 2019
One issue is that the first routine below will not work for systems of dimension > 1. You'd need to use the matrix exponential, for instance with scipy.linalg.expm, instead of math.exp, which does elementwise exponentiation.
> On Oct 25, 2019, at 6:29 AM, Jonas Bülow <jonas.bulow at gmail.com> wrote:
>
> Hi,
>
> I'm new to scipy. I implemented a simple state space model where the A and B matrix is specified and C and D is zero. Before I knew about scipy.signal.StateSpace I manually discretised the model using scipy.integrate.quad as shown in the code below.
>
> Someone suggested I should use scipy.signal.StateSpace. The code become a lot slower using signal.StateSpace, almost 20 times slower. Any hints on what I'm doing wrong or how I should change my use of signal.StateSpace to get better performance? Or should I just stick to my simplified manual method (variant 1 on the code below)?
>
> The code:
>
> ----8<--------
>
> import math
> import numpy as np
> from scipy import integrate, signal
>
> import timeit as ti
>
> def cont2disc_1(A, B, sample_time):
> Ad = math.exp(A * sample_time)
> def fq(x):
> return integrate.quad(lambda t: math.exp(A * t) * B[x], 0, sample_time)[0]
> Bd = np.array([fq(0), fq(1)])
> return Ad, Bd
>
> def cont2disc_2(A, B, sample_time):
> ds = signal.StateSpace(A, B, 0, [0, 0]).to_discrete(sample_time)
> Ad = ds.A[0][0]
> Bd = ds.B[0]
> return Ad, Bd
>
> if __name__ == "__main__":
> A,B,h = -0.0004622051395583765, [0.00046221, 0.01629134], 60
> print(f'1: {cont2disc_1(A, B, h)}')
> print(f'2: {cont2disc_2(A, B, h)}')
>
> SETUP=f'''
> from __main__ import cont2disc_1, cont2disc_2
> A,B,h = {A}, {B}, {h}
> '''
> t_1 = ti.timeit('cont2disc_1(A, B, h)', SETUP, number=1000)
> t_2 = ti.timeit('cont2disc_2(A, B, h)', SETUP, number=1000)
> print(f'Method 1 is {t_2 / t_1} times faster then method 2')
>
>
> ----8<--------
>
>
>
>
>
>
>
>
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at python.org
> https://mail.python.org/mailman/listinfo/scipy-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-user/attachments/20191025/68d092d6/attachment.html>
More information about the SciPy-User
mailing list