scipy.interpolate.

splprep#

scipy.interpolate.splprep(x, w=None, u=None, ub=None, ue=None, k=3, task=0, s=None, t=None, full_output=0, nest=None, per=0, quiet=1)[source]#

寻找N维曲线的B样条表示。

旧版

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

给定N个秩为1的数组列表 x,它们表示由 u 参数化的N维空间中的曲线,本函数用于寻找一个平滑的近似样条曲线 g(u)。它使用FITPACK中的FORTRAN例程 parcur。

参数:
x类数组

表示曲线的样本向量数组列表。

w类数组, 可选

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

u类数组, 可选

参数值数组。如果未给出,这些值将自动计算为 M = len(x[0]),其中:

v[0] = 0

v[i] = v[i-1] + distance(x[i], x[i-1])

u[i] = v[i] / v[M-1]

ub, ue整型, 可选

参数区间的端点。默认为 u[0] 和 u[-1]。

k整型, 可选

样条的次数。推荐使用三次样条。应避免使用偶数 k 值,尤其是在 s 值较小的情况下。1 <= k <= 5,默认值为 3。

task整型, 可选

如果 task==0 (默认值),则根据给定的平滑因子 s 查找 t 和 c。如果 task==1,则根据平滑因子 s 的另一个值查找 t 和 c。对于相同的数据集,之前必须调用过 task=0 或 task=1。如果 task=-1,则根据给定的一组节点 t 查找加权最小二乘样条。

s浮点型, 可选

平滑条件。平滑度通过满足条件 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)) 范围内,其中 m 是 x、y 和 w 中的数据点数量。

t数组, 可选

task=-1 所需的节点。至少需要 2*k+2 个节点。

full_output整型, 可选

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

nest整型, 可选

对样条总节点数的过高估计,有助于确定存储空间。默认 nest=m/2。nest=m+k+1 总是足够大。

per整型, 可选

如果非零,数据点将被视为周期性的,周期为 x[m-1] - x[0],并返回一个平滑的周期样条近似。不使用 y[m-1]w[m-1] 的值。

quiet整型, 可选

非零以抑制消息。

返回:
tck元组

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

u数组

参数值的数组。

fp浮点型

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

ier整型

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

msg字符串

与整数标志 ier 对应的消息。

备注

关于样条及其导数的评估,请参阅 splev。维度 N 的数量必须小于 11。

数组 c 中系数的数量比节点数量 len(t)k+1。这与 splrep 不同,splrep 会对系数数组进行零填充,使其与节点数组长度相同。这些额外的系数会被评估例程 splevBSpline 忽略。

参考文献

[1]

P. Dierckx, “使用周期样条和参数样条平滑数据的算法,计算机图形学与图像处理”, 20 (1982) 171-184。

[2]

P. Dierckx, “使用周期样条和参数样条平滑数据的算法”, 报告 tw55, 计算机科学系, 鲁汶大学, 1981。

[3]

P. Dierckx, “样条曲线和曲面拟合”, 数值分析专著, 牛津大学出版社, 1993。

示例

在极坐标系中生成一个蜗牛曲线的离散化

>>> import numpy as np
>>> phi = np.linspace(0, 2.*np.pi, 40)
>>> r = 0.5 + np.cos(phi)         # polar coords
>>> x, y = r * np.cos(phi), r * np.sin(phi)    # convert to cartesian

并进行插值

>>> from scipy.interpolate import splprep, splev
>>> tck, u = splprep([x, y], s=0)
>>> new_points = splev(u, tck)

请注意 (i) 我们通过使用 s=0 强制进行插值,(ii) 参数化 u 是自动生成的。现在绘制结果

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.plot(x, y, 'ro')
>>> ax.plot(new_points[0], new_points[1], 'r-')
>>> plt.show()
../../_images/scipy-interpolate-splprep-1.png