Python 减少样条插值中的振荡

Python 减少样条插值中的振荡,python,scipy,interpolation,Python,Scipy,Interpolation,我试着用单变量样条函数插值一组点,但是我得到了集合极限内通常的大振荡,你知道解决这个问题的方法吗 我的代码如下所示: 导入matplotlib.pyplot作为plt 将numpy作为np导入 作为pd进口熊猫 x=pd.read\u csv('structlaw.txt') x1=x[‘时间(秒)’] y1=x[‘推力(N)’] def花键(x1,y1): 从scipy.interpolate导入单变量样条线 si=单变量样条线(x1,y1,s=0,k=3) xs=np.linspace(0,

我试着用
单变量样条函数插值一组点,但是我得到了集合极限内通常的大振荡,你知道解决这个问题的方法吗

我的代码如下所示:

导入matplotlib.pyplot作为plt
将numpy作为np导入
作为pd进口熊猫
x=pd.read\u csv('structlaw.txt')
x1=x[‘时间(秒)’]
y1=x[‘推力(N)’]
def花键(x1,y1):
从scipy.interpolate导入单变量样条线
si=单变量样条线(x1,y1,s=0,k=3)
xs=np.linspace(0,x1[len(x1)-1],10000)
ys=si(xs)
plt.绘图(x1,y1,'go')
plt.绘图(xs,ys)
plt.ylabel(“推力[N]”)
plt.xlabel(“时间[秒]”)
plt.标题(“推力曲线(样条曲线)”)
plt.grid()
plt.show()
花键(x1,y1)
结果:


将高次多项式拟合到含噪数据往往可以做到这一点。不存在此问题的插值方法是(唯一)分段三次多项式,对于每对连续点
i,i+1

  • 通过
    x\u i,y\u i
  • 通过
    x{i+1},y{i+1}
  • x_i
    ,具有斜率
    (y_{i+1}-y_{i-1})/(x_{i+1}-x_{i-1})
  • x{i+1}
    ,具有斜率
    (y{i+2}-y{i)/(x{i+2}-x{i)
因此,每个点处的切线与从上一点到下一点的直线段平行。这迫使导数与原始数据“有些相似”,因此它不会剧烈振荡


如果我没弄错的话,这是一个Catmull-Rom样条曲线,一个特殊的例子。可能会帮助您在scipy中实现它,或者找到另一种您喜欢的插值方法。

您可以提供
strustralaw.txt
文件以便于实验吗?(+1)是的,可以DIY CR插值器或使用已经实现的PCHIP或Akima方案。后者保证C1平滑,这可能相关,也可能无关,取决于曲线的用途。由于scipy.interpolare提供了tge CubicHermiteSpline类,所以实现所有这些都很容易