【发布时间】:2012-04-25 23:58:43
【问题描述】:
我的数学知识有限,这就是我可能陷入困境的原因。我有一个试图拟合两个高斯峰的光谱。我可以适应最大的峰,但我不能适应最小的峰。我知道我需要对两个峰的高斯函数求和,但我不知道我哪里出错了。显示了我当前输出的图像:
蓝线是我的数据,绿线是我目前的适合度。我的数据中主峰左侧有一个肩部,我目前正在尝试使用以下代码进行拟合:
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()
【问题讨论】:
-
在这种情况下这将非常困难,因为两个峰值非常接近 - 较小的“高斯”没有明确的峰值。通常(我认为)会识别所有感兴趣的峰,然后遍历每个峰,屏蔽所有其他峰并拟合每个峰。总拟合是所有这些拟合的总和。您需要做的是识别大峰及其范围,然后在拟合到较小的峰之前从数据中屏蔽它
标签: python scipy gaussian least-squares