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 样条表示。
给定 N 个秩为 1 的数组的列表,x,表示由 u 参数化的 N 维空间中的曲线,找到一个平滑的近似样条曲线 g(u)。使用 FITPACK 中的 FORTRAN 例程 parcur。
- 参数:
- x类数组
表示曲线的样本向量数组列表。
- w类数组,可选
与 x[0] 长度相同的严格正秩 1 权重数组。权重用于计算加权最小二乘样条拟合。如果 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, ueint,可选
参数区间的端点。默认为 u[0] 和 u[-1]。
- kint,可选
样条的次数。推荐使用三次样条。应避免偶数 k 值,尤其是在 s 值较小的情况下。
1 <= k <= 5
,默认为 3。- taskint,可选
如果 task==0(默认),则针对给定的平滑因子 s 找到 t 和 c。如果 task==1,则针对平滑因子的另一个值 s 找到 t 和 c。对于同一组数据,必须先进行 task=0 或 task=1 的调用。如果 task=-1 则针对给定的结点集 t 找到加权最小二乘样条。
- sfloat,可选
平滑条件。通过满足以下条件来确定平滑程度:
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 值,其中 m 是 x、y 和 w 中的数据点数量。- t数组,可选
用于
task=-1
的结点。必须至少有2*k+2
个结点。- full_outputint,可选
如果非零,则返回可选输出。
- nestint,可选
样条总结点数的估计值,以帮助确定存储空间。默认情况下 nest=m/2。始终足够大的是 nest=m+k+1。
- perint,可选
如果非零,则数据点被认为是周期性的,周期为
x[m-1] - x[0]
,并返回一个平滑的周期样条近似值。不使用y[m-1]
和w[m-1]
的值。- quietint,可选
非零表示抑制消息。
- 返回:
- tck元组
一个元组,
(t,c,k)
,包含结点向量、B 样条系数和样条的次数。- u数组
参数值的数组。
- fpfloat
样条近似的加权平方残差之和。
- ierint
关于 splrep 成功与否的整数标志。如果 ier<=0,则表示成功。如果 ier 在 [1,2,3] 中,则发生了错误,但未引发异常。否则会引发错误。
- msgstr
与整数标志 ier 相对应的消息。
另请参阅
注释
有关样条及其导数的评估,请参阅
splev
。维度数 N 必须小于 11。c 数组中的系数数量比结点数
len(t)
少k+1
。这与splrep
形成对比,splrep
使用零填充系数数组以使其与结点数组具有相同的长度。这些额外的系数被评估例程splev
和BSpline
忽略。参考文献
[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()