LSQUnivariateSplinewithUnits¶
- class interpolated_coordinates.utils.spline.LSQUnivariateSplinewithUnits(x: Quantity, y: Quantity, t: Quantity, w: ndarray | None = None, bbox: BBoxType = [None, None], k: int = 3, ext: int = 0, check_finite: bool = False, *, x_unit: UnitLikeType | None = None, y_unit: UnitLikeType | None = None)[source]¶
Bases:
UnivariateSplinewithUnits
,LSQUnivariateSpline
1-D spline with explicit internal knots.
Fits a spline y = spl(x) of degree
k
to the providedx
,y
data.t
specifies the internal knots of the spline- Parameters:
- x(N,) array_like
Input dimension of data points – must be increasing
- y(N,) array_like
Input dimension of data points
- t(M,) array_like
interior knots of the spline. Must be in ascending order and:
bbox[0] < t[0] < ... < t[-1] < bbox[-1]
- w(N,) array_like, optional
weights for spline fitting. Must be positive. If None (default), weights are all equal.
- bbox(2,) array_like, optional
2-sequence specifying the boundary of the approximation interval. If None (default),
bbox = [x[0], x[-1]]
.- k
int
, optional Degree of the smoothing spline. Must be 1 <=
k
<= 5. Default isk
= 3, a cubic spline.- ext
int
orstr
, optional Controls the extrapolation mode for elements not in the interval defined by the knot sequence.
if ext=0 or ‘extrapolate’, return the extrapolated value.
if ext=1 or ‘zeros’, return 0
if ext=2 or ‘raise’, raise a ValueError
if ext=3 of ‘const’, return the boundary value.
The default value is 0.
- check_finitebool, optional
Whether to check that the input arrays contain only finite numbers. Disabling may give a performance gain, but may result in problems (crashes, non-termination or non-sensical results) if the inputs do contain infinities or NaNs. Default is False.
- x_unit, y_unitunit-like or
None
, optional keyword-only The
Unit
ofx
/y
(if notNone
), and to whichx
/y
will be converted before the value is used in the underlying interpolation machinery. Ifx
/y
does not have units (e.g. is anndarray
) this cannot not beNone
.
- Raises:
ValueError
If the interior knots do not satisfy the Schoenberg-Whitney conditions.
See also
UnivariateSpline
a smooth univariate spline to fit a given set of data points.
InterpolatedUnivariateSpline
a interpolating univariate spline for a given set of data points.
splrep
a function to find the B-spline representation of a 1-D curve
splev
a function to evaluate a B-spline or its derivatives
sproot
a function to find the roots of a cubic B-spline
splint
a function to evaluate the definite integral of a B-spline between two given points
spalde
a function to evaluate all derivatives of a B-spline
Notes
The number of data points must be larger than the spline degree
k
.Knots
t
must satisfy the Schoenberg-Whitney conditions, i.e., there must be a subset of data pointsx[j]
such thatt[j] < x[j] < t[j+k+1]
, forj=0, 1,...,n-k-2
.Examples
>>> import numpy as np >>> import astropy.units as u >>> import matplotlib.pyplot as plt >>> from interpolated_coordinates.utils import LSQUnivariateSplinewithUnits
>>> x = np.linspace(-3, 3, 50) * u.m >>> y = np.exp(-x.value**2) + 0.1 * np.random.randn(50) << u.s
Fit a smoothing spline with a pre-defined internal knots:
>>> t = [-1, 0, 1] >>> spl = LSQUnivariateSplinewithUnits(x, y, t)
(
Source code
,png
,hires.png
,pdf
)Check the knot vector:
>>> spl.get_knots() <Quantity [-3., -1., 0., 1., 3.] m>
Constructing lsq spline using the knots from another spline:
>>> x = np.arange(10) * u.m >>> s = UnivariateSplinewithUnits(x, x, s=0) >>> s.get_knots() <Quantity [0., 2., 3., 4., 5., 6., 7., 9.] m>
>>> knt = s.get_knots() >>> s1 = LSQUnivariateSplinewithUnits(x, x, knt[1:-1]) # Chop 1st and last knot >>> s1.get_knots() <Quantity [0., 2., 3., 4., 5., 6., 7., 9.] m>
Attributes Summary
Unit
of the independent data.Unit
of the dependent data.Methods Summary
__call__
(x[, nu, ext])Evaluate spline (or its nu-th derivative) at positions x.
antiderivative
([n])Construct a new spline representing this spline's antiderivative.
derivative
([n])Construct a new spline representing the derivative of this spline.
derivatives
(x)Return all derivatives of the spline at the point x.
Return spline coefficients.
Return positions of interior knots of the spline.
Return weighted sum of squared residuals of spline approximation.
integral
(a, b)Return definite integral of the spline between two given points.
roots
()Return the zeros of the spline.
Continue spline computation with the given smoothing factor s and with the knots found at the last call.
validate_input
(x, y, w, bbox, k, s, ext, ...)Attributes Documentation
Methods Documentation
- __call__(x: ndarray, nu: int = 0, ext: int | None = None) Quantity ¶
Evaluate spline (or its nu-th derivative) at positions x.
- Parameters:
- x
ndarray
orQuantity
array_like A 1-D array of points at which to return the value of the smoothed spline or its derivatives. Note:
x
can be unordered but the evaluation is more efficient ifx
is (partially) ordered.- nu
int
, optional The order of derivative of the spline to compute.
- ext
int
, optional Controls the value returned for elements of
x
not in the interval defined by the knot sequence.if ext=0 or ‘extrapolate’, return the extrapolated value.
if ext=1 or ‘zeros’, return 0
if ext=2 or ‘raise’, raise a ValueError
if ext=3 or ‘const’, return the boundary value.
The default value is 0, passed from the initialization of UnivariateSpline.
- x
- Returns:
- y
Quantity
array_like Evaluated spline with units
y_unit
. Same shape asx
.
- y
- antiderivative(n: int = 1) USwUType ¶
Construct a new spline representing this spline’s antiderivative.
- Parameters:
- n
int
, optional Order of antiderivative to evaluate. Default: 1
- n
- Returns:
- spline
UnivariateSplinewithUnits
Spline of order k2=k+n representing the antiderivative of this spline.
- spline
See also
splantider
,derivative
Examples
>>> from scipy.interpolate import UnivariateSpline >>> x = np.linspace(0, np.pi/2, 70) >>> y = 1 / np.sqrt(1 - 0.8*np.sin(x)**2) >>> spl = UnivariateSpline(x, y, s=0)
The derivative is the inverse operation of the antiderivative, although some floating point error accumulates:
>>> spl(1.7) - spl.antiderivative().derivative()(1.7) != 0 True
Antiderivative can be used to evaluate definite integrals:
>>> ispl = spl.antiderivative() >>> ispl(np.pi/2) - ispl(0) 2.2572053588768486
This is indeed an approximation to the complete elliptic integral \(K(m) = \\int_0^{\\pi/2} [1 - m\\sin^2 x]^{-1/2} dx\):
>>> from scipy.special import ellipk >>> ellipk(0.8) 2.2572053268208538
- derivative(n: int = 1) USwUType ¶
Construct a new spline representing the derivative of this spline.
- Parameters:
- n
int
, optional Order of derivative to evaluate. Default: 1
- n
- Returns:
- spline
UnivariateSpline
Spline of order k2=k-n representing the derivative of this spline.
- spline
See also
splder
,antiderivative
Examples
This can be used for finding maxima of a curve:
>>> from interpolated_coordinates.utils import UnivariateSplinewithUnits >>> x = np.linspace(0, 10, 70) * u.s >>> y = np.sin(x.value) * u.m >>> spl = UnivariateSplinewithUnits(x, y, k=4, s=0)
Now, differentiate the spline and find the zeros of the derivative. (NB:
sproot
only works for order 3 splines, so we fit an order 4 spline):>>> spl.derivative().roots() / np.pi <Quantity [0.50000001, 1.5 , 2.49999998] s>
This agrees well with roots \(\\pi/2 + n\\pi\) of \(\\cos(x) = \\sin'(x)\).
- derivatives(x: Quantity) ndarray ¶
Return all derivatives of the spline at the point x.
- Parameters:
- x
Quantity
The point to evaluate the derivatives at.
- x
- Returns:
Examples
>>> from scipy.interpolate import UnivariateSpline >>> x = np.linspace(0, 3, 11) >>> y = x**2 >>> spl = UnivariateSpline(x, y) >>> np.round(spl.derivatives(1.5), 2) array([2.25, 3. , 2. , 0. ])
- get_knots() Quantity ¶
Return positions of interior knots of the spline.
Internally, the knot vector contains
2*k
additional boundary knots. Has units ofx
position
- get_residual() Quantity ¶
Return weighted sum of squared residuals of spline approximation.
- This is equivalent to::
sum((w[i] * (y[i]-spl(x[i])))**2, axis=0)
- integral(a: Quantity, b: Quantity) Quantity ¶
Return definite integral of the spline between two given points.
- Parameters:
- Returns:
- integral
float
The value of the definite integral of the spline between limits.
- integral
Examples
>>> from scipy.interpolate import UnivariateSpline >>> x = np.linspace(0, 3, 11) >>> y = x**2 >>> spl = UnivariateSpline(x, y) >>> spl.integral(0, 3) 9.0
which agrees with \(\int x^2 dx = x^3 / 3\) between the limits of 0 and 3.
A caveat is that this routine assumes the spline to be zero outside of the data limits:
>>> spl.integral(-1, 4) 9.0
>>> spl.integral(-1, 0) 0.0
- roots() Quantity ¶
Return the zeros of the spline.
Restriction: only cubic splines are supported by fitpack.
- set_smoothing_factor(s)¶
Continue spline computation with the given smoothing factor s and with the knots found at the last call.
This routine modifies the spline in place.