默认情况下,Scipy 不为表格数据提供如此高阶的积分器。最接近您无需自己编码的情况是scipy.integrate.simps
,它使用 3 点 Newton-Cotes 方法。
如果您只是想获得可比较的集成精度,您可以将您的x
和f
数组拆分为 5 个点块,并一次将它们集成一个,使用通过scipy.integrate.newton_cotes
执行以下操作返回的权重:
def idl_tabulate(x, f, p=5) :
def newton_cotes(x, f) :
if x.shape[0] < 2 :
return 0
rn = (x.shape[0] - 1) * (x - x[0]) / (x[-1] - x[0])
weights = scipy.integrate.newton_cotes(rn)[0]
return (x[-1] - x[0]) / (x.shape[0] - 1) * np.dot(weights, f)
ret = 0
for idx in xrange(0, x.shape[0], p - 1) :
ret += newton_cotes(x[idx:idx + p], f[idx:idx + p])
return ret
这会在所有间隔上进行 5 点 Newton-Cotes,除了最后一个,它将对剩余的点数进行 Newton-Cotes。不幸的是,这不会给您相同的结果,IDL_TABULATE
因为内部方法不同:
对于文档字符串中的示例INT_TABULATED
,它应该1.6271
使用原始代码返回,并且具有 的精确解1.6405
,上述函数返回:
>>> x = np.array([0.0, 0.12, 0.22, 0.32, 0.36, 0.40, 0.44, 0.54, 0.64,
... 0.70, 0.80])
>>> f = np.array([0.200000, 1.30973, 1.30524, 1.74339, 2.07490, 2.45600,
... 2.84299, 3.50730, 3.18194, 2.36302, 0.231964])
>>> idl_tabulate(x, f)
1.641998154242472