scipy.interpolate.

sproot#

scipy.interpolate.sproot(tck, mest=10)[源代码]#

查找三次B样条的根。

遗留

此函数被认为是遗留的,将不再接收更新。尽管我们目前没有计划将其移除,但我们建议新代码使用更现代的替代方案。具体来说,我们建议构建一个 BSpline 对象,并使用以下模式:PPoly.from_spline(spl).roots()

给定三次B样条的节点(>=8)和系数,返回样条的根。

参数:
tck元组或 BSpline 对象

如果是一个元组,它应该是一个长度为3的序列,包含节点向量、B样条系数和样条的度数。节点数量必须 >= 8,度数必须为 3。节点必须是单调递增的序列。

mestint,可选

零点数量的估计值(默认为 10)。

返回:
zerosndarray

一个包含样条根的数组。

备注

不建议直接操作 tck 元组。在新代码中,请优先使用 BSpline 对象。

参考文献

[1]

C. de Boor, “On calculating with b-splines”, J. Approximation Theory, 6, p.50-62, 1972.

[2]

M. G. Cox, “The numerical evaluation of b-splines”, J. Inst. Maths Applics, 10, p.134-149, 1972.

[3]

P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 1993.

示例

对于某些数据,此方法可能会遗漏一个根。这发生在某个样条节点(FITPACK 自动放置的)恰好与真实根重合时。一个解决方案是转换为 PPoly,它使用不同的寻根算法。

例如,

>>> x = [1.96, 1.97, 1.98, 1.99, 2.00, 2.01, 2.02, 2.03, 2.04, 2.05]
>>> y = [-6.365470e-03, -4.790580e-03, -3.204320e-03, -1.607270e-03,
...      4.440892e-16,  1.616930e-03,  3.243000e-03,  4.877670e-03,
...      6.520430e-03,  8.170770e-03]
>>> from scipy.interpolate import splrep, sproot, PPoly
>>> tck = splrep(x, y, s=0)
>>> sproot(tck)
array([], dtype=float64)

转换为 PPoly 对象确实能找到 x=2 处的根

>>> ppoly = PPoly.from_spline(tck)
>>> ppoly.roots(extrapolate=False)
array([2.])

更多示例请参阅教程