如何解释scipy.interpolate.splrep的结果?

时间:2019-02-07 13:31:13

标签: python scipy spline

我需要在x-y平面中定义的1D线上拟合由三阶多项式组成的样条曲线。多项式的导数在关节处必须相等。预期的输出是一个三阶多项式列表,由它们的起点(样条结)及其多项式系数定义。

我认为scipy的splrep函数将是理想的选择。但是我很难理解该功能的结果。例如,以下代码将产生以下结果:

x = np.linspace(0, 10, 100)
y = np.sin(x)
sp1 = scipy.interpolate.splrep(x, y, k = 3, t = [2, 6])

结果(来自sp1的“结”和“系数”数组):

knots: [ 0.,  0.,  0.,  0.,  2.,  6., 10., 10., 10., 10.]
coefficients: [-0.32946251,  1.55647594,  0.19883333, -2.08984459,  2.79531098,
   -1.14372454,  0.        ,  0.        ,  0.        ,  0.        ]

从文档和我的数学理解上,我希望基础代码适合于这些点上的3条样条线:1条从0到2,1条从2到6,以及1条从6到10。这些样条线的方程是什么?然后?为什么我只有6个系数?我不应该有12(3 * 4)吗?

注意:我知道有诸如splev之类的函数可以评估结果-我不需要。我只需要样条曲线的参数。

1 个答案:

答案 0 :(得分:1)

这有点难以理解。

  

注释

     

请参见splev,以评估样条及其衍生物。维数N必须小于11。   c数组中的系数比k+1少{   结len(t)。这与splrep(零填充)形成对比   系数数组的长度与的数组的长度相同   结。这些附加系数被评估忽略   例程splevBSpline

由于这些样条插值函数集围绕FITPACK的子例程splev,因此您必须查看系数的含义。在子例程的文档中:

c    t    : array,length n, which contains the position of the knots.
c    n    : integer, giving the total number of knots of s(x).
c    c    : array,length n, which contains the b-spline coefficients.

将完整的圆圈返回到scipy。它阐明了BSpline formula,同时还指出了它如何使用系数以及它们的预期长度是多少。

为确保输入正确,将其与BSplines的数学定义相关联以识别给定BSpline顺序所需的打结和控制点始终很重要。