我尝试使用下面的代码(从SciPy帮助页面获取)进行简单的插值,除一个功能外,它产生了很好的结果(我更改x和y变量以读取我的数据)。
from scipy.interpolate import interp1d
x = np.linspace(72, 100, num=29, endpoint=True)
y = df.iloc[:,0].values
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
xnew = np.linspace(0, 10, num=41, endpoint=True)
import matplotlib.pyplot as plt
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()
问题在于,三次函数最适合且最平滑。但是,它为概率曲线的某些部分提供了负值,这显然是不可接受的。有什么方法可以将底线设置为y = 0?我以为也许改用二次方可以解决问题,但事实并非如此。线性拟合可以,但是不能平滑,因此不是很好的匹配。
我也不确定如何执行我想做的第二部分。这可能很简单,但是当我没有频率表时,我不知道如何找到均值,而没有形成函数的内插点网格。如果我知道该函数,则可以将其集成,但是我不确定如何在Python中做到这一点。
编辑以包含一些数据:
这是我的y数据的样子:
array([3.41528917e-08, 7.81041275e-05, 9.60711716e-04, 5.75868934e-05,
6.50260297e-05, 2.95556411e-05, 2.37331370e-05, 9.11990619e-05,
1.08003254e-04, 4.16800419e-05, 6.63673113e-05, 2.57934035e-04,
3.42235937e-03, 5.07534495e-03, 1.76603165e-02, 1.69535370e-01,
2.67624254e-01, 4.29420872e-01, 8.25165926e-02, 2.08367339e-02,
2.01227453e-03, 1.15405995e-04, 5.40163098e-07, 1.66905537e-10,
8.31862858e-18, 4.14093219e-23, 8.32103362e-29, 5.65637769e-34,
7.93547444e-40])