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

节点数量不断增加的节点向量。生成器是有限的:当满足平滑标准时,或者当节点数超过最大值时停止:用户提供的 nestx.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]
../../_images/scipy-interpolate-generate_knots-1.png