1
我已经加载了一组数据到Python,并认为我已经适合高斯和洛伦兹形状,但是我需要它打印到每个参数声明和错误相关的值,我不知道如何做到这一点。拟合高斯和洛伦兹到Python中的数据
我是编程新手,所以任何帮助将不胜感激!
这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
import pylab as p
from scipy.optimize import curve_fit, leastsq
import math
from scipy.stats import norm
E,I = np.loadtxt('resonance_data.txt', unpack = True)
# Function to be fitted
def gauss(E, I0, E0, sigma):
n = len(E)
mean = sum(E*I)/sum(I)
sigma = (np.sqrt(sum((E - mean)**2)/sum(I)))
I0 = max(I)
E0 = 31
return I0* np.exp(-((E-E0)/sigma)**2)
sigmaerror = sigma - 28.01177
print sigmaerror
def lorentz(E,I0,E0,gamma):
I0 = max(I)
E0 = 31
return I0*((gamma**2)/(((E-E0)**2)+gamma**2))
# Initialization parameters
init_vals = [45., 31., 33.]
best_vals, covar = curve_fit(gauss,E,I,p0=init_vals)
print best_vals
print curve_fit(gauss, E, I, p0=[max(I), mean, sigma])
print curve_fit(lorentz, E, I, p0=[max(I), mean, sigma])
plt.plot(E,I,'b+:',label='data')
popt,pcov = curve_fit(gauss,E,I,p0=[max(I), mean, sigma])
plt.plot(E,gauss(E,*popt),'r-',label='Gaussian')
popt,pcov = curve_fit(lorentz,E,I,p0=[max(I),mean,sigma])
plt.plot(E,lorentz(E,*popt), 'g', label='Lorentz')
plt.legend()
plt.title('Energy vs Intensity')
plt.xlabel('Energy')
plt.ylabel('Intensity')
plt.show()
print 'sigma =',sigma, 'error =', sigmaerror
print 'E0 = 34.22349966'
print 'I0 = 44.84743332'
最佳参数存储在'best_vals'中。它在[documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)中有很好的解释。 – Cleb