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, …)
纵坐标。
- kint,可选
B 样条次数。默认为三次,
k = 3
。- t类似数组,形状 (nt + k + 1,),可选。
节。节点的数量需要与数据点的数量和边界处的导数数量一致。具体而言,
nt - n
必须等于len(deriv_l) + len(deriv_r)
。- bc_type2 元组或 None
边界条件。默认值为 None,表示自动选择边界条件。否则,它必须是长度为 2 的元组,其中第一个元素 (
deriv_l
) 设置x[0]
的边界条件,第二个元素 (deriv_r
) 设置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
导数是等价的。
- axisint,可选
插值轴。默认值为 0。
- check_finitebool,可选
是否检查输入数组是否仅包含有限数。禁用该功能可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、不终止)。默认值为 True。
- 返回:
- b度数为
k
且具有结点t
的 BSpline 对象。
- b度数为
另请参见
BSpline
表示 B 样条曲线对象的基类
CubicSpline
多项式基中的三次样条曲线
make_lsq_spline
一个类似的样条曲线拟合工厂函数
UnivariateSpline
FITPACK 样条曲线拟合例程中的一个包装
splrep
FITPACK 样条曲线拟合例程中的一个包装
示例
在切比雪夫节点上使用三次插值
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> 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
请注意,默认值为具有 not-a-knot 边界条件的三次样条曲线
>>> b.k 3
此处使用“natural”样条曲线,即边缘处 2 阶导数为零
>>> 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
构建一个插值曲线,用角度对其进行参数化
>>> 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
绘制结果
>>> plt.plot(x, y, 'o') >>> plt.plot(x_new, y_new, '-') >>> plt.show()
构建具有 2 维 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()