Python 在给定极值点上强制拟合样条曲线

Python 在给定极值点上强制拟合样条曲线,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我有一组点,当用直线连接时,看起来如下所示: 从线性拟合中可以看出,拟合曲线的点是曲线中的极值,即局部极大值和极小值 我希望通过这些点拟合样条曲线或平滑曲线,以便这些点仍然保持局部最大值/最小值。 我使用的是python,但任何用任何语言甚至简单数学实现上述功能的算法都是值得赞赏的 我尝试使用scipy.interpolate中的interpolateUnivariateSpline,阶数2和阶数3的结果如下所示: 2阶曲线接近预期结果,但有没有办法让这些点保持极值?鉴于您的约束,您需要

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

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

我希望通过这些点拟合样条曲线或平滑曲线,以便这些点仍然保持局部最大值/最小值。 我使用的是python,但任何用任何语言甚至简单数学实现上述功能的算法都是值得赞赏的


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


2阶曲线接近预期结果,但有没有办法让这些点保持极值?

鉴于您的约束,您需要函数拟合,而不是曲线拟合

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

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

对于如图所示的数据,PchpInterpolator可能会这样做

原因是,如果向左和向右的线性坡度具有不同的符号,则该算法将在数据点强制零坡度

演示:


嗨,沃伦,谢谢你!这几乎正是我想要的。我很高兴了解这个新功能。尽管如此,它也有一个问题,就是我不想让端点的导数也
0
@ev br下面的答案也使用了相同的Hermite方法。谢谢@ev br。这正是我想要的。Pchip方法只保留端点,不像Cubichermite样条曲线。我有几个问题。如果我没有错的话,Pchip方法适合三次曲线。有没有什么方法可以拟合二次曲线而不是三次曲线,在斜率上有类似的约束条件?我的第二个问题是
nu
参数到底是什么?我还无法从文档中正确获取它。此外,您的解决方案缺少
xx
变量的声明。如果您可以通过添加该选项使解决方案更完整,那就太好了。谢谢在
xx
的定义中编辑
nu
是衍生工具(c.f.
调用方法的文档)。是的,
pchip
中的C表示立方体。分段二次插值:在scipy.interpolate中没有现成的东西。即使顺序样条曲线通常也会更糟糕,但没有什么可以阻止您尝试编写自己的插值器并将其表示为
PPoly
BPoly
实例。后者可能更方便,因为您可以通过
BPoly.from_derivatives
构造函数显式提供导数。
>>> 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])