【问题标题】:Force fit a spline on given extrema points在给定的极值点上强制拟合样条
【发布时间】:2020-12-04 03:04:23
【问题描述】:

我有一组点,当用直线连接时,如下所示:

从线性拟合中可以看出,曲线拟合的点是曲线中的极值,即局部最大值和最小值。

我想通过这些点拟合样条曲线或平滑曲线,以使这些点仍然保持局部最大值/最小值。 我使用的是 python,但是任何用任何语言甚至是普通数学来完成上述操作的算法都值得赞赏。


我尝试使用scipy.interpolate 中的InterpolatedUnivariateSpline,2 级和 3 级的结果如下所示:

2 阶曲线接近预期结果,但有什么方法可以强加这些点保持极值的条件?

【问题讨论】:

  • 嗨,沃伦,谢谢!这几乎正​​是我想要的。我很高兴了解这个新功能。虽然,它有一个问题,即为端点生成导数也0,这是我不想要的。 @ev-br 在下面的答案,它也使用相同的 Hermite 方法来解决这个问题。

标签: python numpy scipy curve-fitting


【解决方案1】:

对于显示的这个数据,PchpInterpolator 可能会做。

原因是如果左右的线性斜率具有不同的符号,算法会强制数据点处的斜率为零。

演示:

>>> from scipy.interpolate import pchip
>>> xx = np.arange(9)
>>> yy = np.cos(xx*2*np.pi/8) + 0.4*(-1)**(xx)
>>> pch = pchip(xx, yy)
>>> pch(xx, nu=1)   # derivative at data points

array([-1.68578644,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  1.68578644])

【讨论】:

  • 谢谢@ev-br。这正是我一直在寻找的。与 CubicHermiteSpline 不同,Pchip 方法不考虑端点。
  • 我有几个问题。如果我没记错的话,Pchip 方法适合三次曲线。有什么方法可以拟合二次曲线而不是三次曲线,在斜率上有类似的约束?我的第二个问题是 nu 参数到底是什么?我无法从文档中正确获取它。
  • 另外,您的解决方案缺少xx 变量的声明。如果您可以通过添加它使解决方案更加完整,那就太好了。谢谢!
  • xx的定义中编辑。 nu 是导数(参见 __call__ 方法的文档)。是的,pchip 中的 C 代表立方。分段二次插值:scipy.interpolate 中没有现成的东西。偶数阶样条曲线通常更糟糕,但没有什么能阻止您尝试编写自己的插值器并将其表示为 PPolyBPoly 实例。后者可能更方便,因为您可以通过 BPoly.from_derivatives 构造函数显式提供派生类。
【解决方案2】:

鉴于您的限制,您需要进行函数拟合,而不是曲线拟合。

所以你需要一个带约束的多项式

P(xi) = yi 
P'(xi) = 0

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多