多峰氢脱附数据拟合优化:如何提升第三峰Lognormal拟合效果?
氢脱附峰拟合优化问题
我有一组氢脱附随温度变化的数据,包含4个峰:
我希望为每个峰拟合分布曲线以提取峰下面积等信息,其中第1、2、4峰适合用Gaussian拟合,拟合效果如下:
现有拟合代码
我使用以下两段代码分别获取初始参数和定义最终参数:
拟合过程(获取初始参数)
# Fitting procedure def fitting_procedure(xdata, ydata): # fitting function def func(xdata, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4): # return a1 * np.exp(-0.5*(((xdata-b1)**2)/(c1**2)))+ \ a2 * np.exp(-0.5*(((xdata-b2)**2)/(c2**2)))+ \ a3 * np.exp(-0.5*(((xdata-b3)**2)/(c3**2)))+ \ a4 * np.exp(-0.5*(((xdata-b4)**2)/(c4**2))) # p0 = [0.002, 505, 1, 0.002, 780, 1, 0.002, 725, 1, 0.002, 975, 1] # for file 01 # p0 = [0.002, 510, 1, 0.002, 650, 1, 0.002, 740, 1, 0.002, 840, 1] p0 = [0.002, 570, 1, 0.002, 668, 1, 0.002, 800, 1, 0.002, 820, 1] bounds = ((0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.), (np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf,np.inf)) cons, pcov = curve_fit(func, xdata, ydata, p0, bounds=bounds, maxfev=1000000) return (cons)
最终参数定义
def gas(y0,A,w,xc): return y0 + (A/(w*math.sqrt(math.pi/2)))*np.exp(-2*((x-xc)/w)**2)
第3峰拟合困境
我认为第3峰更适合用Lognormal拟合,但始终无法得到理想的拟合结果,相关代码如下:
model = models.LognormalModel() params = model.make_params(center=20, sigma=3, amplitude=5) result = model.fit(y14-0.003, params, x=x14) # print(result.fit_report()) plt.plot(x14, y14-0.003, label='3rd peak') plt.plot(x14, result.best_fit, label='fit') # plt.plot(x14_fit, y14_fit, label='fit2') plt.xlabel('Temperature, K', fontsize=12) plt.ylabel('HDR, at.ppm/s', fontsize=12) plt.legend() plt.show()
当前第3峰的Lognormal拟合效果:
整体拟合效果:
请问如何改进拟合效果,尤其是第3峰的Lognormal拟合?
内容的提问来源于stack exchange,提问作者Maria Inês
相关产品推荐
相关产品推荐

