我一直在玩一个包,它使用线性 scipy.interpolate.interp1d 为 scipy 中的 ode 求解器创建历史函数,在此处描述。
相关的代码类似于
def update(self, ti, Y):
""" Add one new (ti, yi) to the interpolator """
self.itpr.x = np.hstack([self.itpr.x, [ti]])
yi = np.array([Y]).T
self.itpr.y = np.hstack([self.itpr.y, yi])
#self.itpr._y = np.hstack([self.itpr.y, yi])
self.itpr.fill_value = Y
其中“self.itpr”在 __init__ 中初始化:
def __init__(self, g, tc=0):
""" g(t) = expression of Y(t) for t<tc """
self.g = g
self.tc = tc
# We must fill the interpolator with 2 points minimum
self.itpr = scipy.interpolate.interp1d(
np.array([tc-1, tc]), # X
np.array([self.g(tc), self.g(tc)]).T, # Y
kind='linear', bounds_error=False,
fill_value = self.g(tc))
whereg
是一些函数,它返回一组值,这些值是一组微分方程的解,并且tc
是当前时间。
这对我来说似乎很好,因为每次我想更新值的范围时都不必重新创建一个新的插值器对象(这发生在模拟期间的每个显式时间步)。这种更新插值器的方法在 scipy v 0.11.0 下运行良好。但是,在更新到 v 0.12.0 后,我遇到了问题。我看到新的插值器现在包含一个_y
似乎只是原始的另一个副本的数组。_y
如上所述 进行更新是否安全和/或理智?是否有一种更简单、更 Pythonic 的方法来解决这个问题,希望对 scipy 中的未来更新更加健壮? 同样,在 v 0.11 中一切正常并产生了预期的结果,在 v 0.12 中我得到了一个IndexError
when_y
被引用因为它没有在我的函数中更新,而 y 本身是。
任何帮助/指针将不胜感激!