sproot#
- scipy.interpolate.sproot(tck, mest=10)[source]#
Find the roots of a cubic B-spline.
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.