cupyx.scipy.interpolate.BPoly#

cupyx.scipy.interpolate.BPoly(c, x, extrapolate=None, axis=0)[source]#

分段多项式,由系数和断点定义。

x[i]x[i + 1] 之间的多项式使用以下 Bernstein 多项式基表示:

Bernstein 多项式基

S = sum(c[a, i] * b(a, k; x) for a in range(k+1)),

其中 k 是多项式的次数,且

b(a, k; x) = binom(k, a) * t**a * (1 - t)**(k - a),

其中 t = (x - x[i]) / (x[i+1] - x[i])binom 是二项式系数。

参数:
  • c (ndarray, 形状 (k, m, ...)) – 多项式系数,k 阶,m 个区间

  • x (ndarray, 形状 (m+1,)) – 多项式断点。必须按递增或递减顺序排序。

  • extrapolate (bool, 可选) – 如果是布尔值,确定是根据第一个和最后一个区间对外插点进行外插,还是返回 NaNs。如果是 'periodic',则使用周期性外插。默认为 True。

  • axis (int, 可选) – 插值轴。默认为零。

变量:
  • x (ndarray) – 断点。

  • c (ndarray) – 多项式的系数。它们被重塑为一个 3 维数组,最后一维代表原始系数数组的尾部维度。

  • axis (int) – 插值轴。

另请参阅

PPoly

幂基中的分段多项式

注意

Bernstein 多项式的性质在文献中有详细记录,例如参见 [1] [2] [3]

参考文献

示例

>>> from cupyx.scipy.interpolate import BPoly
>>> x = [0, 1]
>>> c = [[1], [2], [3]]
>>> bp = BPoly(c, x)

这创建了一个 2 阶多项式

\[\begin{split}B(x) = 1 \times b_{0, 2}(x) + 2 \times b_{1, 2}(x) + 3 \times b_{2, 2}(x) \\ = 1 \times (1-x)^2 + 2 \times 2 x (1 - x) + 3 \times x^2\end{split}\]

方法

__call__(x, nu=0, extrapolate=None)[source]#

计算分段多项式或其导数的值。

参数:
  • x (array_like) – 用于计算插值点的数组。

  • nu (int, 可选) – 要计算的导数阶数。必须是非负整数。

  • extrapolate ({bool, 'periodic', None}, 可选) – 如果是布尔值,确定是根据第一个和最后一个区间对外插点进行外插,还是返回 NaNs。如果是 'periodic',则使用周期性外插。如果为 None (默认),则使用 self.extrapolate

返回值:

y – 插值结果。形状由将原始数组中的插值轴替换为 x 的形状来确定。

返回类型:

array_like

注意

导数是对每个多项式段分段计算的,即使多项式在断点处不可微。多项式区间被视为半开区间 [a, b),最后一个区间除外,它是闭区间 [a, b]

antiderivative(nu=1)[source]#

构造一个新的分段多项式,表示其反导数(不定积分)。

参数:

nu (int, 可选) – 要计算的反导数阶数。默认为 1,即计算一阶积分。如果为负,则返回导数。

返回值:

bp – 阶数为 k + nu 的分段多项式,表示此多项式的反导数。

返回类型:

BPoly

注意

如果计算了反导数且 self.extrapolate='periodic',则返回实例的该属性将设置为 False。这样做是因为反导数不再是周期性的,并且难以在其初始给定 x 区间之外正确计算其值。

类方法 construct_fast(c, x, extrapolate=None, axis=0)[source]#

构造分段多项式时不进行检查。接受与构造函数相同的参数。输入参数 cx 必须是具有正确形状和类型的数组。c 数组只能是浮点型和复数型,x 数组必须是浮点型。

derivative(nu=1)[source]#

构造一个新的分段多项式,表示其导数。

参数:

nu (int, 可选) – 要计算的导数阶数。默认为 1,即计算一阶导数。如果为负,则返回反导数(不定积分)。

返回值:

bp – 阶数为 k - nu 的分段多项式,表示此多项式的导数。

返回类型:

BPoly

extend(c, x)[source]#

向多项式添加额外的断点和系数。

参数:
  • c (ndarray, 大小 (k, m, ...)) – 区间内多项式的额外系数。请注意,第一个额外区间将使用 self.x 的一个端点形成。

  • x (ndarray, 大小 (m,)) – 额外的断点。必须与 self.x 的排序顺序相同,并且位于当前断点的右侧或左侧。

类方法 from_derivatives(xi, yi, orders=None, extrapolate=None)[source]#

使用 Bernstein 基构造分段多项式,使其与指定断点处的值和导数兼容。

参数:
  • xi (array_like) – 已排序的 x 坐标一维数组

  • yi (array_likearray_like 列表) – yi[i][j] 是在 xi[i] 处已知的第 j 阶导数

  • orders (Noneintint 的 array_like。默认值:None。) – 指定局部多项式的次数。如果不是 None,则忽略某些导数。

  • extrapolate (bool'periodic', 可选) – 如果是布尔值,确定是根据第一个和最后一个区间对外插点进行外插,还是返回 NaNs。如果是 'periodic',则使用周期性外插。默认为 True。

注意

如果在断点 x 处指定了 k 阶导数,除非明确提供了 order,否则构造的多项式在 x 处恰好是 k 次连续可微的。在后一种情况下,多项式在断点处的平滑度由 order 控制。

根据 order 和可用导数数量,推断出两端要匹配的导数数量。如果可能,它在两端使用相同数量的导数;如果数量是奇数,它会尝试从 y2 中获取额外的一个。无论如何,如果一端或另一端的导数数量不足,它会从另一端抽取足够的导数来弥补总量。

如果阶数过高且可用导数不足,将引发异常。

示例

>>> from cupyx.scipy.interpolate import BPoly
>>> BPoly.from_derivatives([0, 1], [[1, 2], [3, 4]])

创建一个在 [0, 1] 上定义的三次多项式 f(x),满足 f(0) = 1, df/dx(0) = 2, f(1) = 3, df/dx(1) = 4

>>> BPoly.from_derivatives([0, 1, 2], [[0, 1], [0], [2]])

创建一个分段多项式 f(x),满足 f(0) = f(1) = 0f(2) = 2,且 df/dx(0) = 1。根据提供的导数数量,局部多项式的阶数在 [0, 1] 上为 2,在 [1, 2] 上为 1。请注意,在 x = 1x = 2 处的导数没有施加限制。

实际上,多项式的显式形式为

f(x) = | x * (1 - x),  0 <= x < 1
       | 2 * (x - 1),  1 <= x <= 2

因此 f’(1-0) = -1 且 f’(1+0) = 2

类方法 from_power_basis(pp, extrapolate=None)[source]#

从幂基多项式构造一个 Bernstein 基的分段多项式。

参数:
  • pp (PPoly) – 幂基中的分段多项式

  • extrapolate (bool'periodic', 可选) – 如果是布尔值,确定是根据第一个和最后一个区间对外插点进行外插,还是返回 NaNs。如果是 'periodic',则使用周期性外插。默认为 True。

integrate(a, b, extrapolate=None)[source]#

计算分段多项式的定积分。

参数:
  • a (float) – 积分下限

  • b (float) – 积分上限

  • extrapolate ({bool, 'periodic', None}, 可选) – 是否根据第一个和最后一个区间对外插点进行外插,或返回 NaNs。如果是 'periodic',则使用周期性外插。如果为 None (默认),则使用 self.extrapolate

返回值:

分段多项式在 [a, b] 上的定积分

返回类型:

array_like

__eq__(value, /)#

返回 self==value。

__ne__(value, /)#

返回 self!=value。

__lt__(value, /)#

返回 self<value。

__le__(value, /)#

返回 self<=value。

__gt__(value, /)#

返回 self>value。

__ge__(value, /)#

返回 self>=value。

属性

c#
x#
extrapolate#
axis#