我的數學知識是有限的,這就是爲什麼我可能卡住了。我有一個譜圖,我試圖擬合兩個高斯峯。我可以適應最大的高峯,但我無法適應最小的高峯。我知道我需要爲兩個峯值求和高斯函數,但我不知道我出錯的地方。我的電流輸出的圖像顯示:Python:使用非線性最小二乘法的雙曲線高斯擬合
藍線是我的數據和綠線是我目前的契合。有個肩膀可以在我的數據主峯左側我目前努力配合,使用下面的代碼:
import matplotlib.pyplot as pt
import numpy as np
from scipy.optimize import leastsq
from pylab import *
time = []
counts = []
for i in open('/some/folder/to/file.txt', 'r'):
segs = i.split()
time.append(float(segs[0]))
counts.append(segs[1])
time_array = arange(len(time), dtype=float)
counts_array = arange(len(counts))
time_array[0:] = time
counts_array[0:] = counts
def model(time_array0, coeffs0):
a = coeffs0[0] + coeffs0[1] * np.exp(- ((time_array0-coeffs0[2])/coeffs0[3])**2)
b = coeffs0[4] + coeffs0[5] * np.exp(- ((time_array0-coeffs0[6])/coeffs0[7])**2)
c = a+b
return c
def residuals(coeffs, counts_array, time_array):
return counts_array - model(time_array, coeffs)
# 0 = baseline, 1 = amplitude, 2 = centre, 3 = width
peak1 = np.array([0,6337,16.2,4.47,0,2300,13.5,2], dtype=float)
#peak2 = np.array([0,2300,13.5,2], dtype=float)
x, flag = leastsq(residuals, peak1, args=(counts_array, time_array))
#z, flag = leastsq(residuals, peak2, args=(counts_array, time_array))
plt.plot(time_array, counts_array)
plt.plot(time_array, model(time_array, x), color = 'g')
#plt.plot(time_array, model(time_array, z), color = 'r')
plt.show()
在這種情況下,這將非常困難,因爲兩個峯值相互靠得很近 - 對於較小的「高斯」,沒有確定的峯值。通常可以(我認爲)識別所有感興趣的峯,然後遍歷每個峯,掩蓋所有其他峯,並擬合到每個峯。總的擬合是所有這些擬合的總和。看起來你需要做的是確定大峯和它的範圍,然後在擬合到較小峯之前從數據中掩蓋這一點 – Chris 2012-04-13 15:50:43