Using an ExpressionModelΒΆ

ExpressionModels allow a model to be built from a user-supplied expression. See: https://lmfit.github.io/lmfit-py/builtin_models.html#user-defined-models

import matplotlib.pyplot as plt
import numpy as np

from lmfit.models import ExpressionModel

Generate synthetic data for the user-supplied model:

x = np.linspace(-10, 10, 201)
amp, cen, wid = 3.4, 1.8, 0.5

y = amp * np.exp(-(x-cen)**2 / (2*wid**2)) / (np.sqrt(2*np.pi)*wid)
y = y + np.random.normal(size=x.size, scale=0.01)

Define the ExpressionModel and perform the fit:

gmod = ExpressionModel("amp * exp(-(x-cen)**2 /(2*wid**2))/(sqrt(2*pi)*wid)")
result = gmod.fit(y, x=x, amp=5, cen=5, wid=1)

this results in the following output:

print(result.fit_report())

plt.plot(x, y, 'bo')
plt.plot(x, result.init_fit, 'k--', label='initial fit')
plt.plot(x, result.best_fit, 'r-', label='best fit')
plt.legend(loc='best')
plt.show()
../_images/sphx_glr_example_expression_model_001.png

Out:

[[Model]]
    Model(_eval)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 52
    # data points      = 201
    # variables        = 3
    chi-square         = 0.02184805
    reduced chi-square = 1.1034e-04
    Akaike info crit   = -1828.51661
    Bayesian info crit = -1818.60669
[[Variables]]
    amp:  3.40725701 +/- 0.00541581 (0.16%) (init = 5)
    cen:  1.80147428 +/- 9.1751e-04 (0.05%) (init = 5)
    wid:  0.49989801 +/- 9.1751e-04 (0.18%) (init = 1)
[[Correlations]] (unreported correlations are < 0.100)
    C(amp, wid) =  0.577

/Users/Newville/Codes/lmfit-py/examples/example_expression_model.py:35: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
  plt.show()

Total running time of the script: ( 0 minutes 0.089 seconds)

Gallery generated by Sphinx-Gallery