scipy.interpolate.

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 权重数组,长度与 xy 相同。权重用于估算加权最小二乘样条拟合。如果 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 查找 tc

如果 task==1 对于给定的平滑因子 s 查找 tc。对于同一组数据,必须有 task=0task=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)) 中,其中 mxyw 中的数据点数量。默认值:如果提供了权重,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 忽略,splevBSpline。)这与不进行 zero-pad 的 splprep 形成对比。

默认边界条件是“not-a-knot”,即曲线末端的第一个和第二个分段是相同的多项式。可以在 CubicSpline 中找到更多边界条件。

参考

基于 [1], [2], [3][4] 中描述的算法

[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()
../../_images/scipy-interpolate-splrep-1.png