Python: Zwei-Kurven-Gauß-Anpassung mit nichtlinearen kleinsten Quadraten
Meine mathematischen Kenntnisse sind begrenzt, weshalb ich wahrscheinlich nicht weiterkomme. Ich habe ein Spektrum, zu dem ich versuche, zwei Gaußsche Spitzen zu passen. Ich kann zum größten Peak passen, aber ich kann nicht zum kleinsten Peak passen. Ich verstehe, dass ich die Gaußsche Funktion für die beiden Peaks summieren muss, aber ich weiß nicht, wo ich einen Fehler gemacht habe. Ein Bild meiner aktuellen Ausgabe wird angezeigt:
Die blaue Linie ist meine Daten und die grüne Linie ist meine aktuelle Anpassung. In meinen Daten befindet sich links vom Hauptpeak eine Schulter, die ich derzeit mit dem folgenden Code zuzuordnen versuche:
<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>