Python: ajuste gaussiano de dos curvas con mínimos cuadrados no lineales
Mi conocimiento de las matemáticas es limitado, por lo que probablemente estoy atascado. Tengo un espectro en el que estoy tratando de ajustar dos picos gaussianos. Puedo ajustarme al pico más grande, pero no puedo ajustar al pico más alto. Entiendo que necesito sumar la función gaussiana para los dos picos, pero no sé dónde me he equivocado. Se muestra una imagen de mi salida actual:
La línea azul es mi información y la línea verde es mi ajuste actual. Hay un hombro a la izquierda del pico principal en mis datos que actualmente estoy tratando de ajustar, usando el siguiente código:
<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>