在给定的极值点上强制拟合样条
Force fit a spline on given extrema points
我有一组点,用直线连接时如下图所示:
从线性拟合中可以看出,曲线拟合的点是曲线中的极值,即局部最大值和最小值。
我想通过这些点拟合样条曲线或平滑曲线,使这些点仍然保持局部 maxima/minima。
我使用的是 python,但任何算法都可以用任何语言甚至简单的数学来完成上述操作。
我尝试使用 scipy.interpolate
中的 InterpolatedUnivariateSpline
,2 级和 3 级的结果如下所示:
2 阶曲线接近预期结果,但有没有办法可以强加这些点保持极值的条件?
鉴于您的限制,您将需要函数拟合,而不是曲线拟合。
所以你需要一个有约束的多项式
P(xi) = yi
P'(xi) = 0
对于所示的数据,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])
我有一组点,用直线连接时如下图所示:
从线性拟合中可以看出,曲线拟合的点是曲线中的极值,即局部最大值和最小值。
我想通过这些点拟合样条曲线或平滑曲线,使这些点仍然保持局部 maxima/minima。 我使用的是 python,但任何算法都可以用任何语言甚至简单的数学来完成上述操作。
我尝试使用 scipy.interpolate
中的 InterpolatedUnivariateSpline
,2 级和 3 级的结果如下所示:
2 阶曲线接近预期结果,但有没有办法可以强加这些点保持极值的条件?
鉴于您的限制,您将需要函数拟合,而不是曲线拟合。
所以你需要一个有约束的多项式
P(xi) = yi
P'(xi) = 0
对于所示的数据,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])