scipy.interpolate.

sproot#

scipy.interpolate.sproot(tck, mest=10)[source]#

Find the roots of a cubic B-spline.

Legacy

This function is considered legacy and will no longer receive updates. While we currently have no plans to remove it, we recommend that new code uses more modern alternatives instead. Specifically, we recommend constructing a BSpline object and using the following pattern: PPoly.from_spline(spl).roots().

Given the knots (>=8) and coefficients of a cubic B-spline return the roots of the spline.

Parameters:
tcktuple or a BSpline object

If a tuple, then it should be a sequence of length 3, containing the vector of knots, the B-spline coefficients, and the degree of the spline. The number of knots must be >= 8, and the degree must be 3. The knots must be a montonically increasing sequence.

mestint, optional

An estimate of the number of zeros (Default is 10).

Returns:
zerosndarray

An array giving the roots of the spline.

Notes

Manipulating the tck-tuples directly is not recommended. In new code, prefer using the BSpline objects.

References

[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.

Examples

For some data, this method may miss a root. This happens when one of the spline knots (which FITPACK places automatically) happens to coincide with the true root. A workaround is to convert to PPoly, which uses a different root-finding algorithm.

For example,

>>> 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)

Converting to a PPoly object does find the roots at x=2:

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

Further examples are given in the tutorial.