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_polynomial
(doc) 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 构造的结果的行为不是很有用(即使它在一定程度上是可控的)。
我有一组点,在这些点上我使用了 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_polynomial
(doc) 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 构造的结果的行为不是很有用(即使它在一定程度上是可控的)。