make_splrep#
- scipy.interpolate.make_splrep(x, y, *, w=None, xb=None, xe=None, k=3, s=0, t=None, nest=None)[source]#
创建一个具有有界误差并最小化导数跳跃的平滑 B 样条函数。
给定数据点集
(x[i], y[i])
,确定在区间xb <= x <= xe
上k
次光滑样条近似。- 参数:
- x, yarray_like, 形状 (m,)
定义曲线
y = f(x)
的数据点。- warray_like, 形状 (m,), 可选
严格为正的一维权重数组,与 *x* 和 *y* 长度相同。这些权重用于计算加权最小二乘样条拟合。如果 y 值的误差由向量
d
给出标准差,则 *w* 应为1/d
。默认值为np.ones(m)
。- xb, xefloat, 可选
拟合区间。如果为 None,则默认分别为
x[0]
和x[-1]
。- kint, 可选
样条拟合的次数。建议使用三次样条,即默认值
k=3
。应避免使用偶数 *k* 值,尤其是在 *s* 值较小的情况下。- sfloat, 可选
平滑条件。平滑量通过满足 LSQ(最小二乘)约束来确定
sum((w * (g(x) - y))**2 ) <= s
其中
g(x)
是(x, y)
的平滑拟合。用户可以使用 *s* 来控制数据接近度和拟合平滑度之间的权衡。较大的 *s* 意味着更多的平滑,而较小的 *s* 值则表示较少的平滑。*s* 的推荐值取决于权重 *w*。如果权重代表 *y* 标准差的倒数,则 *s* 的良好值应在(m-sqrt(2*m), m+sqrt(2*m))
范围内,其中m
是 *x*、*y* 和 *w* 中的数据点数量。默认值为s = 0.0
,即插值。- tarray_like, 可选
样条结。如果为 None(默认),则结将自动构建。结的数量必须至少为
2*k + 2
,最多为m + k + 1
。- nestint, 可选
结向量的目标长度。应在
2*(k + 1)
(`k` 次样条的最小结数)和m + k + 1
(插值样条的结数)之间。此例程返回的实际结数可能略大于 *nest*。默认值为 None(无限制,最多添加m + k + 1
个结)。
- 返回:
- spl一个
BSpline
实例 对于 *s=0*,
spl(x) == y
。对于非零的 *s* 值,*spl* 代表 *(x, y)* 的平滑近似,通常结的数量更少。
- spl一个
另请参阅
generate_knots
在内部用于生成结
make_splprep
此例程在参数曲线中的对应方法
make_interp_spline
构建插值样条 (
s = 0
)make_lsq_spline
根据给定的结向量构建最小二乘样条
splrep
此例程在 FITPACK 中的对应方法
说明
此例程构建平滑样条函数 \(g(x)\),以最小化在内部结 (\(x_b < t_i < x_e\)) 处 `k` 阶导数的跳跃之和 \(D_j\),其中
\[D_i = g^{(k)}(t_i + 0) - g^{(k)}(t_i - 0)\]具体而言,此例程构建样条函数 \(g(x)\),使其最小化
\[\sum_i | D_i |^2 \to \mathrm{min}\]条件是
\[\sum_{j=1}^m (w_j \times (g(x_j) - y_j))^2 \leqslant s ,\]其中 \(s > 0\) 是输入参数。
换句话说,我们平衡了平滑度的最大化(以导数跳跃衡量,第一项标准)和 \(g(x_j)\) 与数据 \(y_j\) 的偏差(第二项标准)。
请注意,第二项标准中的求和是针对所有数据点,而第一项标准中的求和是针对内部样条结(即
xb < t[i] < xe
的那些结)。样条结通常是数据的一个子集,详情请参阅generate_knots
。另请注意此例程与
make_lsq_spline
的区别:后者不考虑平滑度,仅解决一个最小二乘问题\[\sum w_j \times (g(x_j) - y_j)^2 \to \mathrm{min}\]对于具有 _固定_ 结向量
t
的样条函数 \(g(x)\)。在版本 1.15.0 中添加。
参考文献
[1]P. Dierckx, “Algorithms for smoothing data with periodic and parametric splines, Computer Graphics and Image Processing”, 20 (1982) 171-184.
[2]P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 1993.