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>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage