【问题标题】:How to interpret the result of scipy.interpolate.splrep?如何解释 scipy.interpolate.splrep 的结果?
【发布时间】:2019-02-07 13:31:13
【问题描述】:

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

我认为 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 个样条曲线:一个从 0 到 2,一个从 2 到 6,一个从 6 到 10。这些样条曲线的方程是什么然后?为什么我只有 6 个系数?我不应该有 12 (3*4) 吗?

注意:我知道有诸如 splev 之类的函数来评估结果——我不需要。我只需要样条的参数。

【问题讨论】:

  • 可能有助于查看scipy.interpolate.BSpline
  • 我之前检查过,但是在构造 BSpline 对象后,我只能访问问题中指定的相同数组。
  • 确切的定义在 BSpline 的文档中给出
  • 我有一个小问题,我们可以在 splrep 中为同一个 x 传递多个 Y 值进行插值吗?

标签: python scipy spline


【解决方案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 顺序所需的节点和控制点的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 2017-05-02
    • 2017-04-25
    • 1970-01-01
    • 2018-06-14
    • 2021-08-12
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多