我正在使用scipy.integrate.odeint通过集成来模拟具有已知输入信号的系统的反应。下面的简化代码说明了我在做什么。它通过首先生成数据并在积分函数中对数据进行插值来模拟许多一阶系统对正弦输入的响应。
我想通过利用数据表的时间点是规则间隔的事实来加速模拟,并且我们正在为所有输入变量在表的相同行之间进行插值。分析表明,我正在处理的实际代码确实在numpy.interp.
那么确切的问题是我是否应该推出自己的插值函数来处理这种特殊情况,或者是否存在一个现成的解决方案来有效地处理这种情况。我已经搜索过这个,但空手而归。
import numpy
import scipy.integrate
import matplotlib.pyplot as plt
Ntime = 400
Ninputs = 4
time = numpy.arange(Ntime)
# Generate some out-of-phase sinusoids for input data
DATA = numpy.array([numpy.sin(time/10 - i) for i in range(Ninputs)]).T
# Time constants
taus = numpy.ones(Ninputs)*10
def intfun(x, t):
# I would like to speed up this lookup:
inputs = numpy.array([numpy.interp(t, time, DATA[:, i])
for i in range(Ninputs)])
return -(1/taus)*x + inputs # first order
x0 = numpy.ones(Ninputs)
x = scipy.integrate.odeint(intfun, x0, time)
plt.plot(time, x)
plt.show()