这是我的data。
我正在尝试使用scipy和曲线拟合来拟合我的数据,这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
import pandas as pd
df=pd.read_csv("dene2.dat", sep=" ")
x=df.x
y=df.y
n = len(x)
mean = sum(x * y) / sum(y)
sigma = np.sqrt(sum(y * (x - mean)**2) / sum(y))
def gaus(x,a,x0,sigma):
return a*exp(-(x-x0)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit for Time Constant')
plt.xlabel('Time (s)')
plt.ylabel('Intensity (Counts)')
plt.show()
拟合高斯图也不如预期;你能帮我吗?
答案 0 :(得分:0)
您可以使用两个高斯的叠加来获得更好的拟合度。
def gaus(x,a,x0,sigma, b, x1, sigma1):
return a*exp(-(x-x0)**2/(2*sigma**2)) + b*exp(-(x-x1)**2/(2*sigma1**2))
popt,pcov = curve_fit(gaus,x,y,p0=[1.6, 380, 10, 1.5, 690, 10])
1.6, 380, 10, 1.5, 690, 10
是数据中第一个和第二个清晰峰的高度,均值和宽度的近似初始猜测。
您可以尝试使用三个高斯来获得更好的拟合度。 Here是一篇类似的帖子。