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
是二项式系数。- 参数:
- 变量:
另请参阅
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 的分段多项式,表示此多项式的反导数。
- 返回类型:
注意
如果计算了反导数且
self.extrapolate='periodic'
,则返回实例的该属性将设置为 False。这样做是因为反导数不再是周期性的,并且难以在其初始给定 x 区间之外正确计算其值。
- 类方法 construct_fast(c, x, extrapolate=None, axis=0)[source]#
构造分段多项式时不进行检查。接受与构造函数相同的参数。输入参数
c
和x
必须是具有正确形状和类型的数组。c
数组只能是浮点型和复数型,x
数组必须是浮点型。
- 类方法 from_derivatives(xi, yi, orders=None, extrapolate=None)[source]#
使用 Bernstein 基构造分段多项式,使其与指定断点处的值和导数兼容。
- 参数:
xi (array_like) – 已排序的 x 坐标一维数组
yi (array_like 或 array_like 列表) –
yi[i][j]
是在xi[i]
处已知的第j
阶导数orders (None 或 int 或 int 的 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) = 0,f(2) = 2,且 df/dx(0) = 1。根据提供的导数数量,局部多项式的阶数在 [0, 1] 上为 2,在 [1, 2] 上为 1。请注意,在
x = 1
和x = 2
处的导数没有施加限制。实际上,多项式的显式形式为
f(x) = | x * (1 - x), 0 <= x < 1 | 2 * (x - 1), 1 <= x <= 2
因此 f’(1-0) = -1 且 f’(1+0) = 2
- __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#