Python: двухкривая гауссова аппроксимация с нелинейными наименьшими квадратами
Мои знания по математике ограничены, поэтому я, вероятно, застрял. У меня есть спектры, к которым я пытаюсь подобрать два пика Гаусса. Я могу соответствовать самой большой вершине, но я не могу соответствовать самой маленькой вершине. Я понимаю, что мне нужно сложить гауссову функцию для двух пиков, но я не знаю, где я ошибся. Изображение моего текущего вывода показано:
Синяя линия - мои данные, а зеленая линия - мое текущее соответствие. В моих данных есть плечо слева от основного пика, который я сейчас пытаюсь подогнать, используя следующий код:
<code>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() </code>