splrep#
- scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0, per=0, quiet=1)[源代码]#
查找一维曲线的 B 样条表示。
给定一组数据点
(x[i], y[i])
确定区间xb <= x <= xe
上 k 次的平滑样条逼近。- 参数:
- x, yarray_like
定义一条曲线的数据点
y = f(x)
。- warray_like,可选
严格正的秩 1 权重数组,长度与 x 和 y 相同。权重用于估算加权最小二乘样条拟合。如果 y 值的错误具有用矢量
d
给出的标准偏差,则 w 应为1/d
。默认值为ones(len(x))
。- xb, xefloat,可选
拟合的区间。如果为 None,分别默认为
x[0]
和x[-1]
。- kint,可选
样条拟合的次数。建议使用三次样条。应避免 k 的偶数值,尤其是 s 值较小的时候。
1 <= k <= 5
。- task{1, 0, -1},可选
如果
task==0
,对于给定的平滑因子 s 查找t
和c
。如果
task==1
对于给定的平滑因子 s 查找t
和c
。对于同一组数据,必须有task=0
或task=1
的先前调用(t
将被存储并在内部使用)如果
task=-1
对于给定的结点集查找加权最小二乘样条t
。这些应该是内部结点,因为端点结点将会自动添加。- sfloat,可选
平滑度条件。平滑度的程度由满足以下条件来决定:
sum((w * (y - g))**2,axis=0) <= s
,其中g(x)
是(x,y)
的平滑插值。用户可以使用 s 来控制拟合的紧密程度和平滑度之间的权衡。较大的 s 表示更平滑的拟合,较小的 s 表示较少的平滑。s 此时的推荐值为 s 取决于权重 w。如果权重表示 y 标准差的逆,那么一个好的 s 值应在范围(m-sqrt(2*m),m+sqrt(2*m))
中,其中m
是 x、y 和 w 中的数据点数量。默认值:如果提供了权重,s=m-sqrt(2*m)
。如果没有提供权重,则s = 0.0
(插值)。- tarray_like,可选
对于
task=-1
需要的节点。如果给出,则会自动将任务设置为-1
。- full_outputbool,可选
如果非零,则返回可选的输出。
- perbool,可选
如果非零,则数据点被视为周期性,周期为
x[m-1]
-x[0]
,并且会返回一个平滑的周期性样条逼近值。不使用y[m-1]
和w[m-1]
的值。默认值为零,对应于边界条件“非节点”。- quietbool,可选
非零时,会禁止消息输出。
- 返回值:
- tck元组
包含节点向量、B 样条系数和样条度数的元组
(t,c,k)
。- fparray,可选
样条逼近值的加权平方残差之和。
- ierint,可选
一个关于 splrep 成功与否的整数标志。如果
ier<=0
,表示成功。如果ier in [1,2,3]
,则发生错误但并未引发错误。否则,会引发错误。- msgstr,可选
与整数标志对应的消息,ier。
另请参见
备注
有关对样条曲线及其导数的计算,请参见
splev
。使用来自 FITPACK 的 FORTRAN 例程curfit
。用户有责任确保x 的值是唯一的。否则,
splrep
将不会返回明智的结果。如果提供了,结点 t 必须满足 Schoenberg-Whitney 条件,即,必须有数据点子集
x[j]
满足t[j] < x[j] < t[j+k+1]
,对于j=0, 1,...,n-k-2
。This routine zero-pads the coefficients array
c
使其具有与 knots 数组相同的长度t
(尾部的k + 1
系数将被 evaluation routine 忽略,splev
和BSpline
。)这与不进行 zero-pad 的splprep
形成对比。默认边界条件是“not-a-knot”,即曲线末端的第一个和第二个分段是相同的多项式。可以在
CubicSpline
中找到更多边界条件。参考
[1]P. Dierckx,“使用样条函数对实验数据进行平滑、求导和积分的算法”,J.Comp.Appl.Maths 1 (1975) 165-184。
[2]P. Dierckx,“使用样条函数在矩形网格上快速平滑数据的算法”,SIAM J.Numer.Anal. 19 (1982) 1286-1304。
[3]P. Dierckx,“使用样条函数进行曲线拟合的改进算法”,报告 tw54,Dept. Computer Science,K.U. Leuven,1981。
[4]P. Dierckx,“使用样条函数进行曲线和曲面拟合”,数值分析专著,牛津大学出版社,1993。
示例
可以使用 B 样条曲线对一维点进行插值。在 教程中 进一步给出了示例。
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.interpolate import splev, splrep >>> x = np.linspace(0, 10, 10) >>> y = np.sin(x) >>> spl = splrep(x, y) >>> x2 = np.linspace(0, 10, 200) >>> y2 = splev(x2, spl) >>> plt.plot(x, y, 'o', x2, y2) >>> plt.show()