我试图用UnivariateSpline
函数来插值一组点,但是我得到了集合极限内通常的大振荡,你知道解决这个问题的方法吗
我的代码如下所示:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x=pd.read_csv('thrustlaw.txt')
x1=x['Time(sec)']
y1=x['Thrust(N)']
def splines(x1,y1):
from scipy.interpolate import UnivariateSpline
si = UnivariateSpline(x1,y1,s=0, k=3)
xs = np.linspace(0, x1[len(x1)-1], 10000)
ys = si(xs)
plt.plot(x1,y1,'go')
plt.plot(xs, ys)
plt.ylabel("Thrust[N]")
plt.xlabel("Time[sec]")
plt.title("Thrust curve (splines)")
plt.grid()
plt.show()
splines(x1,y1)
结果:
将高次多项式拟合到含噪数据往往可以做到这一点。不存在此问题的插值方法是(唯一)分段三次多项式,对于每对连续点
i, i+1
:x_i, y_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样条曲线,一个cubic Hermite spline的特殊情况。也许this question将帮助您在scipy中实现它,或者找到另一种您喜欢的插值方法
相关问题 更多 >
编程相关推荐