Подход Гаусса к данным гистограммы в python: Trust Region v / s Levenberg Marquardt

Мой график гистограммы четко показывает два пика. Но в то время как кривая подгоняет его с двойным гауссианом, он показывает только один пик. Последовал почти за каждым ответом, показанным в stackoverflow. Но не удалось получить правильный результат. Ранее это было сделано моим учителем в Фортране, и он получил два пика. я использовалleastsq питонаscipy.optimize в одном испытании. Должен ли я также предоставить свои данные? Вот мой код

binss = (max(x) - min(x))/0.05 #0.05 is my bin width
n, bins, patches = plt.hist(x, binss, color = 'grey') #gives the histogram

x_a = []
for item in range(len(bins)-1):
    b = (bins[item]+bins[item+1])/2
    x_a.append(b)

x_avg = np.array(x_a)
y_real = n

def gauss(x, A, mu, sigma):
    gaus = []
    for item in range(len(x)):
        gaus.append(A*e**(-(x[item]-mu)**2./(2.*sigma**2)))
    return np.array(gaus)
A1, A2, m1, m2, sd1, sd2 = [25, 30, 0.3, 0.6, -0.9, -0.9]

#Initial guesses for leastsq
p = [A1, A2, m1, m2, sd1, sd2]
y_init = gauss(x_avg, A1, m1, sd1) + gauss(x_avg, A2, m2, sd2)    #initially guessed y

def residual(p, x, y):
    A1, A2, m1, m2, sd1, sd2 = p
    y_fit = gauss(x, A1, m1, sd1) + gauss(x, A2, m2, sd2)
    err = y - y_fit
    return err

sf = leastsq(residual, p, args = (x_avg , y_real))

y_fitted1 = gauss(x_avg, sf[0][0], sf[0][2], sf[0][4])
y_fitted2 = gauss(x_avg, sf[0][1], sf[0][3], sf[0][5])

y_fitted = y_fitted1 + y_fitted2

plt.plot(x_avg, y_init, 'b', label='Starting Guess')
plt.plot(x_avg, y_fitted, color = 'red', label = 'Fitted Data')
plt.plot(x_avg, y_fitted1, color= 'black', label = 'Fitted1 Data')
plt.plot(x_avg, y_fitted2, color = 'green', label = 'Fitted2 Data')

Даже фигура, которую я получил, не гладкая. У него всего 54 очкаx_avg Пожалуйста, помогите. Не могу даже опубликовать рисунок здесь.

При построении графиков на MATLAB были получены правильные результаты. Причина: MATLAB использует алгоритм Trust Region вместо алгоритма Левенберга-Марквардта, который не подходит для связанных ограничений.

Правильные результаты приходят только тогда, когда это показано как сумма 3 отдельных гауссианцев, а не 2.

Как мне решить, какой алгоритм использовать и когда?

Ответы на вопрос(2)

Ваш ответ на вопрос