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 样条表示。

旧版

此函数被认为是旧版,将不再接收更新。 虽然我们目前没有计划删除它,但我们建议新代码使用更现代的替代方案。 具体来说,我们建议在新代码中使用 make_splrep

给定数据集 (x[i], y[i]),确定区间 xb <= x <= xe 上 k 次的平滑样条近似。

参数:
x, y类数组

定义曲线 y = f(x) 的数据点。

w类数组,可选

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

xb, xe浮点数,可选

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

k整数,可选

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

task{1, 0, -1},可选

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

如果 task==1,则为平滑因子 s 的另一个值查找 tc。必须先前已使用 task=0task=1 对同一数据集进行调用(t 将被存储并在内部使用)

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

s浮点数,可选

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

t类数组,可选

对于 task=-1 所需的节点。如果给定,则任务会自动设置为 -1

full_output布尔值,可选

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

per布尔值,可选

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

quiet布尔值,可选

非零值可抑制消息。

返回:
tck元组

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

fp数组,可选

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

ier整数,可选

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

msg字符串,可选

与整数标志 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 的长度相同(尾部的 k + 1 个系数会被求值例程 splevBSpline 忽略)。这与 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, “一种使用样条函数拟合曲线的改进算法”, report 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