Трехчленная гауссовская подгонка к гауссовым данным (питон)

Я пытаюсь подогнать гауссовские данные к конкретному трехчленному гауссову (в котором амплитуда в одном члене равна удвоенному стандартному отклонению следующего члена). Вот моя попытка:

import numpy as np

#from scipy.optimize import curve_fit
import scipy.optimize as optimize

import matplotlib.pyplot as plt

#r=np.linspace(0.0e-15,4e-15, 100) 

data = np.loadtxt('V_lambda_n.dat')
r = data[:, 0]
V = data[:, 1]

def func(x, ps1, ps2, ps3, ps4):
    return ps1*np.exp(-(x/ps2)**2) + ps2*np.exp(-(x/ps3)**2) + ps3*np.exp(-(x/ps4)**2)

popt, pcov = optimize.curve_fit(func, r, V, maxfev=10000)

#params = optimize.curve_fit(func, ps1, ps2, ps3, ps4)

#[ps1, ps2, ps2, ps4] = params[0]

p1=plt.plot(r, V, 'bo', label='data')
p2=plt.plot(r, func(r, *popt), 'r-', label='fit')

plt.xticks(np.linspace(0, 4, 9, endpoint=True))
plt.yticks(np.linspace(-50, 150, 9, endpoint=True))
plt.show()

Вот результат:

введите здесь описание изображения

Как я могу исправить этот код, чтобы улучшить соответствие? Спасибо


person Otto    schedule 05.04.2017    source источник
comment
.........popt, pcov = optim.curve_fit(partial(func, x, ps1, ps2, ps3, ps4), r, V, maxfev=10000)....?   -  person Ari Gold    schedule 05.04.2017
comment
Привет @AriGold, когда я пытаюсь это сделать, я получаю сообщение об ошибке NameError: name 'partial' не определено   -  person Otto    schedule 05.04.2017
comment
частичный импорт из functools   -  person Ari Gold    schedule 05.04.2017
comment
@AriGold Я получаю сообщение об ошибке NameError: имя «x» не определено. Это один из аргументов моей подгоночной функции.   -  person Otto    schedule 05.04.2017
comment
это ваша задача с этого момента, пожалуйста, найдите причину.........   -  person Ari Gold    schedule 05.04.2017
comment
Поскольку это проблема оптимизации, я думаю попробовать начальное предположение, как я могу выбрать начальное предположение для ps1, ps2, ps3 и ps4?   -  person Otto    schedule 05.04.2017


Ответы (1)


С помощью друзей с форума scipy-user я попробовал в качестве первоначального предположения следующее:

p0=[V.max(), std_dev, V.max(), 2]

Подгонка стала намного лучше. Новая посадка, как показано

введите здесь описание изображения

Я надеюсь, что подгонка может стать лучше, чем эта.

person Otto    schedule 07.04.2017