Discretisation of continuous state space model almost 20 times slower than manual code

Jonas Bülow <[email protected]> Fri, 25 Oct 2019 12:29:14 +0200
Newsgroups gmane.comp.python.scientific.user
Message-ID <CAEGOEeUs7d6dMX10JGwQkxXb=FMD=g_R42dm-LCUwSprAxxJdQ@mail.gmail.com>
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
[email protected]
https://mail.python.org/mailman/listinfo/scipy-user