Python: dwuzakresowe dopasowanie gaussowskie z nieliniowymi najmniejszymi kwadratami
Moja wiedza na temat matematyki jest ograniczona, dlatego prawdopodobnie utknąłem. Mam widma, do których próbuję dopasować dwa szczyty Gaussa. Mogę dopasować się do największego piku, ale nie mogę dopasować się do najmniejszego piku. Rozumiem, że muszę zsumować funkcję Gaussa dla dwóch pików, ale nie wiem, gdzie poszedłem źle. Pokazany jest obraz mojego bieżącego wyjścia:
Niebieska linia to moje dane, a zielona linia to moje aktualne dopasowanie. W moich danych znajduje się ramię po lewej stronie głównego szczytu, które obecnie próbuję dopasować, używając następującego kodu:
<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>