python中插值多项式的积分函数

asd*_*sdf 0 python numpy integral scipy

我有一组点,在这些点上我使用 scipy 来计算插值多项式。我希望拥有该函数的原语

self.p=interpolate.interp1d(self.__discreteDistribution['x'], self.__discreteDistribution['y'], kind='cubic')
Run Code Online (Sandbox Code Playgroud)

我可以轻松地使用 scipy 计算一个区间内的积分值,使用

integrate.quad(self.p, 0, max)
Run Code Online (Sandbox Code Playgroud)

我想要的是拥有 self.p() 的原语。我找到了 sympy,但我没有插值多项式的分析版本。

在这种情况下你会做什么?

ev-*_*-br 5

假设您使用分段插值器(而不是全局多项式插值),可以通过多种方式使用 scipy 来实现:

方法 1:单变量样条。

In [1]: import numpy as np

In [2]: x = np.arange(8)

In [3]: y = x

In [4]: from scipy.interpolate import interp1d

In [5]: from scipy.interpolate import interp1d, UnivariateSpline

In [6]: spl = UnivariateSpline(x, y, s=0)

In [7]: spl.<TAB>
spl.antiderivative        spl.get_coeffs            spl.roots
spl.derivative            spl.get_knots             spl.set_smoothing_factor
spl.derivatives           spl.get_residual          
spl.ext                   spl.integral              

In [8]: spl.integral(0, 1)
Out[8]: 0.5000000000000001
Run Code Online (Sandbox Code Playgroud)

UnivariateSpline 的两个怪癖:首先,用于s=0插值(与最小二乘拟合相反)。其次,注意对越界的推断。默认情况下,UnivariateSpline推断越界值(这可以在构造函数中控制),但.integral假设样条线为零越界。

In [9]: spl.integral(-1, 1)
Out[9]: 0.5000000000000001
Run Code Online (Sandbox Code Playgroud)

方法2:splev、splrep和夹板。

In [13]: from scipy.interpolate import splev, splint, splrep

In [14]: tck = splrep(x, y, s=0)

In [15]: splint(0, 1, tck)
Out[15]: 0.5000000000000001
Run Code Online (Sandbox Code Playgroud)

这相当于使用 UnivariateSpline,只是接口有点不同。有关详细信息,请参阅文档。

方法3:interp1d。

在底层,interp1d也使用 b 样条线(除非您请求 kind='线性' 或 '最近'),但评估例程不同。 interp1d构造一个可调用的,然后可以将其提供给通用积分器。

In [18]: from scipy.interpolate import interp1d

In [19]: interp = interp1d(x, y, kind='cubic')

In [20]: from scipy.integrate import quad

In [21]: quad(interp, 0, 1)
Out[21]: (0.5000000000000024, 5.5511151231258095e-15)
Run Code Online (Sandbox Code Playgroud)

再次,请注意越界值:由 interp1d 构造的结果的行为不是很有用(即使它在一定程度上是可控的)。