2017-04-19 848 views
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' 
+0

最佳参数存储在'best_vals'中。它在[documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)中有很好的解释。 – Cleb

回答

1

只需打印poptpcov

print(popt) 
print(pcov) 

它们包含在你提供他们到模型中的顺序参数和协方差。