""" doc_model_composite.py ====================== """ ## import warnings warnings.filterwarnings("ignore") ## # import matplotlib.pyplot as plt import numpy as np from lmfit import CompositeModel, Model from lmfit.lineshapes import gaussian, step # create data from broadened step x = np.linspace(0, 10, 201) y = step(x, amplitude=12.5, center=4.5, sigma=0.88, form='erf') np.random.seed(0) y = y + np.random.normal(scale=0.35, size=x.size) def jump(x, mid): """Heaviside step function.""" o = np.zeros(x.size) imid = max(np.where(x <= mid)[0]) o[imid:] = 1.0 return o def convolve(arr, kernel): """Simple convolution of two arrays.""" npts = min(arr.size, kernel.size) pad = np.ones(npts) tmp = np.concatenate((pad*arr[0], arr, pad*arr[-1])) out = np.convolve(tmp, kernel, mode='valid') noff = int((len(out) - npts) / 2) return out[noff:noff+npts] # create Composite Model using the custom convolution operator mod = CompositeModel(Model(jump), Model(gaussian), convolve) pars = mod.make_params(amplitude=1, center=3.5, sigma=1.5, mid=5.0) # 'mid' and 'center' should be completely correlated, and 'mid' is # used as an integer index, so a very poor fit variable: pars['mid'].vary = False # fit this model to data array y result = mod.fit(y, params=pars, x=x) print(result.fit_report()) # generate components comps = result.eval_components(x=x) # plot results fig, axes = plt.subplots(1, 2, figsize=(12.8, 4.8)) axes[0].plot(x, y, 'bo') axes[0].plot(x, result.init_fit, 'k--', label='initial fit') axes[0].plot(x, result.best_fit, 'r-', label='best fit') axes[0].legend(loc='best') axes[1].plot(x, y, 'bo') axes[1].plot(x, 10*comps['jump'], 'k--', label='Jump component') axes[1].plot(x, 10*comps['gaussian'], 'r-', label='Gaussian component') axes[1].legend(loc='best') plt.show() #