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

Integral function of a interpolating polynomial in python

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

self.p=interpolate.interp1d(self.__discreteDistribution['x'], self.__discreteDistribution['y'], kind='cubic')

我可以很容易地使用 scipy 来计算一个区间内积分的 ,使用

integrate.quad(self.p, 0, max)

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

遇到这种情况你会怎么做?

那个 interp1d method 似乎只是给你一个插值函数的函数对象,它允许你评估任意函数值。

查看文档,我没有看到内部表示的接口。 我猜这是分段定义的三次多项式的总和。 在那种情况下,您的原语将是分段定义的二次多项式的总和。那真的对你有用吗?

除了直接计算样条曲线(如 askewchan 的评论中所建议的那样),您可以尝试在每个子区间上使用带有 approximate_taylor_polynomialdoc) to resample and get poly1d (doc) objects on each subinterval and then use poly1d.integ (doc)的函数值来获取基元的系数.

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

方法一:单变量样条。

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

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

In [9]: spl.integral(-1, 1)
Out[9]: 0.5000000000000001

方法 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

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

方法三:interp1d.

在幕后,interp1d 也使用 b 样条曲线(除非您要求 kind='linear' 或 'nearest'),但评估例程不同。 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)

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