我想求出d y/dt=-2y+data(t),在t=0..3之间,对于y(t=0)=1。在
我写了以下代码:
import numpy as np
from scipy.integrate import odeint
from scipy.interpolate import interp1d
t = np.linspace(0, 3, 4)
data = [1, 2, 3, 4]
linear_interpolation = interp1d(t, data)
def func(y, t0):
print 't0', t0
return -2*y + linear_interpolation(t0)
soln = odeint(func, 1, t)
当我运行这段代码时,我会遇到如下几个错误:
ValueError: A value in x_new is above the interpolation range.
odepack.error: Error occurred while calling the Python function named func
我的插值范围在0.0到3.0之间。
在func中打印t0
的值时,我意识到{linear_interpolation(t0)
引发ValueError
异常的原因。在
我有几个问题:
integrate.ode
如何使t0
变化?为什么它使t0
超过了插值范围的下确界(3.0)?
尽管有这些错误,integrate.ode
仍返回一个似乎包含正确值的数组。那么,我是不是应该抓住并忽略这些错误呢?不管微分方程,范围和初始条件,我应该忽略它们吗?
如果我不应该忽视这些错误,那么最好的避免方法是什么?2建议:
在interp1d
中,我可以设置bounds_error=False
和{t0
似乎接近{
但是首先,我想确定的是,对于任何其他的func
和任何其他{t0
将始终与{integrate.ode
在我的插值范围以下选择一个t0
,填充值仍然是data[-1]
,这是不正确的。也许知道integrate.ode
是如何使t0
变化的,这将有助于我确定这一点(见我的第一个问题)。
在func
中,我可以将linear_interpolation
调用括在try/except块中,当我捕捉到一个ValueError
时,我会回忆起linear_interpolation
,但是{
def func(y, t0):
try:
interpolated_value = linear_interpolation(t0)
except ValueError:
interpolated_value = linear_interpolation(int(t0)) # truncate t0
return -2*y + interpolated_value
至少,如果integrate.ode
使t0
>;=4.0或t0
<;=-1.0时,线性插值仍然会引发异常。然后我就可以被提醒不连贯的行为。但它不是真正的可读性和截断似乎有点武断现在。
也许我只是想了想这些错误。请告诉我。在
odeint
解算器在超过上次请求时间的时间值时计算函数是正常的。大多数ODE解算器都是这样工作的,它们采用内部时间步长,其大小由误差控制算法确定,然后在用户要求的时间内使用自己的插值来评估解。有些解算器(例如日晷库中的CVODE解算器)允许您指定时间的硬边界,超过该范围,解算器将不允许计算您的方程,但odeint
没有这样的选项。在如果您不介意从}解算器在请求的时间之外不会计算您的函数。两个注意事项:
scipy.integrate.odeint
切换到scipy.integrate.ode
,那么"dopri5"
和{ode
解算器对定义微分方程的参数顺序使用不同的约定。在ode
解算器中,t
是第一个参数。(是的,我知道,发牢骚,发牢骚…)"dopri5"
和{下面是一个脚本,它演示了如何求解示例。为了强调参数的变化,我将
func
重命名为rhs
。在这个答案的其余部分将讨论如何继续使用
odeint
。在如果您只对线性插值感兴趣,您可以简单地使用数据的最后两个点对数据进行线性扩展。扩展
data
数组的一个简单方法是将值2*data[-1] - data[-2]
追加到数组的末尾,并对t
数组执行相同的操作。如果t
中的最后一个时间步很小,那么这可能不是一个足够长的扩展来避免这个问题,所以在下面,我使用了一个更通用的扩展。在示例:
^{pr2}$如果简单地使用最后两个数据点来线性扩展插值器太粗糙了,那么您将不得不使用其他方法来稍微超出赋予
odeint
的最终t
值。在另一种选择是将最后的
t
值作为func
的参数,并显式处理大于func
中的t
值。像这样,其中extrapolation
是你必须要弄清楚的:相关问题 更多 >
编程相关推荐