J'ai un petit pic de spectre et j'essaie de lui associer une fonction gaussienne. J'ai cherché un exemple en ligne et mélangé le code avec celui que j'ai fait.Ajuster un pic gaussien à mesuré
wveleng=[ 639.188 639.454 639.719 639.985 640.25 640.516 640.781 641.046
641.312 641.577]
counts=[ 778. 1613.8 12977.4 32990. 33165.2 13171. 2067.2 900.8
788.8 747.8]
mon premier code est le suivant
def gaus(x,a,mu,sigma):
return a*exp(-(x-mu)**2/(2*sigma**2))
a=ydata.max()
x0=ydata.mean()
sigm=ydata.std()
mean = sum(ydata*xdata)/len(ydata)
sigma = np.sqrt(sum(ydata*(xdata-mean)**2)/len(ydata))
#print(ydata.max())
popt, pcov = curve_fit(Gauss, xdata,ydata,maxfev=991,p0=[a,x0,sigm])
#gmodel = Model(Gauss)
#result = gmodel.fit(ydata, x=xdata, a=ydata.max(),x0=ydata.mean(),sigm=ydata.std())
print(popt)
#plt.scatter(xdata,ydata,label='data points')
#plt.plot(xdata, result.best_fit, 'r-')
#popt, pcov = curve_fit(gauss, xdata, ydata,p0=[ydata.max(), ydata.mean(), ydata.std()])
xx = np.linspace(639,642, 10)
plt.plot(xx, gauss(xdata, *popt), 'r-', label='fit')
avec terrain i obtenir ce qui suit.
je pense qu'il a à faire avec des paramètres estimation initiale
un second code que je trouve plus compact et convient mieux pour moi.
def gauss(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2/(2 * sigma ** 2))
ydata = np.array([778.,1613.8,12977.4,32990.,33165.2,13171.,2067.2,900.8,788.8,747.8])
xx = np.arange(639,642, 100)
xdata=np.array([639.188,639.454,639.719,639.985,640.250,640.516,640.781,641.046,641.312,641.577])
#plt.plot(xdata, ydata, 'bo', label='data')
def Gauss(x, a, x0, sigm):
return a * np.exp(-(x - x0)**2/(2 * sigm**2))
gmodel = Model(Gauss)
result = gmodel.fit(ydata, x=xdata, a=ydata.max(),x0=ydata.mean(),sigm=ydata.std())
plt.scatter(xdata,ydata,label='data points')
plt.plot(xdata, result.best_fit, 'r-')
Je reçois exactement la même forme que la première méthode. Y a-t-il un moyen d'ajuster plus de points que les données elles-mêmes?
Vous devez inclure le message d'erreur FULL afin que nous puissions voir quelle fonction déclenche l'erreur. Cette erreur signifie que l'une des fonctions attendait un argument 'iterable' (comme une liste ou un tableau numpy) et qu'elle a reçu un seul numéro' float' à la place. – Eskapp
Je ne sais pas ce que vous pourriez faire de mal. Cela semble être une façon longue d'y arriver. Vous pouvez regarder https://stackoverflow.com/a/42029398/131187. –
@BillBell thnx pour le conseil que j'ai regardé l'autre question .. qui aidera un butin – kevin