scipy.interpolate.

BarycentricInterpolator#

class scipy.interpolate.BarycentricInterpolator(xi, yi=None, axis=0, *, wi=None, rng=None)[源代码]#

一组点的插值多项式。

构造一个穿过给定点集的多项式。允许计算多项式及其所有导数,高效地更改要插值的 y 值,并通过添加更多的 x 和 y 值进行更新。

出于数值稳定性的考虑,此函数不计算多项式的系数。

在计算该函数之前,需要提供值 yi,但是没有哪个预处理依赖于它们,因此可以进行快速更新。

参数:
xiarray_like, 形状 (npoints, )

多项式应该穿过的点的 x 坐标的一维数组

yiarray_like, 形状 (…, npoints, …), 可选

多项式应该穿过的点的 y 坐标的 N 维数组。如果为 None,则 y 值将稍后通过 set_y 方法提供。沿插值轴的 yi 的长度必须等于 xi 的长度。使用 axis 参数选择正确的轴。

axisint, 可选

yi 数组中与 x 坐标值对应的轴。默认为 axis=0

wiarray_like, 可选

所选插值点 xi 的重心权重。如果不存在或为 None,则权重将从 xi 计算(默认)。如果使用相同的节点 xi 计算多个插值器,则可以重用权重 wi,而无需重新计算。

rng{None, int, numpy.random.Generator}, 可选

如果通过关键字传递 rng,则将 numpy.random.Generator 之外的类型传递给 numpy.random.default_rng 以实例化 Generator。如果 rng 已经是 Generator 实例,则使用提供的实例。指定 rng 以进行可重复的插值。

如果通过关键字传递此参数 random_state,则应用参数 random_state 的旧行为

  • 如果 random_state 为 None(或 numpy.random),则使用 numpy.random.RandomState 单例。

  • 如果 random_state 是一个 int,则使用一个新的 RandomState 实例,并使用 random_state 作为种子。

  • 如果 random_state 已经是 GeneratorRandomState 实例,则使用该实例。

在版本 1.15.0 中更改:作为从使用 numpy.random.RandomState 过渡到 numpy.random.GeneratorSPEC-007 过渡的一部分,此关键字从 random_state 更改为 rng。在过渡期间,这两个关键字将继续工作(仅指定其中一个)。在过渡期之后,使用 random_state 关键字将发出警告。random_staterng 关键字的行为如上所述。

注意

此类使用“重心插值”方法,将问题视为有理函数插值的特例。此算法在数值上非常稳定,但即使在精确计算的世界中,除非 x 坐标的选择非常仔细 - 切比雪夫零点(例如,cos(i*pi/n))是一个不错的选择 - 由于龙格现象,多项式插值本身是一个病态过程。

基于 Berrut 和 Trefethen 2004 年的 “重心拉格朗日插值”。

示例

要生成一个五次重心插值器来逼近函数 \(\sin x\) 及其前四个导数,使用 \((0, \frac{\pi}{2})\) 中六个随机间隔的节点

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.interpolate import BarycentricInterpolator
>>> rng = np.random.default_rng()
>>> xi = rng.random(6) * np.pi/2
>>> f, f_d1, f_d2, f_d3, f_d4 = np.sin, np.cos, lambda x: -np.sin(x), lambda x: -np.cos(x), np.sin
>>> P = BarycentricInterpolator(xi, f(xi), random_state=rng)
>>> fig, axs = plt.subplots(5, 1, sharex=True, layout='constrained', figsize=(7,10))
>>> x = np.linspace(0, np.pi, 100)
>>> axs[0].plot(x, P(x), 'r:', x, f(x), 'k--', xi, f(xi), 'xk')
>>> axs[1].plot(x, P.derivative(x), 'r:', x, f_d1(x), 'k--', xi, f_d1(xi), 'xk')
>>> axs[2].plot(x, P.derivative(x, 2), 'r:', x, f_d2(x), 'k--', xi, f_d2(xi), 'xk')
>>> axs[3].plot(x, P.derivative(x, 3), 'r:', x, f_d3(x), 'k--', xi, f_d3(xi), 'xk')
>>> axs[4].plot(x, P.derivative(x, 4), 'r:', x, f_d4(x), 'k--', xi, f_d4(xi), 'xk')
>>> axs[0].set_xlim(0, np.pi)
>>> axs[4].set_xlabel(r"$x$")
>>> axs[4].set_xticks([i * np.pi / 4 for i in range(5)],
...                   ["0", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$\frac{3\pi}{4}$", r"$\pi$"])
>>> axs[0].set_ylabel("$f(x)$")
>>> axs[1].set_ylabel("$f'(x)$")
>>> axs[2].set_ylabel("$f''(x)$")
>>> axs[3].set_ylabel("$f^{(3)}(x)$")
>>> axs[4].set_ylabel("$f^{(4)}(x)$")
>>> labels = ['Interpolation nodes', 'True function $f$', 'Barycentric interpolation']
>>> axs[0].legend(axs[0].get_lines()[::-1], labels, bbox_to_anchor=(0., 1.02, 1., .102),
...               loc='lower left', ncols=3, mode="expand", borderaxespad=0., frameon=False)
>>> plt.show()
../../_images/scipy-interpolate-BarycentricInterpolator-1.png
属性:
dtype

方法

__call__(x)

在点 x 处计算插值多项式

add_xi(xi[, yi])

将更多 x 值添加到要插值的集合中

derivative(x[, der])

在点 x 处计算多项式的单个导数。

derivatives(x[, der])

在点 x 处计算多项式的多个导数

set_yi(yi[, axis])

更新要插值的 y 值