Moja wiedza na temat matematyki jest ograniczona, dlatego prawdopodobnie utknąłem. Mam widma, do których próbuję dopasować dwa szczyty Gaussa. Mogę zmieścić się na największym piku, ale nie mogę zmieścić się na najmniejszym szczycie. Rozumiem, że muszę podsumować funkcję Gaussa dla dwóch szczytów, ale nie wiem, gdzie popełniłem błąd. Obraz mojego prąd wyjściowy jest pokazany:Python: dopasowanie krzywej gaussowskiej w dwóch krzywiznach z nieliniowymi najmniejszymi kwadratami
Niebieska linia to moje dane i zielona linia jest mój obecny dopasowanie. Jest barku na lewo od głównego piku w moim danych, które mam obecnie stara się dopasować, stosując następujący kod:
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()
Byłoby to dość trudne w tym przypadku, ponieważ oba piki są raczej blisko siebie - nie ma określonego piku dla mniejszego "gaussa". Zazwyczaj jeden (jak sądzę) identyfikuje wszystkie szczyty będące przedmiotem zainteresowania, a następnie iteruję nad każdym pikiem maskując wszystkie pozostałe piki i dopasowując do każdego piku. Całkowite dopasowanie jest wtedy sumą wszystkich tych pasowań. To, co musisz zrobić, to zidentyfikować duży pik i jego zasięg, a następnie zamaskować go na podstawie danych przed dopasowaniem do mniejszego szczytu. – Chris