scipy.interpolate.make_interp_spline

scipy.interpolate.make_interp_spline(x, y, k=3, t=None, bc_type=None, axis=0, check_finite=True)[源代码]

计算插值B样条的(系数)。

参数
x类似数组,形状(n,)

横坐标。

y类似数组,形状(n,.)

坐标。

k整型,可选

B样条次数。默认值为立方体,k=3。

tARRAY_LIKE,Shape(nt+k+1,),可选。

结。节点的数量需要与数据点的数量和边缘的导数数量一致。具体地说, nt - n 必须等于 len(deriv_l) + len(deriv_r)

bc_type2元组或无

边界条件。默认值为None,表示自动选择边界条件。否则,它必须是长度为2的元组,其中第一个元素将边界条件设置为 x[0] 第二个元素将边界条件设置为 x[-1] 。它们中的每一个都必须是可迭代的对 (order, value) 它给出了在插值区间的给定边缘处的指定阶导数的值。或者,可以识别以下字符串别名:

  • "clamped" :末端的一阶导数为零。这是

    相当于 bc_type=([(1, 0.0)], [(1, 0.0)])

  • "natural" :末端的二阶导数为零。这相当于 bc_type=([(2, 0.0)], [(2, 0.0)])

  • "not-a-knot" (默认):第一段和第二段是相同的多项式。这相当于拥有 bc_type=None

  • "periodic" :值和第一个 k-1 两端的导数是等价的。

axis整型,可选

插值轴。默认值为0。

check_finite布尔值,可选

是否检查输入数组是否仅包含有限数字。禁用可能会带来性能提升,但如果输入确实包含无穷大或NAN,则可能会导致问题(崩溃、非终止)。默认值为True。

退货
b :阶数的B样条对象 k 用打结的方式 t一个B样条对象的阶数

参见

BSpline

表示B样条对象的基类

CubicSpline

基于多项式基的三次样条

make_lsq_spline

样条拟合的相似工厂函数

UnivariateSpline

FITPACK样条拟合例程的包装器

splrep

FITPACK样条拟合例程的包装器

示例

在切比雪夫节点上使用三次插值:

>>> def cheb_nodes(N):
...     jj = 2.*np.arange(N) + 1
...     x = np.cos(np.pi * jj / 2 / N)[::-1]
...     return x
>>> x = cheb_nodes(20)
>>> y = np.sqrt(1 - x**2)
>>> from scipy.interpolate import BSpline, make_interp_spline
>>> b = make_interp_spline(x, y)
>>> np.allclose(b(x), y)
True

请注意,默认值为具有非结点边界条件的三次样条

>>> b.k
3

这里我们使用的是一条边为零的二阶导数为零的自然样条线:

>>> l, r = [(2, 0.0)], [(2, 0.0)]
>>> b_n = make_interp_spline(x, y, bc_type=(l, r))  # or, bc_type="natural"
>>> np.allclose(b_n(x), y)
True
>>> x0, x1 = x[0], x[-1]
>>> np.allclose([b_n(x0, 2), b_n(x1, 2)], [0, 0])
True

还支持参数曲线的插值。作为例子,我们计算了极坐标下蜗牛曲线的离散化。

>>> phi = np.linspace(0, 2.*np.pi, 40)
>>> r = 0.3 + np.cos(phi)
>>> x, y = r*np.cos(phi), r*np.sin(phi)  # convert to Cartesian coordinates

构建一条插值曲线,并按角度将其参数化

>>> from scipy.interpolate import make_interp_spline
>>> spl = make_interp_spline(phi, np.c_[x, y])

在更精细的网格上计算插值(请注意,我们转置结果以将其解包为一对x和y数组)

>>> phi_new = np.linspace(0, 2.*np.pi, 100)
>>> x_new, y_new = spl(phi_new).T

打印结果

>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'o')
>>> plt.plot(x_new, y_new, '-')
>>> plt.show()
../../_images/scipy-interpolate-make_interp_spline-1_00_00.png

使用二维y构建B样条曲线

>>> x = np.linspace(0, 2*np.pi, 10)
>>> y = np.array([np.sin(x), np.cos(x)])

满足周期条件是因为端点上的点的y坐标是等价的

>>> ax = plt.axes(projection='3d')
>>> xx = np.linspace(0, 2*np.pi, 100)
>>> bspl = make_interp_spline(x, y, k=5, bc_type='periodic', axis=1)
>>> ax.plot3D(xx, *bspl(xx))
>>> ax.scatter3D(x, *y, color='red')
>>> plt.show()
../../_images/scipy-interpolate-make_interp_spline-1_01_00.png