scipy.interpolate.Akima1DInterpolator#
- class Akima1DInterpolator(x, y, axis=0, *, method: Literal['akima', 'makima'] = 'akima')[source]#
Akima interpolator
Fit piecewise cubic polynomials, given vectors x and y. The interpolation method by Akima uses a continuously differentiable sub-spline built from piecewise cubic polynomials. The resultant curve passes through the given data points and will appear smooth and natural.
Parameters#
- xndarray, shape (npoints, )
1-D array of monotonically increasing real values.
- yndarray, shape (…, npoints, …)
N-D array of real values. The length of
yalong the interpolation axis must be equal to the length ofx. Use theaxisparameter to select the interpolation axis.Deprecated since version 1.13.0: Complex data is deprecated and will raise an error in SciPy 1.15.0. If you are trying to use the real components of the passed array, use
np.realony.- axisint, optional
Axis in the
yarray corresponding to the x-coordinate values. Defaults toaxis=0.- method{‘akima’, ‘makima’}, optional
If
"makima", use the modified Akima interpolation [2]. Defaults to"akima", use the Akima interpolation [1].Added in version 1.13.0.
Methods#
__call__ derivative antiderivative roots
See Also#
PchipInterpolator : PCHIP 1-D monotonic cubic interpolator. CubicSpline : Cubic spline data interpolator. PPoly : Piecewise polynomial in terms of coefficients and breakpoints
Notes#
Added in version 0.14.
Use only for precise data, as the fitted curve passes through the given points exactly. This routine is useful for plotting a pleasingly smooth curve through a few given points for purposes of plotting.
Let \(\delta_i = (y_{i+1} - y_i) / (x_{i+1} - x_i)\) be the slopes of the interval \(\left[x_i, x_{i+1}\right)\). Akima’s derivative at \(x_i\) is defined as:
\[d_i = \frac{w_1}{w_1 + w_2}\delta_{i-1} + \frac{w_2}{w_1 + w_2}\delta_i\]In the Akima interpolation [1] (
method="akima"), the weights are:\[\begin{split}\begin{aligned} w_1 &= |\delta_{i+1} - \delta_i| \\ w_2 &= |\delta_{i-1} - \delta_{i-2}| \end{aligned}\end{split}\]In the modified Akima interpolation [2] (
method="makima"), to eliminate overshoot and avoid edge cases of both numerator and denominator being equal to 0, the weights are modified as follows:\[\begin{split}\begin{align*} w_1 &= |\delta_{i+1} - \delta_i| + |\delta_{i+1} + \delta_i| / 2 \\ w_2 &= |\delta_{i-1} - \delta_{i-2}| + |\delta_{i-1} + \delta_{i-2}| / 2 \end{align*}\end{split}\]Examples#
Comparison of
method="akima"andmethod="makima":>>> import numpy as np >>> from scipy.interpolate import Akima1DInterpolator >>> import matplotlib.pyplot as plt >>> x = np.linspace(1, 7, 7) >>> y = np.array([-1, -1, -1, 0, 1, 1, 1]) >>> xs = np.linspace(min(x), max(x), num=100) >>> y_akima = Akima1DInterpolator(x, y, method="akima")(xs) >>> y_makima = Akima1DInterpolator(x, y, method="makima")(xs)
>>> fig, ax = plt.subplots() >>> ax.plot(x, y, "o", label="data") >>> ax.plot(xs, y_akima, label="akima") >>> ax.plot(xs, y_makima, label="makima") >>> ax.legend() >>> fig.show()
The overshoot that occured in
"akima"has been avoided in"makima".References#
Methods
__init__(x, y[, axis, method])antiderivative([nu])Construct a new piecewise polynomial representing the antiderivative.
construct_fast(c, x[, extrapolate, axis])Construct the piecewise polynomial without making checks.
derivative([nu])Construct a new piecewise polynomial representing the derivative.
extend(c, x[, right])Add additional breakpoints and coefficients to the polynomial.
from_bernstein_basis(bp[, extrapolate])Construct a piecewise polynomial in the power basis from a polynomial in Bernstein basis.
from_spline(tck[, extrapolate])Construct a piecewise polynomial from a spline
integrate(a, b[, extrapolate])Compute a definite integral over a piecewise polynomial.
roots([discontinuity, extrapolate])Find real roots of the piecewise polynomial.
solve([y, discontinuity, extrapolate])Find real solutions of the equation
pp(x) == y.Attributes
cxextrapolateaxis