【问题标题】:Cannot reconstruct scipy's spline无法重建 scipy 的样条曲线
【发布时间】:2021-09-01 10:09:24
【问题描述】:

我正在构建一个脊椎,它可以很好地插入我拥有的一些数据,并且我想将其存储在数据库中。我认为这很简单,因为我可以只取结和系数,然后用它们创建一个新的样条线。然而,这大错特错。这是一个最小(非)工作示例。

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

xs = np.linspace(0,2,101)
ys = xs*np.cos(2*np.pi*xs)

knotNumber = 9
knots = np.linspace(0,2,knotNumber)[1:-1]
spline = interpolate.LSQUnivariateSpline(xs,ys,knots,k=3)
re_spline = interpolate.BSpline(spline.get_knots(),spline.get_coeffs(),3)

sp_ys = spline(xs)
re_ys = re_spline(xs)

plt.plot(xs, ys, '-', color='black');
plt.plot(xs, sp_ys, '-', color='blue');
plt.plot(xs, re_ys, '-', color='red');

结果如下图:

如您所见,LSQUnivariateSpline 蓝色曲线完全覆盖了黑色。来自我创建的样条曲线的红色曲线似乎完全不相关。

我在这里有什么明显的遗漏吗?如何重建样条曲线?

【问题讨论】:

    标签: python scipy bspline


    【解决方案1】:

    BSpline 需要k 在开始和结束处额外结点(固定点);不同于 (LSQ)`UnivariateSpline。

    我是通过查看结果发现的

    interpolate.splrep(xs, ys, k=3, task=-1, t=knots)
    

    在输出结的开头显示 3 个额外的零,在结尾显示额外的 3 个 2:

    [0. 0. 0. 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. 2. 2. 2. ].

    (额外端点的数量显然取决于程度。)

    鉴于此,以下应该可以工作:

    xs = np.linspace(0,2,101)
    ys = xs*np.cos(2*np.pi*xs)
    
    k = 3
    knotNumber = 9
    knots = np.linspace(0,2,knotNumber)
    spline = interpolate.LSQUnivariateSpline(xs, ys, knots[1:-1], k=k)
    bknots = np.array(k * [knots[0]] + spline.get_knots().tolist() + k * [knots[-1]])
    re_spline = interpolate.BSpline(bknots, spline.get_coeffs(), k)
    
    sp_ys = spline(xs)
    re_ys = re_spline(xs)
    

    (或者使用任何其他更漂亮的方式将额外的结添加到spline.get_knots()。)

    【讨论】:

    • 谢谢,您指出了使用interpolate.splrep 的明显解决方案。顺便说一句,您的解决方案不起作用,因为现在系数与提供的点不匹配。如果您将答案编辑为仅使用 interpolate.splrep,我会很乐意接受。
    • 是的,你是对的。我想我在复制时做了一些愚蠢的事情。当我复制它的所有工作时。 :)
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多