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,但我没有插值多项式的分析版本。
在这种情况下你会做什么?
假设您使用分段插值器(而不是全局多项式插值),可以通过多种方式使用 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 构造的结果的行为不是很有用(即使它在一定程度上是可控的)。