make_splrep#
- scipy.interpolate.make_splrep(x, y, *, w=None, xb=None, xe=None, k=3, s=0, t=None, nest=None)[源代码]#
查找一维函数的 B 样条表示。
给定数据集
(x[i], y[i])
,确定区间xb <= x <= xe
上的 k 次光滑样条近似。- 参数:
- x, y类数组,形状 (m,)
定义曲线
y = f(x)
的数据点。- w类数组,形状 (m,),可选
严格正的一维权重数组,长度与 x 和 y 相同。这些权重用于计算加权最小二乘样条拟合。如果 y 值的误差的标准差由向量
d
给出,则 w 应为1/d
。默认值为np.ones(m)
。- xb, xe浮点数,可选
拟合的区间。如果为 None,则这些默认分别为
x[0]
和x[-1]
。- k整数,可选
样条拟合的次数。建议使用三次样条,
k=3
,这是默认值。应避免使用 k 的偶数值,尤其是当 s 值较小时。- s浮点数,可选
平滑条件。平滑量由满足以下条件确定
sum((w * (g(x) - y))**2 ) <= s
其中
g(x)
是(x, y)
的平滑拟合。用户可以使用 s 来控制数据接近度和拟合平滑度之间的权衡。较大的 s 表示更多的平滑,而较小的 s 值表示更少的平滑。建议的 s 值取决于权重 w。如果权重表示 y 的标准差的倒数,则应在范围(m-sqrt(2*m), m+sqrt(2*m))
中找到一个好的 s 值,其中m
是 x、y 和 w 中的数据点数。默认值为s = 0.0
,即插值。- t类数组,可选
样条节点。如果为 None(默认值),则会自动构造节点。必须至少有
2*k + 2
个节点,最多有m + k + 1
个节点。- nest整数,可选
目标节点向量长度。应该在
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.