scipy.interpolate.

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 - dd 次多项式混合在一起。对于 d = n - 1,它等价于多项式插值。必须满足 0 <= d < n,默认为 3。

另请参阅

AAA

实函数和复函数的重心有理逼近。

pade

Padé 逼近。

注释

Floater-Hormann 插值器是一个有理函数,它对数据进行插值,近似阶数为 \(O(h^{d+1})\)。有理函数将 n - dd 次多项式混合在一起,生成一个在实轴上没有极点的有理插值器,这与 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()
../../_images/scipy-interpolate-FloaterHormannInterpolator-1.png
属性:
weights数组

重心逼近的权重。

方法

__call__(z)

在给定值处评估有理逼近。

poles()

计算有理逼近的极点。

residues()

计算逼近的极点的残差。

roots()

计算有理逼近的零点。