2014-04-07 45 views
1

首先,這是一個賦值,我已經設置好了,所以我只在指針後面,而且我限制使用下面的庫,NumPy,SciPy和MatPlotLib。擬合高斯到一組x,y數據

我們已經給出了一個txt文件,其中包括用於共振實驗的x和y數據,並且必須適合高斯和洛倫茲擬合。我現在正在努力研究高斯擬合,並嘗試遵循前一個問題中列出的代碼作爲我自己的代碼的基礎。 (Gaussian fit for Python

from numpy import * 
from matplotlib import * 
import matplotlib.pyplot as plt ##Import Libraries 
import pylab 
from scipy.optimize import curve_fit 

#################################### 

energy,intensity=numpy.loadtxt('resonance_data.txt',unpack=True) 
print energy 
print intensity ##Load in text file and print the arrays 




##################################### 

n = size(energy) 
mean = 30.7 
sigma = 10 
intensity0 = 45 

def gaus(energy,intensity0,energy0,sigma): 
     return intensity0*exp(-(energy-energy0)**2/(sigma**2)) 

popt,pcov = curve_fit(gaus,energy,intensity,p0=[45,mean,sigma]) 



plt.plot(energy,intensity,'o') 
plt.xlabel('Energy/eV') 
plt.ylabel('Intensity') 
plt.title('Plot of Intensity against Energy') ##Plot raw data along with axis labels   and title 
plt.plot(energy,gaus(energy,*popt)) 
plt.show() 

如果我把表達式均值和西格瑪,爲在URL中張貼的曲線是一條水平線,它返回下面的圖

enter image description here

,所以我米猜測問題在於曲線擬合不收斂或什麼。

我是初學者有點的,所以任何指針是有益的:)

感謝

更新:我已經成功地提高了高斯擬合,並得到了洛倫茲的工作,甚至是(我認爲)管理計算每種情況下殘差的總和。

乾杯傢伙!

再次感謝你們

+1

不知怎的,你鏈接的禮物的PIC本身作爲一個體面的適合.... –

+0

一般的形狀是接近我所期望的,但高峯的高度是相當遙遠的。我知道它的'漂亮的傾斜,所以它不會完美適合,這是作業的重點,但我仍然期望更好? – user3507401

+0

你應該是適合一個或一個二維高斯分佈? – Paul

回答

0

看起來像你的數據大部分來自左邊,爲什麼高斯?不是波爾茲曼,對數正態或其他什麼?

其中大部分已在scipy.stats中實施。請參閱scipy.stats.cauchy for lorentzian和scipy.stats.normal gaussian。舉個例子:

import scipy.stats as ss 
A=ss.norm.rvs(0, 5, size=(100)) #Generate a random variable of 100 elements, with expected mean=0, std=5 
ss.norm.fit_loc_scale(A) #fit both the mean and std 
(-0.13053732553697531, 5.163322485150271) #your number will vary. 

而且我覺得你不需要intensity0參數,它只是將是1/sigma/srqt(2*pi),因爲密度函數具有總結爲1

+0

感謝您的回覆,我們被告知要繪製高斯和洛倫茲,然後進行統計測試以顯示哪一個是最好的,所以這就是選擇的原因。 我會看看scipy函數 乾杯。 – user3507401

+0

@ user3507401你可以[看看這裏的例子](http://stackoverflow.com/a/16651955/832621),看看如何使用SciPy測試許多不同的發行版。 –