scipy —如何集成线性插值函数?

我有一个函数,它是相对较大的一组数据的插值.我使用线性插值interp1d,所以有很多非平滑的尖点,例如this.scipy的quad函数会由于尖点而发出警告.我想知道如何在没有警告的情况下进行集成?

谢谢!

感谢所有的答案.在这里我总结了解决方案,以防其他人遇到相同的问题:

>就像@Stelios所做的一样,请使用点数来避免警告并获得更准确的结果.
>在实践中,点的数量通常大于quad的默认限制(limit = 50),因此我选择quad(f_interp,a,b,limit = 2 * p.shape [0],points = p)以避免所有这些警告.
>如果a和b与数据集x的起点或终点不同,则可以通过p = x [其中(x> = a和x< = b)]选择点p

解决方法:

Quad接受一个称为点的可选参数.根据文档:

points : (sequence of floats,ints), optional

A sequence of break points in the bounded integration interval where
local difficulties of the integrand may occur (e.g., singularities,
discontinuities). The sequence does not have to be sorted.

在您的情况下,“困难”点恰好是数据点的x坐标.这是一个例子:

import numpy as np 
from scipy.integrate import quad
np.random.seed(123)

# generate random data set 
x = np.arange(0,10)  
y = np.random.rand(10)

# construct a linear interpolation function of the data set 
f_interp = lambda xx: np.interp(xx, x, y)

这是数据点和f_interp的图:
scipy —如何集成线性插值函数?

现在调用quad为

quad(f_interp,0,9)

返回一系列警告以及

(4.89770017785734, 1.3762838395159349e-05)

如果您提供points参数,即

quad(f_interp,0,9, points = x)

它不发出警告,结果是

(4.8977001778573435, 5.437539505167948e-14)

与之前的调用相比,这也意味着结果的准确性更高.

上一篇:python-有效地将大量SciPy稀疏矩阵条目设置为零


下一篇:曲线拟合与python错误