scipy.interpolate.PPoly.

from_spline#

classmethod PPoly.from_spline(tck, extrapolate=None)[source]#

从样条曲线构造分段多项式

参数:
tck

样条曲线,由 splrep 或 BSpline 对象返回。

extrapolatebool 或 ‘periodic’,可选

如果是 bool,则确定是否基于第一个和最后一个区间外推到越界点,或者返回 NaN。如果是 ‘periodic’,则使用周期性外推。默认值为 True。

示例

构造一个插值样条曲线并将其转换为 PPoly 实例

>>> import numpy as np
>>> from scipy.interpolate import splrep, PPoly
>>> x = np.linspace(0, 1, 11)
>>> y = np.sin(2*np.pi*x)
>>> tck = splrep(x, y, s=0)
>>> p = PPoly.from_spline(tck)
>>> isinstance(p, PPoly)
True

请注意,此函数仅支持开箱即用的 1D 样条曲线。

如果 tck 对象表示参数样条曲线(例如,由 splprepBSpline 构建,其中 c.ndim > 1),您将需要手动循环处理维度。

>>> from scipy.interpolate import splprep, splev
>>> t = np.linspace(0, 1, 11)
>>> x = np.sin(2*np.pi*t)
>>> y = np.cos(2*np.pi*t)
>>> (t, c, k), u = splprep([x, y], s=0)

请注意,c 是一个包含两个长度为 11 的数组的列表。

>>> unew = np.arange(0, 1.01, 0.01)
>>> out = splev(unew, (t, c, k))

要将此样条曲线转换为幂基,我们将 b 样条曲线系数列表 c 的每个分量转换为相应的三次多项式。

>>> polys = [PPoly.from_spline((t, cj, k)) for cj in c]
>>> polys[0].c.shape
(4, 14)

请注意,多项式 polys 的系数位于幂基中,它们的维度恰好反映了这一点:这里 4 是阶数(degree+1),14 是区间数——这只不过是原始 tck 的节点数组的长度减一。

可选地,我们可以将组件沿第三个维度堆叠到单个 PPoly

>>> cc = np.dstack([p.c for p in polys])    # has shape = (4, 14, 2)
>>> poly = PPoly(cc, polys[0].x)
>>> np.allclose(poly(unew).T,     # note the transpose to match `splev`
...             out, atol=1e-15)
True