Akima1DInterpolator#
- class scipy.interpolate.Akima1DInterpolator(x, y, axis=0, *, method='akima', extrapolate=None)[源代码]#
Akima 插值器
拟合分段三次多项式,给定向量 x 和 y。Akima 的插值方法使用从分段三次多项式构建的连续可微子样条。生成的曲线穿过给定的数据点,并呈现平滑自然的形态。
- 参数:
- xndarray,形状 (npoints, )
单调递增的实数值的一维数组。
- yndarray,形状 (…, npoints, …)
实数值的 N 维数组。
y
沿插值轴的长度必须等于x
的长度。使用axis
参数选择插值轴。- axisint,可选
y
数组中对应于 x 坐标值的轴。默认为axis=0
。- method{‘akima’, ‘makima’}, 可选
如果为
"makima"
,则使用改进的 Akima 插值 [2]。默认为"akima"
,使用 Akima 插值 [1]。在 1.13.0 版本中新增。
- extrapolate{bool, None}, 可选
如果为 bool,则确定是否基于第一个和最后一个区间外推到越界点,或者返回 NaN。如果为 None,则
extrapolate
设置为 False。
另请参见
PchipInterpolator
PCHIP 一维单调三次插值器。
CubicSpline
三次样条数据插值器。
PPoly
以系数和断点表示的分段多项式
备注
在 0.14 版本中新增。
仅适用于精确的数据,因为拟合曲线会精确地穿过给定的点。此例程可用于绘制一条通过几个给定点的平滑曲线,以用于绘图目的。
令 \(\delta_i = (y_{i+1} - y_i) / (x_{i+1} - x_i)\) 为区间 \(\left[x_i, x_{i+1}\right)\) 的斜率。Akima 在 \(x_i\) 处的导数定义为
\[d_i = \frac{w_1}{w_1 + w_2}\delta_{i-1} + \frac{w_2}{w_1 + w_2}\delta_i\]在 Akima 插值 [1] (
method="akima"
) 中,权重为\[\begin{split}\begin{aligned} w_1 &= |\delta_{i+1} - \delta_i| \\ w_2 &= |\delta_{i-1} - \delta_{i-2}| \end{aligned}\end{split}\]在改进的 Akima 插值 [2] (
method="makima"
) 中,为了消除过冲并避免分子和分母都等于 0 的边缘情况,权重修改如下\[\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}\]参考
[1] (1,2)基于局部过程的插值和平滑曲线拟合的新方法。Hiroshi Akima,《J. ACM》,1970 年 10 月,17(4),589-602。DOI:10.1145/321607.321609
[2] (1,2)Makima 分段三次插值。Cleve Moler 和 Cosmin Ionita,2019。https://blogs.mathworks.com/cleve/2019/04/29/makima-piecewise-cubic-interpolation/
示例
method="akima"
和method="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()
在
"akima"
中发生的过冲在"makima"
中已避免。- 属性:
- axis
- c
- extrapolate
- x
方法
__call__
(x[, nu, extrapolate])计算分段多项式或其导数。
derivative
([nu])构造一个新的表示导数的分段多项式。
antiderivative
([nu])构造一个新的表示反导数的分段多项式。
roots
([discontinuity, extrapolate])查找分段多项式的实根。