FloaterHormannInterpolator#
- class scipy.interpolate.FloaterHormannInterpolator(points, values, *, d=3)[源代码]#
Floater-Hormann 重心有理插值。
如 [1] 中所述,Floater 和 Hormann 的方法计算重心有理插值的权重,该插值在实轴上没有极点。
- 参数:
- x类数组,形状 (n,)
包含自变量值的 1-D 数组。值可以是实数或复数,但必须是有限的。
- y类数组,形状 (n, …)
包含因变量值的数组。values 的无限值和 NaN 值以及 x 的相应值将被丢弃。
- dint,可选
将
n - d
个 d 次多项式混合在一起。对于d = n - 1
,它等价于多项式插值。必须满足0 <= d < n
,默认为 3。
注释
Floater-Hormann 插值器是一个有理函数,它对数据进行插值,近似阶数为 \(O(h^{d+1})\)。有理函数将
n - d
个 d 次多项式混合在一起,生成一个在实轴上没有极点的有理插值器,这与AAA
不同。插值器由下式给出\[r(x) = \frac{\sum_{i=0}^{n-d} \lambda_i(x) p_i(x)} {\sum_{i=0}^{n-d} \lambda_i(x)},\]其中 \(p_i(x)\) 是通过点 \((x_i,y_i),\dots,(x_{i+d},y_{i+d}), and :math:\)lambda_i(z)` 的至多 d 次的插值多项式,是根据以下公式定义的混合函数
\[\lambda_i(x) = \frac{(-1)^i}{(x - x_i)\cdots(x - x_{i+d})}.\]当
d = n - 1
时,这将简化为多项式插值。由于其稳定性,以下重心表示的方程用于计算
\[r(z) = \frac{\sum_{k=1}^m\ w_k f_k / (x - x_k)}{\sum_{k=1}^m w_k / (x - x_k)},\]其中权重 \(w_j\) 的计算公式为
\[\begin{split}w_k &= (-1)^{k - d} \sum_{i \in J_k} \prod_{j = i, j \neq k}^{i + d} 1/|x_k - x_j|, \\ J_k &= \{ i \in I: k - d \leq i \leq k\},\\ I &= \{0, 1, \dots, n - d\}.\end{split}\]参考文献
[1]M.S. Floater 和 K. Hormann,“Barycentric rational interpolation with no poles and high rates of approximation”,Numer. Math. 107, 315 (2007)。 DOI:10.1007/s00211-007-0093-y
示例
在这里,我们将该方法与多项式插值进行比较,在一个由于龙格现象而导致多项式插值失败的示例中。
>>> import numpy as np >>> from scipy.interpolate import (FloaterHormannInterpolator, ... BarycentricInterpolator) >>> def f(z): ... return 1/(1 + z**2) >>> z = np.linspace(-5, 5, num=15) >>> r = FloaterHormannInterpolator(z, f(z)) >>> p = BarycentricInterpolator(z, f(z)) >>> zz = np.linspace(-5, 5, num=1000) >>> import matplotlib.pyplot as plt >>> fig, ax = plt.subplots() >>> ax.plot(zz, r(zz), label="Floater=Hormann") >>> ax.plot(zz, p(zz), label="Polynomial") >>> ax.legend() >>> plt.show()
- 属性:
- weights数组
重心逼近的权重。
方法
__call__
(z)在给定值处评估有理逼近。
poles
()计算有理逼近的极点。
residues
()计算逼近的极点的残差。
roots
()计算有理逼近的零点。