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) 的数据点。

w类似数组, 可选

严格正的秩-1权重数组,长度与 xy 相同。这些权重用于计算加权最小二乘样条拟合。如果 y 值的误差的标准差由向量 d 给出,则 w 应为 1/d。默认是 ones(len(x))

xb, xefloat, 可选

拟合的区间。如果为 None,则分别默认为 x[0]x[-1]

kint, 可选

样条拟合的程度。建议使用三次样条。应避免使用偶数值的 k,尤其是在 s 值较小时。1 <= k <= 5

任务{1, 0, -1}, 可选

如果 task==0,则为给定的平滑因子 s 找到 tc

如果 task==1 ,找到平滑因子 s 的另一个值对应的 tc 。必须先前对同一组数据调用过 task=0task=1t 将被存储并在内部使用)

如果 task=-1 ,则为给定的一组节点 t 找到加权最小二乘样条。这些应为内部节点,因为末端的节点将自动添加。

sfloat, 可选

一个平滑条件。平滑的程度由满足以下条件决定:sum((w * (y - g))**2,axis=0) <= s 其中 g(x)(x,y) 的平滑插值。用户可以使用 s 来控制拟合的接近度和平滑度之间的权衡。较大的 s 意味着更多的平滑,而较小的 s 值表示较少的平滑。推荐的 s 值取决于权重 w。如果权重代表 y 的标准差的倒数,那么一个好的 s 值应该在范围 (m-sqrt(2*m),m+sqrt(2*m)) 内找到,其中 mxyw 中的数据点数。默认值:如果提供了权重,则 s=m-sqrt(2*m)。如果没有提供权重,则 ``s = 0.0``(插值)。

t类似数组, 可选

task=-1 所需的结点。如果给出,则任务自动设置为 -1

完整输出bool, 可选

如果非零,则返回可选输出。

bool, 可选

如果非零,数据点被认为是周期性的,周期为 x[m-1] - x[0] ,并返回一个平滑的周期性样条近似。y[m-1]w[m-1] 的值不被使用。默认值为零,对应于边界条件 ‘not-a-knot’。

安静bool, 可选

非零值以抑制消息。

返回:
tck元组

一个包含节点向量、B样条系数和样条次数的元组 (t,c,k)

fp数组,可选

样条逼近的残差平方的加权和。

ierint, 可选

关于 splrep 成功与否的整数标志。如果 ier<=0,则表示成功。如果 ier [1,2,3] 中,则发生了错误但未引发。否则会引发错误。

消息str, 可选

与整数标志 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

此例程将系数数组 c 用零填充,使其与节点数组 t 具有相同的长度(评估例程 splevBSpline 会忽略末尾的 k + 1 个系数。)这与 splprep 不同,后者不会对系数进行零填充。

默认的边界条件是 ‘not-a-knot’,即曲线的第一段和第二段在末端是相同的多项式。CubicSpline 中提供了更多的边界条件。

参考文献

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

[1]

P. Dierckx, “An algorithm for smoothing, differentiation and integration of experimental data using spline functions”, J.Comp.Appl.Maths 1 (1975) 165-184.

[2]

P. Dierckx, “A fast algorithm for smoothing data on a rectangular grid while using spline functions”, SIAM J.Numer.Anal. 19 (1982) 1286-1304.

[3]

P. Dierckx, “An improved algorithm for curve fitting with spline functions”, report tw54, Dept. Computer Science,K.U. Leuven, 1981.

[4]

P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 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