I want to make a global fit of two data sets and plotting the results. I found the answer to "Python and lmfit: How to fit multiple datasets with shared parameters?" answered by @M Newville. The modified code is:
params = Parameters()
params.add('center_1', 5.0, vary=True)
params.add('amplitude_1', 10.0, vary=True)
params.add('sigma_1', 1.0, vary=True)
params.add('center_2', 8.0, vary=True)
params.add('amplitude_2', 3.0, vary=True)
params.add('sigma_2', 2.0, vary=True)
x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = gaussian(x, 3.1, 1.21, 1.51) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
model1 = gaussian(x, params['amplitude_1'], params['center_1'], params['sigma_1'])
model2 = gaussian(x, params['amplitude_2'], params['center_2'], params['sigma_2'])
resid1 = datasets[0] - model1
resid2 = datasets[1] - model2
return np.concatenate((resid1, resid2))
fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))
Só, my problem is that I want to present the data and the fit results in a graph, but I don't know how to do it? Please, does anybody can give me a clue?
Edit:
My new code will be:
params = Parameters()
params.add('cen', 5.0, vary=True)
params.add('amp', 10.0, vary=True)
params.add('sig', 1.0, vary=True)
params.add('pen', 8.0, vary=True)
params.add('inter', 3.0, vary=True)
def reta(x, a, c):
return a * x + c
x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = reta(x, 3.1, 1) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
model1 = gaussian(x, params['amp'], params['cen'], params['sig'])
model2 = reta(x, params['pen'], params['inter'])
resid1 = datasets[0] - model1
resid2 = datasets[1] - model2
return np.concatenate((resid1, resid2))
fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))
plt.figure()
plt.plot(x, data1)
plt.plot(x, data2)
If I had only one function, I can plot making this:
plt.plot(x, residual(fit.params) + data1, 'r', label='best fit')
But for two models, I am having problems.