scipy.interpolate.
generate_knots#
- scipy.interpolate.generate_knots(x, y, *, w=None, xb=None, xe=None, k=3, s=0, nest=None)[源代码]#
复制 FITPACK 的构造节点向量。
- 参数:
- x, yarray_like
定义曲线
y = f(x)
的数据点。- warray_like,可选
权重。
- xbfloat,可选
近似区间的边界。如果为 None(默认),则设置为
x[0]
。- xefloat,可选
近似区间的边界。如果为 None(默认),则设置为
x[-1]
。- kint,可选
样条的次数。默认值为三次,
k = 3
。- sfloat,可选
平滑因子。默认值为
s = 0
。- nestint,可选
当至少放置了这么多节点时停止。
- 产生:
- tndarray
节点数量不断增加的节点向量。生成器是有限的:当满足平滑标准时,或者当节点数超过最大值时停止:用户提供的 nest 或 x.size + k + 1,这是插值样条的节点向量。
备注
该例程生成长度不断增加的连续节点向量,从
2*(k+1)
到len(x) + k + 1
,试图使节点在 LSQ 样条偏离数据较大的区域更密集。当达到最大节点数
len(x) + k + 1
时(当s
较小且nest
较大时会发生这种情况),生成器停止,最后一个输出是不使用结点的边界条件的插值的节点。节点位于数据站点,除非
k
是偶数,并且节点数为len(x) + k + 1
。在这种情况下,生成器的最后一个输出在 Greville 站点(x[1:] + x[:-1]) / 2
处具有内部节点。在版本 1.15.0 中添加。
示例
生成一些噪声数据并拟合一系列 LSQ 样条
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.interpolate import make_lsq_spline, generate_knots >>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(size=50)
>>> knots = list(generate_knots(x, y, s=1e-10)) >>> for t in knots[::3]: ... spl = make_lsq_spline(x, y, t) ... xs = xs = np.linspace(-3, 3, 201) ... plt.plot(xs, spl(xs), '-', label=f'n = {len(t)}', lw=3, alpha=0.7) >>> plt.plot(x, y, 'o', label='data') >>> plt.plot(xs, np.exp(-xs**2), '--') >>> plt.legend()
请注意,增加节点数量会使结果越来越紧密地跟随数据。
另请注意,生成器的一个步骤可能会添加多个节点
>>> [len(t) for t in knots] [8, 9, 10, 12, 16, 24, 40, 48, 52, 54]