https://github.com/lmfit/lmfit-py
Raw File
Tip revision: c78453af3c790c6368f910451d1710210fa57f93 authored by Matthew Newville on 05 April 2024, 02:32:07 UTC
update docs again for 1.3.0
Tip revision: c78453a
builtin_models.html
<!DOCTYPE html>

<html lang="en" data-content_root="./">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>Built-in Fitting Models in the models module &#8212; Non-Linear Least-Squares Minimization and Curve-Fitting for Python</title>
    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
    <link rel="stylesheet" type="text/css" href="_static/sphinx13.css?v=aac77d10" />
    <link rel="stylesheet" type="text/css" href="_static/jupyter-sphinx.css" />
    <link rel="stylesheet" type="text/css" href="_static/thebelab.css" />
    <link rel="stylesheet" type="text/css" href="_static/sg_gallery.css?v=61a4c737" />
    <link rel="stylesheet" type="text/css" href="_static/sg_gallery-binder.css?v=f4aeca0c" />
    <link rel="stylesheet" type="text/css" href="_static/sg_gallery-dataframe.css?v=2082cf3c" />
    <link rel="stylesheet" type="text/css" href="_static/sg_gallery-rendered-html.css?v=1277b6f3" />
    <script src="_static/documentation_options.js?v=1f29e9d3"></script>
    <script src="_static/doctools.js?v=888ff710"></script>
    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
    <script src="_static/thebelab-helper.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@^1.0.1/dist/embed-amd.js"></script>
    <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Calculation of confidence intervals" href="confidence.html" />
    <link rel="prev" title="Modeling Data and Curve Fitting" href="model.html" />
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,700'
          rel='stylesheet' type='text/css' />
 
    <style type="text/css">
      table.right { float: right; margin-left: 20px; }
      table.right td { border: 1px solid #ccc; }
    </style>
    <script>
      // intelligent scrolling of the sidebar content
      $(window).scroll(function() {
        var sb = $('.sphinxsidebarwrapper');
        var win = $(window);
        var sbh = sb.height();
        var offset = $('.sphinxsidebar').position()['top'];
        var wintop = win.scrollTop();
        var winbot = wintop + win.innerHeight();
        var curtop = sb.position()['top'];
        var curbot = curtop + sbh;
        // does sidebar fit in window?
        if (sbh < win.innerHeight()) {
          // yes: easy case -- always keep at the top
          sb.css('top', $u.min([$u.max([0, wintop - offset - 10]),
                                $(document).height() - sbh - 200]));
        } else {
          // no: only scroll if top/bottom edge of sidebar is at
          // top/bottom edge of window
          if (curtop > wintop && curbot > winbot) {
            sb.css('top', $u.max([wintop - offset - 10, 0]));
          } else if (curtop < wintop && curbot < winbot) {
            sb.css('top', $u.min([winbot - sbh - offset - 20,
                                  $(document).height() - sbh - 200]));
          }
        }
      });
    </script>

  </head><body>
<div class="pageheader">
  <ul>
    <li><a href="contents.html">Contents</a></li>
    <li><a href="examples/index.html">Examples</a></li>
    <li><a href="installation.html">Installation</a></li>
    <li><a href="faq.html">FAQ</a></li>
    <li><a href="support.html">Support</a></li>
    <li><a href="https://github.com/lmfit/lmfit-py">Develop</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/lmfitheader.png" alt="LMFIT" />
    </a>
  </div>
</div>

    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="confidence.html" title="Calculation of confidence intervals"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="model.html" title="Modeling Data and Curve Fitting"
             accesskey="P">previous</a> |</li>
    <li>[ <a href="intro.html">intro</a> |</li>
    <li><a href="parameters.html">parameters</a> |</li>
    <li><a href="fitting.html">minimize</a> |</li>
    <li><a href="model.html">model</a> |</li>
    <li><a href="#">built-in models</a> |</li>
    <li><a href="confidence.html">confidence intervals</a> |</li>
    <li><a href="bounds.html">bounds</a> |</li>
    <li><a href="constraints.html">constraints</a> ]</li>
 
      </ul>
    </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <div>
    <h3><a href="index.html">Table of Contents</a></h3>
    <ul>
<li><a class="reference internal" href="#">Built-in Fitting Models in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">models</span></code> module</a><ul>
<li><a class="reference internal" href="#peak-like-models">Peak-like models</a><ul>
<li><a class="reference internal" href="#gaussianmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">GaussianModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.GaussianModel"><code class="docutils literal notranslate"><span class="pre">GaussianModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#lorentzianmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LorentzianModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.LorentzianModel"><code class="docutils literal notranslate"><span class="pre">LorentzianModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#splitlorentzianmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SplitLorentzianModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.SplitLorentzianModel"><code class="docutils literal notranslate"><span class="pre">SplitLorentzianModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#voigtmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">VoigtModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.VoigtModel"><code class="docutils literal notranslate"><span class="pre">VoigtModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#pseudovoigtmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PseudoVoigtModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.PseudoVoigtModel"><code class="docutils literal notranslate"><span class="pre">PseudoVoigtModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#moffatmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">MoffatModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.MoffatModel"><code class="docutils literal notranslate"><span class="pre">MoffatModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#pearson4model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pearson4Model</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.Pearson4Model"><code class="docutils literal notranslate"><span class="pre">Pearson4Model</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#pearson7model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pearson7Model</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.Pearson7Model"><code class="docutils literal notranslate"><span class="pre">Pearson7Model</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#studentstmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">StudentsTModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.StudentsTModel"><code class="docutils literal notranslate"><span class="pre">StudentsTModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#breitwignermodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">BreitWignerModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.BreitWignerModel"><code class="docutils literal notranslate"><span class="pre">BreitWignerModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#lognormalmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LognormalModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.LognormalModel"><code class="docutils literal notranslate"><span class="pre">LognormalModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#dampedoscillatormodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DampedOscillatorModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.DampedOscillatorModel"><code class="docutils literal notranslate"><span class="pre">DampedOscillatorModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#dampedharmonicoscillatormodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DampedHarmonicOscillatorModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.DampedHarmonicOscillatorModel"><code class="docutils literal notranslate"><span class="pre">DampedHarmonicOscillatorModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#exponentialgaussianmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExponentialGaussianModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.ExponentialGaussianModel"><code class="docutils literal notranslate"><span class="pre">ExponentialGaussianModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#skewedgaussianmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SkewedGaussianModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.SkewedGaussianModel"><code class="docutils literal notranslate"><span class="pre">SkewedGaussianModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#skewedvoigtmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SkewedVoigtModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.SkewedVoigtModel"><code class="docutils literal notranslate"><span class="pre">SkewedVoigtModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#thermaldistributionmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThermalDistributionModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.ThermalDistributionModel"><code class="docutils literal notranslate"><span class="pre">ThermalDistributionModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#doniachmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DoniachModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.DoniachModel"><code class="docutils literal notranslate"><span class="pre">DoniachModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#linear-and-polynomial-models">Linear and Polynomial Models</a><ul>
<li><a class="reference internal" href="#constantmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConstantModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.ConstantModel"><code class="docutils literal notranslate"><span class="pre">ConstantModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#linearmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LinearModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.LinearModel"><code class="docutils literal notranslate"><span class="pre">LinearModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#quadraticmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">QuadraticModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.QuadraticModel"><code class="docutils literal notranslate"><span class="pre">QuadraticModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#polynomialmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PolynomialModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.PolynomialModel"><code class="docutils literal notranslate"><span class="pre">PolynomialModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#splinelmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SplinelModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.SplineModel"><code class="docutils literal notranslate"><span class="pre">SplineModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#periodic-models">Periodic Models</a><ul>
<li><a class="reference internal" href="#sinemodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SineModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.SineModel"><code class="docutils literal notranslate"><span class="pre">SineModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#step-like-models">Step-like models</a><ul>
<li><a class="reference internal" href="#stepmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">StepModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.StepModel"><code class="docutils literal notranslate"><span class="pre">StepModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#rectanglemodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">RectangleModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.RectangleModel"><code class="docutils literal notranslate"><span class="pre">RectangleModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#exponential-and-power-law-models">Exponential and Power law models</a><ul>
<li><a class="reference internal" href="#exponentialmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExponentialModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.ExponentialModel"><code class="docutils literal notranslate"><span class="pre">ExponentialModel</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#powerlawmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PowerLawModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.PowerLawModel"><code class="docutils literal notranslate"><span class="pre">PowerLawModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#two-dimensional-peak-like-models">Two dimensional Peak-like models</a><ul>
<li><a class="reference internal" href="#gaussian2dmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">Gaussian2dModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.Gaussian2dModel"><code class="docutils literal notranslate"><span class="pre">Gaussian2dModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#user-defined-models">User-defined Models</a><ul>
<li><a class="reference internal" href="#expressionmodel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a><ul>
<li><a class="reference internal" href="#lmfit.models.ExpressionModel"><code class="docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profiles">Example 1: Fit Peak data to Gaussian, Lorentzian, and Voigt profiles</a></li>
<li><a class="reference internal" href="#example-2-fit-data-to-a-composite-model-with-pre-defined-models">Example 2: Fit data to a Composite Model with pre-defined models</a></li>
<li><a class="reference internal" href="#example-3-fitting-multiple-peaks-and-using-prefixes">Example 3: Fitting Multiple Peaks – and using Prefixes</a></li>
<li><a class="reference internal" href="#example-4-using-a-spline-model">Example 4: Using a Spline Model</a></li>
</ul>
</li>
</ul>

  </div>
  <div>
    <h4>Previous topic</h4>
    <p class="topless"><a href="model.html"
                          title="previous chapter">Modeling Data and Curve Fitting</a></p>
  </div>
  <div>
    <h4>Next topic</h4>
    <p class="topless"><a href="confidence.html"
                          title="next chapter">Calculation of confidence intervals</a></p>
  </div>
<div id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
      <input type="submit" value="Go" />
    </form>
    </div>
</div>
<script>document.getElementById('searchbox').style.display = "block"</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <section id="module-lmfit.models">
<span id="built-in-fitting-models-in-the-models-module"></span><span id="builtin-models-chapter"></span><h1>Built-in Fitting Models in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">models</span></code> module<a class="headerlink" href="#module-lmfit.models" title="Link to this heading">¶</a></h1>
<p>Lmfit provides several built-in fitting models in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">models</span></code> module.
These pre-defined models each subclass from the <a class="reference internal" href="model.html#lmfit.model.Model" title="lmfit.model.Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a> class of the
previous chapter and wrap relatively well-known functional forms, such as
Gaussian, Lorentzian, and Exponential that are used in a wide range of
scientific domains. In fact, all the models are based on simple, plain
Python functions defined in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">lineshapes</span></code> module. In addition to
wrapping a function into a <a class="reference internal" href="model.html#lmfit.model.Model" title="lmfit.model.Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a>, these models also provide a
<a class="reference internal" href="model.html#lmfit.model.Model.guess" title="lmfit.model.Model.guess"><code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code></a> method that is intended to give a reasonable
set of starting values from a data array that closely approximates the
data to be fit.</p>
<p>As shown in the previous chapter, a key feature of the <a class="reference internal" href="model.html#lmfit.model.Model" title="lmfit.model.Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a> class
is that models can easily be combined to give a composite
<a class="reference internal" href="model.html#lmfit.model.CompositeModel" title="lmfit.model.CompositeModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">CompositeModel</span></code></a>. Thus, while some of the models listed here may
seem pretty trivial (notably, <a class="reference internal" href="#lmfit.models.ConstantModel" title="lmfit.models.ConstantModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConstantModel</span></code></a> and <a class="reference internal" href="#lmfit.models.LinearModel" title="lmfit.models.LinearModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LinearModel</span></code></a>),
the main point of having these is to be able to use them in composite models. For
example, a Lorentzian plus a linear background might be represented as:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">LinearModel</span><span class="p">,</span> <span class="n">LorentzianModel</span>

<span class="n">peak</span> <span class="o">=</span> <span class="n">LorentzianModel</span><span class="p">()</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">LinearModel</span><span class="p">()</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">peak</span> <span class="o">+</span> <span class="n">background</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>Almost all the models listed below are one-dimensional, with an independent
variable named <code class="docutils literal notranslate"><span class="pre">x</span></code>. Many of these models represent a function with a
distinct peak, and so share common features. To maintain uniformity,
common parameter names are used whenever possible. Thus, most models have
a parameter called <code class="docutils literal notranslate"><span class="pre">amplitude</span></code> that represents the overall intensity (or
area of) a peak or function and a <code class="docutils literal notranslate"><span class="pre">sigma</span></code> parameter that gives a
characteristic width.</p>
<p>After a list of built-in models, a few examples of their use are given.</p>
<section id="peak-like-models">
<h2>Peak-like models<a class="headerlink" href="#peak-like-models" title="Link to this heading">¶</a></h2>
<p>There are many peak-like models available. These include
<a class="reference internal" href="#lmfit.models.GaussianModel" title="lmfit.models.GaussianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">GaussianModel</span></code></a>, <a class="reference internal" href="#lmfit.models.LorentzianModel" title="lmfit.models.LorentzianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LorentzianModel</span></code></a>, <a class="reference internal" href="#lmfit.models.VoigtModel" title="lmfit.models.VoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">VoigtModel</span></code></a>,
<a class="reference internal" href="#lmfit.models.PseudoVoigtModel" title="lmfit.models.PseudoVoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PseudoVoigtModel</span></code></a>, and some less commonly used variations. Most of
these models are <em>unit-normalized</em> and share the same parameter names so
that you can easily switch between models and interpret the results. The
<code class="docutils literal notranslate"><span class="pre">amplitude</span></code> parameter is the multiplicative factor for the
unit-normalized peak lineshape, and so will represent the strength of that
peak or the area under that curve. The <code class="docutils literal notranslate"><span class="pre">center</span></code> parameter will be the
centroid <code class="docutils literal notranslate"><span class="pre">x</span></code> value. The <code class="docutils literal notranslate"><span class="pre">sigma</span></code> parameter is the characteristic width
of the peak, with many functions using <span class="math notranslate nohighlight">\((x-\mu)/\sigma\)</span> where
<span class="math notranslate nohighlight">\(\mu\)</span> is the centroid value. Most of these peak functions will have
two additional parameters derived from and constrained by the other
parameters. The first of these is <code class="docutils literal notranslate"><span class="pre">fwhm</span></code> which will hold the estimated
“Full Width at Half Max” for the peak, which is often easier to compare
between different models than <code class="docutils literal notranslate"><span class="pre">sigma</span></code>. The second of these is <code class="docutils literal notranslate"><span class="pre">height</span></code>
which will contain the maximum value of the peak, typically the value at
<span class="math notranslate nohighlight">\(x = \mu\)</span>. Finally, each of these models has a <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> method
that uses data to make a fairly crude but usually sufficient guess for the
value of <code class="docutils literal notranslate"><span class="pre">amplitude</span></code>, <code class="docutils literal notranslate"><span class="pre">center</span></code>, and <code class="docutils literal notranslate"><span class="pre">sigma</span></code>, and sets a lower bound
of 0 on the value of <code class="docutils literal notranslate"><span class="pre">sigma</span></code>.</p>
<section id="gaussianmodel">
<h3><a class="reference internal" href="#lmfit.models.GaussianModel" title="lmfit.models.GaussianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">GaussianModel</span></code></a><a class="headerlink" href="#gaussianmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.GaussianModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">GaussianModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.GaussianModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Gaussian or normal distribution lineshape.</p>
<p>The model has three Parameters: <cite>amplitude</cite>, <cite>center</cite>, and <cite>sigma</cite>.
In addition, parameters <cite>fwhm</cite> and <cite>height</cite> are included as
constraints to report full width at half maximum and maximum peak
height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma) = \frac{A}{\sigma\sqrt{2\pi}} e^{[{-{(x-\mu)^2}/{{2\sigma}^2}}]}\]</div>
<p>where the parameter <cite>amplitude</cite> corresponds to <span class="math notranslate nohighlight">\(A\)</span>, <cite>center</cite> to
<span class="math notranslate nohighlight">\(\mu\)</span>, and <cite>sigma</cite> to <span class="math notranslate nohighlight">\(\sigma\)</span>. The full width at half
maximum is <span class="math notranslate nohighlight">\(2\sigma\sqrt{2\ln{2}}\)</span>, approximately
<span class="math notranslate nohighlight">\(2.3548\sigma\)</span>.</p>
<p>For more information, see: <a class="reference external" href="https://en.wikipedia.org/wiki/Normal_distribution">https://en.wikipedia.org/wiki/Normal_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="lorentzianmodel">
<h3><a class="reference internal" href="#lmfit.models.LorentzianModel" title="lmfit.models.LorentzianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LorentzianModel</span></code></a><a class="headerlink" href="#lorentzianmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.LorentzianModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">LorentzianModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.LorentzianModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Lorentzian or Cauchy-Lorentz distribution function.</p>
<p>The model has three Parameters: <cite>amplitude</cite>, <cite>center</cite>, and <cite>sigma</cite>. In
addition, parameters <cite>fwhm</cite> and <cite>height</cite> are included as constraints
to report full width at half maximum and maximum peak height,
respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma) = \frac{A}{\pi} \big[\frac{\sigma}{(x - \mu)^2 + \sigma^2}\big]\]</div>
<p>where the parameter <cite>amplitude</cite> corresponds to <span class="math notranslate nohighlight">\(A\)</span>, <cite>center</cite> to
<span class="math notranslate nohighlight">\(\mu\)</span>, and <cite>sigma</cite> to <span class="math notranslate nohighlight">\(\sigma\)</span>. The full width at half
maximum is <span class="math notranslate nohighlight">\(2\sigma\)</span>.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Cauchy_distribution">https://en.wikipedia.org/wiki/Cauchy_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="splitlorentzianmodel">
<h3><a class="reference internal" href="#lmfit.models.SplitLorentzianModel" title="lmfit.models.SplitLorentzianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SplitLorentzianModel</span></code></a><a class="headerlink" href="#splitlorentzianmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.SplitLorentzianModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SplitLorentzianModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.SplitLorentzianModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Lorentzian or Cauchy-Lorentz distribution function.</p>
<p>The model has four parameters: <cite>amplitude</cite>, <cite>center</cite>, <cite>sigma</cite>, and
<cite>sigma_r</cite>. In addition, parameters <cite>fwhm</cite> and <cite>height</cite> are included
as constraints to report full width at half maximum and maximum peak
height, respectively.</p>
<p>‘Split’ means that the width of the distribution is different between
left and right slopes.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \sigma_r) = \frac{2 A}{\pi (\sigma+\sigma_r)} \big[\frac{\sigma^2}{(x - \mu)^2 + \sigma^2} * H(\mu-x) + \frac{\sigma_r^2}{(x - \mu)^2 + \sigma_r^2} * H(x-\mu)\big]\]</div>
<p>where the parameter <cite>amplitude</cite> corresponds to <span class="math notranslate nohighlight">\(A\)</span>, <cite>center</cite> to
<span class="math notranslate nohighlight">\(\mu\)</span>, <cite>sigma</cite> to <span class="math notranslate nohighlight">\(\sigma\)</span>, <cite>sigma_l</cite> to <span class="math notranslate nohighlight">\(\sigma_l\)</span>,
and <span class="math notranslate nohighlight">\(H(x)\)</span> is a Heaviside step function:</p>
<div class="math notranslate nohighlight">
\[H(x) = 0 | x &lt; 0, 1 | x \geq 0\]</div>
<p>The full width at half maximum is <span class="math notranslate nohighlight">\(\sigma_l+\sigma_r\)</span>. Just as
with the Lorentzian model, integral of this function from <cite>-.inf</cite> to
<cite>+.inf</cite> equals to <cite>amplitude</cite>.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Cauchy_distribution">https://en.wikipedia.org/wiki/Cauchy_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="voigtmodel">
<h3><a class="reference internal" href="#lmfit.models.VoigtModel" title="lmfit.models.VoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">VoigtModel</span></code></a><a class="headerlink" href="#voigtmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.VoigtModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">VoigtModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.VoigtModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Voigt distribution function.</p>
<p>The model has four Parameters: <cite>amplitude</cite>, <cite>center</cite>, <cite>sigma</cite>, and
<cite>gamma</cite>. By default, <cite>gamma</cite> is constrained to have a value equal to
<cite>sigma</cite>, though it can be varied independently. In addition,
parameters <cite>fwhm</cite> and <cite>height</cite> are included as constraints to report
full width at half maximum and maximum peak height, respectively. The
definition for the Voigt function used here is:</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma) = \frac{A \textrm{Re}[w(z)]}{\sigma\sqrt{2 \pi}}\]</div>
<p>where</p>
<div class="math notranslate nohighlight">
\begin{eqnarray*}
    z &amp;=&amp; \frac{x-\mu +i\gamma}{\sigma\sqrt{2}} \\
    w(z) &amp;=&amp; e^{-z^2}{\operatorname{erfc}}(-iz)
\end{eqnarray*}</div><p>and <code class="xref py py-func docutils literal notranslate"><span class="pre">erfc()</span></code> is the complementary error function. As above,
<cite>amplitude</cite> corresponds to <span class="math notranslate nohighlight">\(A\)</span>, <cite>center</cite> to <span class="math notranslate nohighlight">\(\mu\)</span>, and
<cite>sigma</cite> to <span class="math notranslate nohighlight">\(\sigma\)</span>. The parameter <cite>gamma</cite> corresponds to
<span class="math notranslate nohighlight">\(\gamma\)</span>. If <cite>gamma</cite> is kept at the default value (constrained
to <cite>sigma</cite>), the full width at half maximum is approximately
<span class="math notranslate nohighlight">\(3.6013\sigma\)</span>.</p>
<p>For more information, see: <a class="reference external" href="https://en.wikipedia.org/wiki/Voigt_profile">https://en.wikipedia.org/wiki/Voigt_profile</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="pseudovoigtmodel">
<h3><a class="reference internal" href="#lmfit.models.PseudoVoigtModel" title="lmfit.models.PseudoVoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PseudoVoigtModel</span></code></a><a class="headerlink" href="#pseudovoigtmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.PseudoVoigtModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PseudoVoigtModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.PseudoVoigtModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a pseudo-Voigt distribution function.</p>
<p>This is a weighted sum of a Gaussian and Lorentzian distribution
function that share values for <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), and full width at half maximum <cite>fwhm</cite> (and so has
constrained values of <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>) and <cite>height</cite> (maximum
peak height). The parameter <cite>fraction</cite> (<span class="math notranslate nohighlight">\(\alpha\)</span>) controls the
relative weight of the Gaussian and Lorentzian components, giving the
full definition of:</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \alpha) = \frac{(1-\alpha)A}{\sigma_g\sqrt{2\pi}}
e^{[{-{(x-\mu)^2}/{{2\sigma_g}^2}}]}
+ \frac{\alpha A}{\pi} \big[\frac{\sigma}{(x - \mu)^2 + \sigma^2}\big]\]</div>
<p>where <span class="math notranslate nohighlight">\(\sigma_g = {\sigma}/{\sqrt{2\ln{2}}}\)</span> so that the full
width at half maximum of each component and of the sum is
<span class="math notranslate nohighlight">\(2\sigma\)</span>. The <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> function always sets the starting
value for <cite>fraction</cite> at 0.5.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Voigt_profile#Pseudo-Voigt_Approximation">https://en.wikipedia.org/wiki/Voigt_profile#Pseudo-Voigt_Approximation</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="moffatmodel">
<h3><a class="reference internal" href="#lmfit.models.MoffatModel" title="lmfit.models.MoffatModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">MoffatModel</span></code></a><a class="headerlink" href="#moffatmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.MoffatModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MoffatModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.MoffatModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on the Moffat distribution function.</p>
<p>The model has four Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), a width parameter <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and an
exponent <cite>beta</cite> (<span class="math notranslate nohighlight">\(\beta\)</span>). In addition, parameters <cite>fwhm</cite> and
<cite>height</cite> are included as constraints to report full width at half
maximum and maximum peak height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \beta) = A \big[(\frac{x-\mu}{\sigma})^2+1\big]^{-\beta}\]</div>
<p>the full width at half maximum is <span class="math notranslate nohighlight">\(2\sigma\sqrt{2^{1/\beta}-1}\)</span>.
The <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> function always sets the starting value for <cite>beta</cite>
to 1.</p>
<p>Note that for (<span class="math notranslate nohighlight">\(\beta=1\)</span>) the Moffat has a Lorentzian shape. For
more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Moffat_distribution">https://en.wikipedia.org/wiki/Moffat_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="pearson4model">
<h3><a class="reference internal" href="#lmfit.models.Pearson4Model" title="lmfit.models.Pearson4Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pearson4Model</span></code></a><a class="headerlink" href="#pearson4model" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.Pearson4Model">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Pearson4Model</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.Pearson4Model" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Pearson IV distribution.</p>
<p>The model has five parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), <cite>expon</cite> (<span class="math notranslate nohighlight">\(m\)</span>) and <cite>skew</cite> (<span class="math notranslate nohighlight">\(\nu\)</span>).
In addition, parameters <cite>fwhm</cite>, <cite>height</cite> and <cite>position</cite> are included as
constraints to report estimates for the approximate full width at half maximum (20% error),
the peak height, and the peak position (the position of the maximal  function value), respectively.
The fwhm value has an error of about 20% in the
parameter range expon: (0.5, 1000], skew: [-1000, 1000].</p>
<div class="math notranslate nohighlight">
\[f(x;A,\mu,\sigma,m,\nu)=A \frac{\left|\frac{\Gamma(m+i\tfrac{\nu}{2})}{\Gamma(m)}\right|^2}{\sigma\beta(m-\tfrac{1}{2},\tfrac{1}{2})}\left[1+\frac{(x-\mu)^2}{\sigma^2}\right]^{-m}\exp\left(-\nu \arctan\left(\frac{x-\mu}{\sigma}\right)\right)\]</div>
<p>where <span class="math notranslate nohighlight">\(\beta\)</span> is the beta function (see <a class="reference external" href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.beta.html">scipy.special.beta</a>).
The <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> function always gives a starting value of 1.5 for <cite>expon</cite>,
and 0 for <cite>skew</cite>.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Pearson_distribution#The_Pearson_type_IV_distribution">https://en.wikipedia.org/wiki/Pearson_distribution#The_Pearson_type_IV_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="pearson7model">
<h3><a class="reference internal" href="#lmfit.models.Pearson7Model" title="lmfit.models.Pearson7Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pearson7Model</span></code></a><a class="headerlink" href="#pearson7model" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.Pearson7Model">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Pearson7Model</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.Pearson7Model" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Pearson VII distribution.</p>
<p>The model has four parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>exponent</cite> (<span class="math notranslate nohighlight">\(m\)</span>).
In addition, parameters <cite>fwhm</cite> and <cite>height</cite> are included as
constraints to report estimates for the full width at half maximum and
maximum peak height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, m) = \frac{A}{\sigma{\beta(m-\frac{1}{2}, \frac{1}{2})}} \bigl[1 + \frac{(x-\mu)^2}{\sigma^2} \bigr]^{-m}\]</div>
<p>where <span class="math notranslate nohighlight">\(\beta\)</span> is the beta function (see <a class="reference external" href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.beta.html">scipy.special.beta</a>).
The <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> function always gives a starting value for <cite>exponent</cite>
of 1.5. In addition, parameters <cite>fwhm</cite> and <cite>height</cite> are included as
constraints to report full width at half maximum and maximum peak
height, respectively.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Pearson_distribution#The_Pearson_type_VII_distribution">https://en.wikipedia.org/wiki/Pearson_distribution#The_Pearson_type_VII_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="studentstmodel">
<h3><a class="reference internal" href="#lmfit.models.StudentsTModel" title="lmfit.models.StudentsTModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">StudentsTModel</span></code></a><a class="headerlink" href="#studentstmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.StudentsTModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">StudentsTModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.StudentsTModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Student’s t-distribution function.</p>
<p>The model has three Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), and <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>). In addition, parameters
<cite>fwhm</cite> and <cite>height</cite> are included as constraints to report full width
at half maximum and maximum peak height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma) = \frac{A \Gamma(\frac{\sigma+1}{2})} {\sqrt{\sigma\pi}\,\Gamma(\frac{\sigma}{2})} \Bigl[1+\frac{(x-\mu)^2}{\sigma}\Bigr]^{-\frac{\sigma+1}{2}}\]</div>
<p>where <span class="math notranslate nohighlight">\(\Gamma(x)\)</span> is the gamma function.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Student%27s_t-distribution">https://en.wikipedia.org/wiki/Student%27s_t-distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="breitwignermodel">
<h3><a class="reference internal" href="#lmfit.models.BreitWignerModel" title="lmfit.models.BreitWignerModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">BreitWignerModel</span></code></a><a class="headerlink" href="#breitwignermodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.BreitWignerModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">BreitWignerModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.BreitWignerModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Breit-Wigner-Fano function.</p>
<p>The model has four Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>q</cite> (<span class="math notranslate nohighlight">\(q\)</span>).</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, q) = \frac{A (q\sigma/2 + x - \mu)^2}{(\sigma/2)^2 + (x - \mu)^2}\]</div>
<p>For more information, see: <a class="reference external" href="https://en.wikipedia.org/wiki/Fano_resonance">https://en.wikipedia.org/wiki/Fano_resonance</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="lognormalmodel">
<h3><a class="reference internal" href="#lmfit.models.LognormalModel" title="lmfit.models.LognormalModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LognormalModel</span></code></a><a class="headerlink" href="#lognormalmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.LognormalModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">LognormalModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.LognormalModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on the Log-normal distribution function.</p>
<p>The modal has three Parameters <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), and <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>). In addition, parameters
<cite>fwhm</cite> and <cite>height</cite> are included as constraints to report estimates of
full width at half maximum and maximum peak height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma) = \frac{A}{\sigma\sqrt{2\pi}}\frac{e^{-(\ln(x) - \mu)^2/ 2\sigma^2}}{x}\]</div>
<p>For more information, see: <a class="reference external" href="https://en.wikipedia.org/wiki/Lognormal">https://en.wikipedia.org/wiki/Lognormal</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="dampedoscillatormodel">
<h3><a class="reference internal" href="#lmfit.models.DampedOscillatorModel" title="lmfit.models.DampedOscillatorModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DampedOscillatorModel</span></code></a><a class="headerlink" href="#dampedoscillatormodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.DampedOscillatorModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DampedOscillatorModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.DampedOscillatorModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on the Damped Harmonic Oscillator Amplitude.</p>
<p>The model has three Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), and <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>). In addition, the
parameter <cite>height</cite> is included as a constraint to report the maximum
peak height.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma) = \frac{A}{\sqrt{ [1 - (x/\mu)^2]^2 + (2\sigma x/\mu)^2}}\]</div>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Harmonic_oscillator#Amplitude_part">https://en.wikipedia.org/wiki/Harmonic_oscillator#Amplitude_part</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="dampedharmonicoscillatormodel">
<h3><a class="reference internal" href="#lmfit.models.DampedHarmonicOscillatorModel" title="lmfit.models.DampedHarmonicOscillatorModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DampedHarmonicOscillatorModel</span></code></a><a class="headerlink" href="#dampedharmonicoscillatormodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.DampedHarmonicOscillatorModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DampedHarmonicOscillatorModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.DampedHarmonicOscillatorModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a variation of the Damped Harmonic Oscillator.</p>
<p>The model follows the definition given in DAVE/PAN (see:
<a class="reference external" href="https://www.ncnr.nist.gov/dave">https://www.ncnr.nist.gov/dave</a>) and has four Parameters: <cite>amplitude</cite>
(<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite> (<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and
<cite>gamma</cite> (<span class="math notranslate nohighlight">\(\gamma\)</span>). In addition, parameters <cite>fwhm</cite> and <cite>height</cite>
are included as constraints to report estimates for full width at half
maximum and maximum peak height, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma) = \frac{A\sigma}{\pi [1 - \exp(-x/\gamma)]}
        \Big[ \frac{1}{(x-\mu)^2 + \sigma^2} - \frac{1}{(x+\mu)^2 + \sigma^2} \Big]\]</div>
<p>where <span class="math notranslate nohighlight">\(\gamma=kT\)</span>, <cite>k</cite> is the Boltzmann constant in
<span class="math notranslate nohighlight">\(evK^-1\)</span>, and <cite>T</cite> is the temperature in <span class="math notranslate nohighlight">\(K\)</span>.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Harmonic_oscillator">https://en.wikipedia.org/wiki/Harmonic_oscillator</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="exponentialgaussianmodel">
<h3><a class="reference internal" href="#lmfit.models.ExponentialGaussianModel" title="lmfit.models.ExponentialGaussianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExponentialGaussianModel</span></code></a><a class="headerlink" href="#exponentialgaussianmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.ExponentialGaussianModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ExponentialGaussianModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.ExponentialGaussianModel" title="Link to this definition">¶</a></dt>
<dd><p>A model of an Exponentially modified Gaussian distribution.</p>
<p>The model has four Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>gamma</cite> (<span class="math notranslate nohighlight">\(\gamma\)</span>).</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma) = \frac{A\gamma}{2}
\exp\bigl[\gamma({\mu - x + \gamma\sigma^2/2})\bigr]
{\operatorname{erfc}}\Bigl(\frac{\mu + \gamma\sigma^2 - x}{\sqrt{2}\sigma}\Bigr)\]</div>
<p>where <code class="xref py py-func docutils literal notranslate"><span class="pre">erfc()</span></code> is the complementary error function.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Exponentially_modified_Gaussian_distribution">https://en.wikipedia.org/wiki/Exponentially_modified_Gaussian_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="skewedgaussianmodel">
<h3><a class="reference internal" href="#lmfit.models.SkewedGaussianModel" title="lmfit.models.SkewedGaussianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SkewedGaussianModel</span></code></a><a class="headerlink" href="#skewedgaussianmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.SkewedGaussianModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SkewedGaussianModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.SkewedGaussianModel" title="Link to this definition">¶</a></dt>
<dd><p>A skewed Gaussian model, using a skewed normal distribution.</p>
<p>The model has four Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>gamma</cite> (<span class="math notranslate nohighlight">\(\gamma\)</span>).</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma) = \frac{A}{\sigma\sqrt{2\pi}}
e^{[{-{(x-\mu)^2}/{{2\sigma}^2}}]} \Bigl\{ 1 +
{\operatorname{erf}}\bigl[
\frac{{\gamma}(x-\mu)}{\sigma\sqrt{2}}
\bigr] \Bigr\}\]</div>
<p>where <code class="xref py py-func docutils literal notranslate"><span class="pre">erf()</span></code> is the error function.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Skew_normal_distribution">https://en.wikipedia.org/wiki/Skew_normal_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="skewedvoigtmodel">
<h3><a class="reference internal" href="#lmfit.models.SkewedVoigtModel" title="lmfit.models.SkewedVoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SkewedVoigtModel</span></code></a><a class="headerlink" href="#skewedvoigtmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.SkewedVoigtModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SkewedVoigtModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.SkewedVoigtModel" title="Link to this definition">¶</a></dt>
<dd><p>A skewed Voigt model, modified using a skewed normal distribution.</p>
<p>The model has five Parameters <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>gamma</cite> (<span class="math notranslate nohighlight">\(\gamma\)</span>),
as usual for a Voigt distribution, and adds a new Parameter <cite>skew</cite>.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma, \rm{skew}) = {\rm{Voigt}}(x; A, \mu, \sigma, \gamma)
\Bigl\{ 1 + {\operatorname{erf}}\bigl[
\frac{{\rm{skew}}(x-\mu)}{\sigma\sqrt{2}}
\bigr] \Bigr\}\]</div>
<p>where <code class="xref py py-func docutils literal notranslate"><span class="pre">erf()</span></code> is the error function.</p>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Skew_normal_distribution">https://en.wikipedia.org/wiki/Skew_normal_distribution</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="thermaldistributionmodel">
<h3><a class="reference internal" href="#lmfit.models.ThermalDistributionModel" title="lmfit.models.ThermalDistributionModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThermalDistributionModel</span></code></a><a class="headerlink" href="#thermaldistributionmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.ThermalDistributionModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ThermalDistributionModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">form</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'bose'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.ThermalDistributionModel" title="Link to this definition">¶</a></dt>
<dd><p>Return a thermal distribution function.</p>
<p>Variable <cite>form</cite> defines the kind of distribution as below with three
Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite> (<span class="math notranslate nohighlight">\(x_0\)</span>), and <cite>kt</cite>
(<span class="math notranslate nohighlight">\(kt\)</span>). The following distributions are available:</p>
<ul class="simple">
<li><p><cite>‘bose’</cite> : Bose-Einstein distribution (default)</p></li>
<li><p><cite>‘maxwell’</cite> : Maxwell-Boltzmann distribution</p></li>
<li><p><cite>‘fermi’</cite> : Fermi-Dirac distribution</p></li>
</ul>
<p>The functional forms are defined as:</p>
<div class="math notranslate nohighlight">
\begin{eqnarray*}
&amp; f(x; A, x_0, kt, {\mathrm{form={}'bose{}'}}) &amp; = \frac{1}{A \exp(\frac{x - x_0}{kt}) - 1} \\
&amp; f(x; A, x_0, kt, {\mathrm{form={}'maxwell{}'}}) &amp; = \frac{1}{A \exp(\frac{x - x_0}{kt})} \\
&amp; f(x; A, x_0, kt, {\mathrm{form={}'fermi{}'}}) &amp; = \frac{1}{A \exp(\frac{x - x_0}{kt}) + 1} ]
\end{eqnarray*}</div><p class="rubric">Notes</p>
<ul class="simple">
<li><p><cite>kt</cite> should be defined in the same units as <cite>x</cite> (<span class="math notranslate nohighlight">\(k_B =
8.617\times10^{-5}\)</span> eV/K).</p></li>
<li><p>set <span class="math notranslate nohighlight">\(kt&lt;0\)</span> to implement the energy loss convention common in
scattering research.</p></li>
</ul>
<p>For more information, see:
<a class="reference external" href="http://hyperphysics.phy-astr.gsu.edu/hbase/quantum/disfcn.html">http://hyperphysics.phy-astr.gsu.edu/hbase/quantum/disfcn.html</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="doniachmodel">
<h3><a class="reference internal" href="#lmfit.models.DoniachModel" title="lmfit.models.DoniachModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">DoniachModel</span></code></a><a class="headerlink" href="#doniachmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.DoniachModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DoniachModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.DoniachModel" title="Link to this definition">¶</a></dt>
<dd><p>A model of an Doniach Sunjic asymmetric lineshape.</p>
<p>This model is used in photo-emission and has four Parameters:
<cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite> (<span class="math notranslate nohighlight">\(\mu\)</span>), <cite>sigma</cite>
(<span class="math notranslate nohighlight">\(\sigma\)</span>), and <cite>gamma</cite> (<span class="math notranslate nohighlight">\(\gamma\)</span>). In addition, parameter
<cite>height</cite> is included as a constraint to report maximum peak height.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \mu, \sigma, \gamma) = \frac{A}{\sigma^{1-\gamma}}
\frac{\cos\bigl[\pi\gamma/2 + (1-\gamma)
\arctan{((x - \mu)}/\sigma)\bigr]} {\bigr[1 + (x-\mu)/\sigma\bigl]^{(1-\gamma)/2}}\]</div>
<p>For more information, see:
<a class="reference external" href="https://www.casaxps.com/help_manual/line_shapes.htm">https://www.casaxps.com/help_manual/line_shapes.htm</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
</section>
<section id="linear-and-polynomial-models">
<h2>Linear and Polynomial Models<a class="headerlink" href="#linear-and-polynomial-models" title="Link to this heading">¶</a></h2>
<p>These models correspond to polynomials of some degree. Of course, lmfit is
a very inefficient way to do linear regression (see <a class="reference external" href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html">numpy.polyfit</a>
or <a class="reference external" href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html">scipy.stats.linregress</a>), but these models may be useful as one
of many components of a composite model.  The SplineModel below corresponds
to a cubic spline.</p>
<section id="constantmodel">
<h3><a class="reference internal" href="#lmfit.models.ConstantModel" title="lmfit.models.ConstantModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConstantModel</span></code></a><a class="headerlink" href="#constantmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.ConstantModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ConstantModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.ConstantModel" title="Link to this definition">¶</a></dt>
<dd><p>Constant model, with a single Parameter: <cite>c</cite>.</p>
<p>Note that this is ‘constant’ in the sense of having no dependence on
the independent variable <cite>x</cite>, not in the sense of being non-varying.
To be clear, <cite>c</cite> will be a Parameter that will be varied in the fit
(by default, of course).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="linearmodel">
<h3><a class="reference internal" href="#lmfit.models.LinearModel" title="lmfit.models.LinearModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LinearModel</span></code></a><a class="headerlink" href="#linearmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.LinearModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">LinearModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.LinearModel" title="Link to this definition">¶</a></dt>
<dd><p>Linear model, with two Parameters: <cite>intercept</cite> and <cite>slope</cite>.</p>
<p>Defined as:</p>
<div class="math notranslate nohighlight">
\[f(x; m, b) = m x + b\]</div>
<p>with <cite>slope</cite> for <span class="math notranslate nohighlight">\(m\)</span> and <cite>intercept</cite> for <span class="math notranslate nohighlight">\(b\)</span>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="quadraticmodel">
<h3><a class="reference internal" href="#lmfit.models.QuadraticModel" title="lmfit.models.QuadraticModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">QuadraticModel</span></code></a><a class="headerlink" href="#quadraticmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.QuadraticModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">QuadraticModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.QuadraticModel" title="Link to this definition">¶</a></dt>
<dd><p>A quadratic model, with three Parameters: <cite>a</cite>, <cite>b</cite>, and <cite>c</cite>.</p>
<p>Defined as:</p>
<div class="math notranslate nohighlight">
\[f(x; a, b, c) = a x^2 + b x + c\]</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="polynomialmodel">
<h3><a class="reference internal" href="#lmfit.models.PolynomialModel" title="lmfit.models.PolynomialModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PolynomialModel</span></code></a><a class="headerlink" href="#polynomialmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.PolynomialModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PolynomialModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">degree</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">7</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.PolynomialModel" title="Link to this definition">¶</a></dt>
<dd><p>A polynomial model with up to 7 Parameters, specified by <cite>degree</cite>.</p>
<div class="math notranslate nohighlight">
\[f(x; c_0, c_1, \ldots, c_7) = \sum_{i=0, 7} c_i x^i\]</div>
<p>with parameters <cite>c0</cite>, <cite>c1</cite>, …, <cite>c7</cite>. The supplied <cite>degree</cite> will
specify how many of these are actual variable parameters. This uses
<a class="reference external" href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html">numpy.polyval</a> for its calculation of the polynomial.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="splinelmodel">
<h3><code class="xref py py-class docutils literal notranslate"><span class="pre">SplinelModel</span></code><a class="headerlink" href="#splinelmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.SplineModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SplineModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xknots</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.SplineModel" title="Link to this definition">¶</a></dt>
<dd><p>A 1-D cubic spline model with a variable number of <cite>knots</cite> and
parameters <cite>s0</cite>, <cite>s1</cite>, …, <cite>sN</cite>, for <cite>N</cite> knots.</p>
<p>The user must supply a list or ndarray <cite>xknots</cite>: the <cite>x</cite> values for the
‘knots’ which control the flexibility of the spline function.</p>
<p>The parameters <cite>s0</cite>, …, <cite>sN</cite> (where <cite>N</cite> is the size of <cite>xknots</cite>) will
correspond to the <cite>y</cite> values for the spline knots at the <cite>x=xknots</cite>
positions where the highest order derivative will be discontinuous.
The resulting curve will not necessarily pass through these knot
points, but for finely-spaced knots, the spline parameter values will
be very close to the <cite>y</cite> values of the resulting curve.</p>
<p>The maximum number of knots supported is 300.</p>
<p>Using the <cite>guess()</cite> method to initialize parameter values is highly
recommended.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>xknots</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of floats or <code class="xref py py-obj docutils literal notranslate"><span class="pre">ndarray</span></code>, required) – x-values of knots for spline.</p></li>
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<ol class="arabic">
<li><p>There must be at least 4 knot points, and not more than 300.</p></li>
<li><dl>
<dt><cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in</dt><dd><blockquote>
<div><p>the data. Should be one of:</p>
</div></blockquote>
<ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</dd>
</dl>
</li>
</ol>
</dd></dl>

</section>
</section>
<section id="periodic-models">
<h2>Periodic Models<a class="headerlink" href="#periodic-models" title="Link to this heading">¶</a></h2>
<p>These models correspond to periodic functions.</p>
<section id="sinemodel">
<h3><a class="reference internal" href="#lmfit.models.SineModel" title="lmfit.models.SineModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SineModel</span></code></a><a class="headerlink" href="#sinemodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.SineModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SineModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.SineModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a sinusoidal lineshape.</p>
<p>The model has three Parameters: <cite>amplitude</cite>, <cite>frequency</cite>, and <cite>shift</cite>.</p>
<div class="math notranslate nohighlight">
\[f(x; A, \phi, f) = A \sin (f x + \phi)\]</div>
<p>where the parameter <cite>amplitude</cite> corresponds to <span class="math notranslate nohighlight">\(A\)</span>, <cite>frequency</cite> to
<span class="math notranslate nohighlight">\(f\)</span>, and <cite>shift</cite> to <span class="math notranslate nohighlight">\(\phi\)</span>. All are constrained to be
non-negative, and <cite>shift</cite> additionally to be smaller than <span class="math notranslate nohighlight">\(2\pi\)</span>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
</section>
<section id="step-like-models">
<h2>Step-like models<a class="headerlink" href="#step-like-models" title="Link to this heading">¶</a></h2>
<p>Two models represent step-like functions, and share many characteristics.</p>
<section id="stepmodel">
<h3><a class="reference internal" href="#lmfit.models.StepModel" title="lmfit.models.StepModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">StepModel</span></code></a><a class="headerlink" href="#stepmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.StepModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">StepModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">form</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'linear'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.StepModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Step function.</p>
<p>The model has three Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center</cite>
(<span class="math notranslate nohighlight">\(\mu\)</span>), and <cite>sigma</cite> (<span class="math notranslate nohighlight">\(\sigma\)</span>).</p>
<p>There are four choices for <cite>form</cite>:</p>
<ul class="simple">
<li><p><cite>‘linear’</cite> (default)</p></li>
<li><p><cite>‘atan’</cite> or <cite>‘arctan’</cite> for an arc-tangent function</p></li>
<li><p><cite>‘erf’</cite> for an error function</p></li>
<li><p><cite>‘logistic’</cite> for a logistic function (for more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Logistic_function">https://en.wikipedia.org/wiki/Logistic_function</a>)</p></li>
</ul>
<p>The step function starts with a value 0 and ends with a value of
<span class="math notranslate nohighlight">\(A\)</span> rising to <span class="math notranslate nohighlight">\(A/2\)</span> at <span class="math notranslate nohighlight">\(\mu\)</span>, with <span class="math notranslate nohighlight">\(\sigma\)</span>
setting the characteristic width. The functional forms are defined as:</p>
<div class="math notranslate nohighlight">
\begin{eqnarray*}
&amp; f(x; A, \mu, \sigma, {\mathrm{form={}'linear{}'}})  &amp; = A \min{[1, \max{(0, \alpha + 1/2)}]} \\
&amp; f(x; A, \mu, \sigma, {\mathrm{form={}'arctan{}'}})  &amp; = A [1/2 + \arctan{(\alpha)}/{\pi}] \\
&amp; f(x; A, \mu, \sigma, {\mathrm{form={}'erf{}'}})     &amp; = A [1 + {\operatorname{erf}}(\alpha)]/2 \\
&amp; f(x; A, \mu, \sigma, {\mathrm{form={}'logistic{}'}})&amp; = A \left[1 - \frac{1}{1 + e^{\alpha}} \right]
\end{eqnarray*}</div><p>where <span class="math notranslate nohighlight">\(\alpha = (x - \mu)/{\sigma}\)</span>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="rectanglemodel">
<h3><a class="reference internal" href="#lmfit.models.RectangleModel" title="lmfit.models.RectangleModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">RectangleModel</span></code></a><a class="headerlink" href="#rectanglemodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.RectangleModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">RectangleModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">form</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'linear'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.RectangleModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Step-up and Step-down function.</p>
<p>The model has five Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>), <cite>center1</cite>
(<span class="math notranslate nohighlight">\(\mu_1\)</span>), <cite>center2</cite> (<span class="math notranslate nohighlight">\(\mu_2\)</span>), <cite>sigma1</cite>
(<span class="math notranslate nohighlight">\(\sigma_1\)</span>), and <cite>sigma2</cite> (<span class="math notranslate nohighlight">\(\sigma_2\)</span>).</p>
<p>There are four choices for <cite>form</cite>, which is used for both the Step up
and the Step down:</p>
<ul class="simple">
<li><p><cite>‘linear’</cite> (default)</p></li>
<li><p><cite>‘atan’</cite> or <cite>‘arctan’</cite> for an arc-tangent function</p></li>
<li><p><cite>‘erf’</cite> for an error function</p></li>
<li><p><cite>‘logistic’</cite> for a logistic function (for more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Logistic_function">https://en.wikipedia.org/wiki/Logistic_function</a>)</p></li>
</ul>
<p>The function starts with a value 0 and transitions to a value of
<span class="math notranslate nohighlight">\(A\)</span>, taking the value <span class="math notranslate nohighlight">\(A/2\)</span> at <span class="math notranslate nohighlight">\(\mu_1\)</span>, with
<span class="math notranslate nohighlight">\(\sigma_1\)</span> setting the characteristic width. The function then
transitions again to the value <span class="math notranslate nohighlight">\(A/2\)</span> at <span class="math notranslate nohighlight">\(\mu_2\)</span>, with
<span class="math notranslate nohighlight">\(\sigma_2\)</span> setting the characteristic width. The functional
forms are defined as:</p>
<div class="math notranslate nohighlight">
\begin{eqnarray*}
&amp;f(x; A, \mu, \sigma, {\mathrm{form={}'linear{}'}})   &amp;= A \{ \min{[1, \max{(-1, \alpha_1)}]} + \min{[1, \max{(-1, \alpha_2)}]} \}/2 \\
&amp;f(x; A, \mu, \sigma, {\mathrm{form={}'arctan{}'}})   &amp;= A [\arctan{(\alpha_1)} + \arctan{(\alpha_2)}]/{\pi} \\
&amp;f(x; A, \mu, \sigma, {\mathrm{form={}'erf{}'}})      &amp;= A \left[{\operatorname{erf}}(\alpha_1) + {\operatorname{erf}}(\alpha_2)\right]/2 \\
&amp;f(x; A, \mu, \sigma, {\mathrm{form={}'logistic{}'}}) &amp;= A \left[1 - \frac{1}{1 + e^{\alpha_1}} - \frac{1}{1 + e^{\alpha_2}} \right]
\end{eqnarray*}</div><p>where <span class="math notranslate nohighlight">\(\alpha_1 = (x - \mu_1)/{\sigma_1}\)</span> and
<span class="math notranslate nohighlight">\(\alpha_2 = -(x - \mu_2)/{\sigma_2}\)</span>.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
</section>
<section id="exponential-and-power-law-models">
<h2>Exponential and Power law models<a class="headerlink" href="#exponential-and-power-law-models" title="Link to this heading">¶</a></h2>
<section id="exponentialmodel">
<h3><a class="reference internal" href="#lmfit.models.ExponentialModel" title="lmfit.models.ExponentialModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExponentialModel</span></code></a><a class="headerlink" href="#exponentialmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.ExponentialModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ExponentialModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.ExponentialModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on an exponential decay function.</p>
<p>The model has two Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>) and <cite>decay</cite>
(<span class="math notranslate nohighlight">\(\tau\)</span>) and is defined as:</p>
<div class="math notranslate nohighlight">
\[f(x; A, \tau) = A e^{-x/\tau}\]</div>
<p>For more information, see:
<a class="reference external" href="https://en.wikipedia.org/wiki/Exponential_decay">https://en.wikipedia.org/wiki/Exponential_decay</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
<section id="powerlawmodel">
<h3><a class="reference internal" href="#lmfit.models.PowerLawModel" title="lmfit.models.PowerLawModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PowerLawModel</span></code></a><a class="headerlink" href="#powerlawmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.PowerLawModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PowerLawModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.PowerLawModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a Power Law.</p>
<p>The model has two Parameters: <cite>amplitude</cite> (<span class="math notranslate nohighlight">\(A\)</span>) and <cite>exponent</cite>
(<span class="math notranslate nohighlight">\(k\)</span>) and is defined as:</p>
<div class="math notranslate nohighlight">
\[f(x; A, k) = A x^k\]</div>
<p>For more information, see: <a class="reference external" href="https://en.wikipedia.org/wiki/Power_law">https://en.wikipedia.org/wiki/Power_law</a></p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
</section>
<section id="two-dimensional-peak-like-models">
<h2>Two dimensional Peak-like models<a class="headerlink" href="#two-dimensional-peak-like-models" title="Link to this heading">¶</a></h2>
<p>The one example of a two-dimensional peak is a two-dimensional Gaussian.</p>
<section id="gaussian2dmodel">
<h3><a class="reference internal" href="#lmfit.models.Gaussian2dModel" title="lmfit.models.Gaussian2dModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">Gaussian2dModel</span></code></a><a class="headerlink" href="#gaussian2dmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.Gaussian2dModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Gaussian2dModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">['x',</span> <span class="pre">'y']</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.Gaussian2dModel" title="Link to this definition">¶</a></dt>
<dd><p>A model based on a two-dimensional Gaussian function.</p>
<p>The model has two independent variables <cite>x</cite> and <cite>y</cite> and five
Parameters: <cite>amplitude</cite>, <cite>centerx</cite>, <cite>sigmax</cite>, <cite>centery</cite>, and <cite>sigmay</cite>.
In addition, parameters <cite>fwhmx</cite>, <cite>fwhmy</cite>, and <cite>height</cite> are included as
constraints to report the maximum peak height and the two full width
at half maxima, respectively.</p>
<div class="math notranslate nohighlight">
\[f(x, y; A, \mu_x, \sigma_x, \mu_y, \sigma_y) =
A g(x; A=1, \mu_x, \sigma_x) g(y; A=1, \mu_y, \sigma_y)\]</div>
<p>where subfunction <span class="math notranslate nohighlight">\(g(x; A, \mu, \sigma)\)</span> is a Gaussian lineshape:</p>
<div class="math notranslate nohighlight">
\[g(x; A, \mu, \sigma) =
\frac{A}{\sigma\sqrt{2\pi}} e^{[{-{(x-\mu)^2}/{{2\sigma}^2}}]}.\]</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a>, optional) – Arguments to the model function that are independent variables
default is [‘x’, ‘y’]).</p></li>
<li><p><strong>prefix</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em>, </em><em>optional</em>) – String to prepend to parameter names, needed to add two Models
that have parameter names in common.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise'</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kwargs</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>1. <cite>nan_policy</cite> sets what to do when a NaN or missing value is seen in
the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</dd></dl>

</section>
</section>
<section id="user-defined-models">
<h2>User-defined Models<a class="headerlink" href="#user-defined-models" title="Link to this heading">¶</a></h2>
<p>As shown in the previous chapter (<a class="reference internal" href="model.html#model-chapter"><span class="std std-ref">Modeling Data and Curve Fitting</span></a>), it is fairly
straightforward to build fitting models from parametrized Python functions.
The number of model classes listed so far in the present chapter should
make it clear that this process is not too difficult. Still, it is
sometimes desirable to build models from a user-supplied function. This
may be especially true if model-building is built-in to some larger library
or application for fitting in which the user may not be able to easily
build and use a new model from Python code.</p>
<p>The <a class="reference internal" href="#lmfit.models.ExpressionModel" title="lmfit.models.ExpressionModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a> allows a model to be built from a
user-supplied expression. This uses the <a class="reference external" href="https://newville.github.io/asteval/">asteval</a> module also used for
mathematical constraints as discussed in <a class="reference internal" href="constraints.html#constraints-chapter"><span class="std std-ref">Using Mathematical Constraints</span></a>.</p>
<section id="expressionmodel">
<h3><a class="reference internal" href="#lmfit.models.ExpressionModel" title="lmfit.models.ExpressionModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a><a class="headerlink" href="#expressionmodel" title="Link to this heading">¶</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="lmfit.models.ExpressionModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ExpressionModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">expr</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">independent_vars</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">init_script</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nan_policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'raise'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kws</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#lmfit.models.ExpressionModel" title="Link to this definition">¶</a></dt>
<dd><p>ExpressionModel class.</p>
<p>Generate a model from user-supplied expression.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>expr</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – Mathematical expression for model.</p></li>
<li><p><strong>independent_vars</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></a> of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">str</span></code></a> or None, optional) – Variable names to use as independent variables.</p></li>
<li><p><strong>init_script</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a><em> or </em><em>None</em><em>, </em><em>optional</em>) – Initial script to run in asteval interpreter.</p></li>
<li><p><strong>nan_policy</strong> (<em>{'raise</em><em>, </em><em>'propagate'</em><em>, </em><em>'omit'}</em><em>, </em><em>optional</em>) – How to handle NaN and missing values in data. See Notes below.</p></li>
<li><p><strong>**kws</strong> (<em>optional</em>) – Keyword arguments to pass to <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code>.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<ol class="arabic">
<li><p>each instance of ExpressionModel will create and use its own
version of an asteval interpreter.</p></li>
<li><p><cite>prefix</cite> is <strong>not supported</strong> for ExpressionModel.</p></li>
<li><p><cite>nan_policy</cite> sets what to do when a NaN or missing value is
seen in the data. Should be one of:</p>
<blockquote>
<div><ul class="simple">
<li><p><cite>‘raise’</cite> : raise a <cite>ValueError</cite> (default)</p></li>
<li><p><cite>‘propagate’</cite> : do nothing</p></li>
<li><p><cite>‘omit’</cite> : drop missing data</p></li>
</ul>
</div></blockquote>
</li>
</ol>
</dd></dl>

<p>Since the point of this model is that an arbitrary expression will be
supplied, the determination of what are the parameter names for the model
happens when the model is created. To do this, the expression is parsed,
and all symbol names are found. Names that are already known (there are
over 500 function and value names in the asteval namespace, including most
Python built-ins, more than 200 functions inherited from NumPy, and more
than 20 common lineshapes defined in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">lineshapes</span></code> module) are not
converted to parameters. Unrecognized names are expected to be names of either
parameters or independent variables. If <code class="docutils literal notranslate"><span class="pre">independent_vars</span></code> is the
default value of <code class="docutils literal notranslate"><span class="pre">None</span></code>, and if the expression contains a variable named
<code class="docutils literal notranslate"><span class="pre">x</span></code>, that will be used as the independent variable. Otherwise,
<code class="docutils literal notranslate"><span class="pre">independent_vars</span></code> must be given.</p>
<p>For example, if one creates an <a class="reference internal" href="#lmfit.models.ExpressionModel" title="lmfit.models.ExpressionModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a> as:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">ExpressionModel</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">ExpressionModel</span><span class="p">(</span><span class="s1">&#39;off + amp * exp(-x/x0) * sin(x*phase)&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>The name <code class="docutils literal notranslate"><span class="pre">exp</span></code> will be recognized as the exponent function, so the model
will be interpreted to have parameters named <code class="docutils literal notranslate"><span class="pre">off</span></code>, <code class="docutils literal notranslate"><span class="pre">amp</span></code>, <code class="docutils literal notranslate"><span class="pre">x0</span></code> and
<code class="docutils literal notranslate"><span class="pre">phase</span></code>. In addition, <code class="docutils literal notranslate"><span class="pre">x</span></code> will be assumed to be the sole independent variable.
In general, there is no obvious way to set default parameter values or
parameter hints for bounds, so this will have to be handled explicitly.</p>
<p>To evaluate this model, you might do the following:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">exp</span><span class="p">,</span> <span class="n">linspace</span><span class="p">,</span> <span class="n">sin</span>

<span class="n">x</span> <span class="o">=</span> <span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">501</span><span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">make_params</span><span class="p">(</span><span class="n">off</span><span class="o">=</span><span class="mf">0.25</span><span class="p">,</span> <span class="n">amp</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">x0</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">phase</span><span class="o">=</span><span class="mf">0.04</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>While many custom models can be built with a single line expression
(especially since the names of the lineshapes like <code class="docutils literal notranslate"><span class="pre">gaussian</span></code>, <code class="docutils literal notranslate"><span class="pre">lorentzian</span></code>
and so on, as well as many NumPy functions, are available), more complex
models will inevitably require multiple line functions. You can include
such Python code with the <code class="docutils literal notranslate"><span class="pre">init_script</span></code> argument. The text of this script
is evaluated when the model is initialized (and before the actual
expression is parsed), so that you can define functions to be used
in your expression.</p>
<p>As a probably unphysical example, to make a model that is the derivative of
a Gaussian function times the logarithm of a Lorentzian function you may
could to define this in a script:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">script</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">def mycurve(x, amp, cen, sig):</span>
<span class="s2">    loren = lorentzian(x, amplitude=amp, center=cen, sigma=sig)</span>
<span class="s2">    gauss = gaussian(x, amplitude=amp, center=cen, sigma=sig)</span>
<span class="s2">    return log(loren) * gradient(gauss) / gradient(x)</span>
<span class="s2">&quot;&quot;&quot;</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>and then use this with <a class="reference internal" href="#lmfit.models.ExpressionModel" title="lmfit.models.ExpressionModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExpressionModel</span></code></a> as:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">mod</span> <span class="o">=</span> <span class="n">ExpressionModel</span><span class="p">(</span><span class="s1">&#39;mycurve(x, height, mid, wid)&#39;</span><span class="p">,</span> <span class="n">init_script</span><span class="o">=</span><span class="n">script</span><span class="p">,</span>
                      <span class="n">independent_vars</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;x&#39;</span><span class="p">])</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>As above, this will interpret the parameter names to be <code class="docutils literal notranslate"><span class="pre">height</span></code>, <code class="docutils literal notranslate"><span class="pre">mid</span></code>,
and <code class="docutils literal notranslate"><span class="pre">wid</span></code>, and build a model that can be used to fit data.</p>
</section>
</section>
<section id="example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profiles">
<h2>Example 1: Fit Peak data to Gaussian, Lorentzian, and Voigt profiles<a class="headerlink" href="#example-1-fit-peak-data-to-gaussian-lorentzian-and-voigt-profiles" title="Link to this heading">¶</a></h2>
<p>Here, we will fit data to three similar lineshapes, in order to decide which
might be the better model. We will start with a Gaussian profile, as in
the previous chapter, but use the built-in <a class="reference internal" href="#lmfit.models.GaussianModel" title="lmfit.models.GaussianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">GaussianModel</span></code></a> instead
of writing one ourselves. This is a slightly different version from the
one in previous example in that the parameter names are different, and have
built-in default values. We will simply use:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">loadtxt</span>

<span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">GaussianModel</span>

<span class="n">data</span> <span class="o">=</span> <span class="n">loadtxt</span><span class="p">(</span><span class="s1">&#39;test_peak.dat&#39;</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">GaussianModel</span><span class="p">()</span>

<span class="n">pars</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">pars</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">fit_report</span><span class="p">(</span><span class="n">min_correl</span><span class="o">=</span><span class="mf">0.25</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>which prints out the results:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    Model(gaussian)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 25
    # data points      = 401
    # variables        = 3
    chi-square         = 29.9943157
    reduced chi-square = 0.07536260
    Akaike info crit   = -1033.77437
    Bayesian info crit = -1021.79248
    R-squared          = 0.99045513
[[Variables]]
    amplitude:  30.3135789 +/- 0.15712752 (0.52%) (init = 43.62238)
    center:     9.24277046 +/- 0.00737497 (0.08%) (init = 9.25)
    sigma:      1.23218496 +/- 0.00737506 (0.60%) (init = 1.35)
    fwhm:       2.90157379 +/- 0.01736695 (0.60%) == &#39;2.3548200*sigma&#39;
    height:     9.81457271 +/- 0.05087308 (0.52%) == &#39;0.3989423*amplitude/max(1e-15, sigma)&#39;
[[Correlations]] (unreported correlations are &lt; 0.250)
    C(amplitude, sigma) = +0.5774
</pre></div>
</div>
</div>
</div>
<p>We see a few interesting differences from the results of the previous
chapter. First, the parameter names are longer. Second, there are <code class="docutils literal notranslate"><span class="pre">fwhm</span></code>
and <code class="docutils literal notranslate"><span class="pre">height</span></code> parameters, to give the full-width-at-half-maximum and
maximum peak height, respectively. And third, the automated initial guesses
are pretty good. A plot of the fit:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_7_0.svg" src="_images/builtin_models_7_0.svg" /></div>
</div>
<p>shows a decent match to the data – the fit worked with no explicit setting
of initial parameter values. Looking more closely, the fit is not perfect,
especially in the tails of the peak, suggesting that a different peak
shape, with longer tails, should be used. Perhaps a Lorentzian would be
better? To do this, we simply replace <code class="docutils literal notranslate"><span class="pre">GaussianModel</span></code> with
<code class="docutils literal notranslate"><span class="pre">LorentzianModel</span></code> to get a <a class="reference internal" href="#lmfit.models.LorentzianModel" title="lmfit.models.LorentzianModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">LorentzianModel</span></code></a>:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">LorentzianModel</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">LorentzianModel</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>with the rest of the script as above. Perhaps predictably, the first thing
we try gives results that are worse by comparing the fit statistics:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    Model(lorentzian)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 25
    # data points      = 401
    # variables        = 3
    chi-square         = 53.7535387
    reduced chi-square = 0.13505914
    Akaike info crit   = -799.830322
    Bayesian info crit = -787.848438
    R-squared          = 0.98289441
[[Variables]]
    amplitude:  38.9726380 +/- 0.31386754 (0.81%) (init = 54.52798)
    center:     9.24439393 +/- 0.00927645 (0.10%) (init = 9.25)
    sigma:      1.15483177 +/- 0.01315708 (1.14%) (init = 1.35)
    fwhm:       2.30966354 +/- 0.02631416 (1.14%) == &#39;2.0000000*sigma&#39;
    height:     10.7421504 +/- 0.08634317 (0.80%) == &#39;0.3183099*amplitude/max(1e-15, sigma)&#39;
[[Correlations]] (unreported correlations are &lt; 0.250)
    C(amplitude, sigma) = +0.7087
</pre></div>
</div>
</div>
</div>
<p>and also by visual inspection of the fit to the data (figure below).</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_10_0.svg" src="_images/builtin_models_10_0.svg" /></div>
</div>
<p>The tails are now too big, and the value for <span class="math notranslate nohighlight">\(\chi^2\)</span> almost doubled.
A Voigt model does a better job. Using <a class="reference internal" href="#lmfit.models.VoigtModel" title="lmfit.models.VoigtModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">VoigtModel</span></code></a>, this is as simple as using:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">VoigtModel</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">VoigtModel</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>with all the rest of the script as above. This gives:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    Model(voigt)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 25
    # data points      = 401
    # variables        = 3
    chi-square         = 14.5448627
    reduced chi-square = 0.03654488
    Akaike info crit   = -1324.00615
    Bayesian info crit = -1312.02427
    R-squared          = 0.99537150
[[Variables]]
    amplitude:  35.7553799 +/- 0.13861559 (0.39%) (init = 65.43358)
    center:     9.24411179 +/- 0.00505496 (0.05%) (init = 9.25)
    sigma:      0.73015485 +/- 0.00368473 (0.50%) (init = 0.8775)
    gamma:      0.73015485 +/- 0.00368473 (0.50%) == &#39;sigma&#39;
    fwhm:       2.62949983 +/- 0.01326979 (0.50%) == &#39;1.0692*gamma+sqrt(0.8664*gamma**2+5.545083*sigma**2)&#39;
    height:     10.2204068 +/- 0.03959933 (0.39%) == &#39;(amplitude/(max(1e-15, sigma*sqrt(2*pi))))*real(wofz((1j*gamma)/(max(1e-15, sigma*sqrt(2)))))&#39;
[[Correlations]] (unreported correlations are &lt; 0.250)
    C(amplitude, sigma) = +0.6513
</pre></div>
</div>
</div>
</div>
<p>which has a much better value for <span class="math notranslate nohighlight">\(\chi^2\)</span> and the other
goodness-of-fit measures, and an obviously better match to the data as seen
in the figure below (left).</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_13_0.svg" src="_images/builtin_models_13_0.svg" /></div>
</div>
<p>Fit to peak with Voigt model (left) and Voigt model with <code class="docutils literal notranslate"><span class="pre">gamma</span></code>
varying independently of <code class="docutils literal notranslate"><span class="pre">sigma</span></code> (right).</p>
<p>Can we do better? The Voigt function has a <span class="math notranslate nohighlight">\(\gamma\)</span> parameter
(<code class="docutils literal notranslate"><span class="pre">gamma</span></code>) that can be distinct from <code class="docutils literal notranslate"><span class="pre">sigma</span></code>. The default behavior used
above constrains <code class="docutils literal notranslate"><span class="pre">gamma</span></code> to have exactly the same value as <code class="docutils literal notranslate"><span class="pre">sigma</span></code>. If
we allow these to vary separately, does the fit improve? To do this, we
have to change the <code class="docutils literal notranslate"><span class="pre">gamma</span></code> parameter from a constrained expression and
give it a starting value using something like:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">mod</span> <span class="o">=</span> <span class="n">VoigtModel</span><span class="p">()</span>
<span class="n">pars</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
<span class="n">pars</span><span class="p">[</span><span class="s1">&#39;gamma&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">vary</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">expr</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>which gives:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    Model(voigt)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 26
    # data points      = 401
    # variables        = 4
    chi-square         = 10.9301767
    reduced chi-square = 0.02753193
    Akaike info crit   = -1436.57602
    Bayesian info crit = -1420.60017
    R-squared          = 0.99652177
[[Variables]]
    amplitude:  34.1914716 +/- 0.17946974 (0.52%) (init = 65.43358)
    center:     9.24374846 +/- 0.00441904 (0.05%) (init = 9.25)
    sigma:      0.89518951 +/- 0.01415479 (1.58%) (init = 0.8775)
    gamma:      0.52540156 +/- 0.01857994 (3.54%) (init = 0.7)
    fwhm:       2.72573678 +/- 0.01363994 (0.50%) == &#39;1.0692*gamma+sqrt(0.8664*gamma**2+5.545083*sigma**2)&#39;
    height:     10.0872197 +/- 0.03482126 (0.35%) == &#39;(amplitude/(max(1e-15, sigma*sqrt(2*pi))))*real(wofz((1j*gamma)/(max(1e-15, sigma*sqrt(2)))))&#39;
[[Correlations]] (unreported correlations are &lt; 0.250)
    C(sigma, gamma)     = -0.9285
    C(amplitude, gamma) = +0.8210
    C(amplitude, sigma) = -0.6512
</pre></div>
</div>
</div>
</div>
<p>and the fit shown on the right above.</p>
<p>Comparing the two fits with the Voigt function, we see that <span class="math notranslate nohighlight">\(\chi^2\)</span>
is definitely improved with a separately varying <code class="docutils literal notranslate"><span class="pre">gamma</span></code> parameter. In
addition, the two values for <code class="docutils literal notranslate"><span class="pre">gamma</span></code> and <code class="docutils literal notranslate"><span class="pre">sigma</span></code> differ significantly
– well outside the estimated uncertainties. More compelling, reduced
<span class="math notranslate nohighlight">\(\chi^2\)</span> is improved even though a fourth variable has been added to
the fit. In the simplest statistical sense, this suggests that <code class="docutils literal notranslate"><span class="pre">gamma</span></code>
is a significant variable in the model. In addition, we can use both the
Akaike or Bayesian Information Criteria (see
<a class="reference internal" href="fitting.html#information-criteria-label"><span class="std std-ref">Akaike and Bayesian Information Criteria</span></a>) to assess how likely the model with
variable <code class="docutils literal notranslate"><span class="pre">gamma</span></code> is to explain the data than the model with <code class="docutils literal notranslate"><span class="pre">gamma</span></code>
fixed to the value of <code class="docutils literal notranslate"><span class="pre">sigma</span></code>. According to theory,
<span class="math notranslate nohighlight">\(\exp(-(\rm{AIC1}-\rm{AIC0})/2)\)</span> gives the probability that a model with
AIC1 is more likely than a model with AIC0. For the two models here, with
AIC values of -1436 and -1324 (Note: if we had more carefully set the value
for <code class="docutils literal notranslate"><span class="pre">weights</span></code> based on the noise in the data, these values might be
positive, but there difference would be roughly the same), this says that
the model with <code class="docutils literal notranslate"><span class="pre">gamma</span></code> fixed to <code class="docutils literal notranslate"><span class="pre">sigma</span></code> has a probability less than 5.e-25
of being the better model.</p>
</section>
<section id="example-2-fit-data-to-a-composite-model-with-pre-defined-models">
<h2>Example 2: Fit data to a Composite Model with pre-defined models<a class="headerlink" href="#example-2-fit-data-to-a-composite-model-with-pre-defined-models" title="Link to this heading">¶</a></h2>
<p>Here, we repeat the point made at the end of the last chapter that
instances of <a class="reference internal" href="model.html#lmfit.model.Model" title="lmfit.model.Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a> class can be added together to make a
<em>composite model</em>. By using the large number of built-in models available,
it is therefore very simple to build models that contain multiple peaks and
various backgrounds. An example of a simple fit to a noisy step function
plus a constant:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># &lt;examples/doc_builtinmodels_stepmodel.py&gt;</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>

<span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">LinearModel</span><span class="p">,</span> <span class="n">StepModel</span>

<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">201</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones_like</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">y</span><span class="p">[:</span><span class="mi">48</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">y</span><span class="p">[</span><span class="mi">48</span><span class="p">:</span><span class="mi">77</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">77</span><span class="o">-</span><span class="mi">48</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mf">77.0</span><span class="o">-</span><span class="mi">48</span><span class="p">)</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="mf">110.2</span> <span class="o">*</span> <span class="p">(</span><span class="n">y</span> <span class="o">+</span> <span class="mf">9e-3</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">size</span><span class="p">))</span> <span class="o">+</span> <span class="mf">12.0</span> <span class="o">+</span> <span class="mf">2.22</span><span class="o">*</span><span class="n">x</span>

<span class="n">step_mod</span> <span class="o">=</span> <span class="n">StepModel</span><span class="p">(</span><span class="n">form</span><span class="o">=</span><span class="s1">&#39;erf&#39;</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;step_&#39;</span><span class="p">)</span>
<span class="n">line_mod</span> <span class="o">=</span> <span class="n">LinearModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;line_&#39;</span><span class="p">)</span>

<span class="n">pars</span> <span class="o">=</span> <span class="n">line_mod</span><span class="o">.</span><span class="n">make_params</span><span class="p">(</span><span class="n">intercept</span><span class="o">=</span><span class="n">y</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">slope</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">pars</span> <span class="o">+=</span> <span class="n">step_mod</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="mf">2.5</span><span class="p">)</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">step_mod</span> <span class="o">+</span> <span class="n">line_mod</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">pars</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">fit_report</span><span class="p">())</span>

<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">init_fit</span><span class="p">,</span> <span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;initial fit&#39;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">best_fit</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;best fit&#39;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># &lt;end examples/doc_builtinmodels_stepmodel.py&gt;</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>After constructing step-like data, we first create a <a class="reference internal" href="#lmfit.models.StepModel" title="lmfit.models.StepModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">StepModel</span></code></a>
telling it to use the <code class="docutils literal notranslate"><span class="pre">erf</span></code> form (see details above), and a
<a class="reference internal" href="#lmfit.models.ConstantModel" title="lmfit.models.ConstantModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConstantModel</span></code></a>. We set initial values, in one case using the data
and <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess()</span></code> method for the initial step function parameters, and
<code class="xref py py-meth docutils literal notranslate"><span class="pre">make_params()</span></code> arguments for the linear component.
After making a composite model, we run <code class="xref py py-meth docutils literal notranslate"><span class="pre">fit()</span></code> and report the
results, which gives:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    (Model(step, prefix=&#39;step_&#39;, form=&#39;erf&#39;) + Model(linear, prefix=&#39;line_&#39;))
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 37
    # data points      = 201
    # variables        = 5
    chi-square         = 193.096393
    reduced chi-square = 0.98518568
    Akaike info crit   = 1.93680505
    Bayesian info crit = 18.4533296
    R-squared          = 0.99966760
[[Variables]]
    line_slope:      2.08819865 +/- 0.04889098 (2.34%) (init = 0)
    line_intercept:  12.3047194 +/- 0.15345326 (1.25%) (init = 11.58574)
    step_amplitude:  110.940322 +/- 0.32733117 (0.30%) (init = 134.7378)
    step_center:     3.13269691 +/- 0.00272841 (0.09%) (init = 2.5)
    step_sigma:      1.45664264 +/- 0.00913525 (0.63%) (init = 1.428571)
[[Correlations]] (unreported correlations are &lt; 0.100)
    C(line_slope, step_amplitude)  = -0.8588
    C(line_intercept, step_center) = +0.4000
    C(step_amplitude, step_sigma)  = +0.3826
    C(line_slope, line_intercept)  = -0.3823
    C(line_slope, step_sigma)      = -0.3017
    C(line_slope, step_center)     = -0.2217
    C(step_amplitude, step_center) = +0.1015
</pre></div>
</div>
</div>
</div>
<p>with a plot of</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_17_0.svg" src="_images/builtin_models_17_0.svg" /></div>
</div>
</section>
<section id="example-3-fitting-multiple-peaks-and-using-prefixes">
<h2>Example 3: Fitting Multiple Peaks – and using Prefixes<a class="headerlink" href="#example-3-fitting-multiple-peaks-and-using-prefixes" title="Link to this heading">¶</a></h2>
<p>As shown above, many of the models have similar parameter names. For
composite models, this could lead to a problem of having parameters for
different parts of the model having the same name. To overcome this, each
<a class="reference internal" href="model.html#lmfit.model.Model" title="lmfit.model.Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a> can have a <code class="docutils literal notranslate"><span class="pre">prefix</span></code> attribute (normally set to a blank
string) that will be put at the beginning of each parameter name. To
illustrate, we fit one of the classic datasets from the <a class="reference external" href="https://itl.nist.gov/div898/strd/nls/nls_main.shtml">NIST StRD</a> suite
involving a decaying exponential and two Gaussians.</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># &lt;examples/doc_builtinmodels_nistgauss.py&gt;</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>

<span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">ExponentialModel</span><span class="p">,</span> <span class="n">GaussianModel</span>

<span class="n">dat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">loadtxt</span><span class="p">(</span><span class="s1">&#39;NIST_Gauss2.dat&#39;</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">dat</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">dat</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>

<span class="n">exp_mod</span> <span class="o">=</span> <span class="n">ExponentialModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;exp_&#39;</span><span class="p">)</span>
<span class="n">pars</span> <span class="o">=</span> <span class="n">exp_mod</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>

<span class="n">gauss1</span> <span class="o">=</span> <span class="n">GaussianModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;g1_&#39;</span><span class="p">)</span>
<span class="n">pars</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">gauss1</span><span class="o">.</span><span class="n">make_params</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">105</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">75</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">125</span><span class="p">),</span>
                               <span class="n">sigma</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span>
                               <span class="n">amplitude</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">2000</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">)))</span>

<span class="n">gauss2</span> <span class="o">=</span> <span class="n">GaussianModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;g2_&#39;</span><span class="p">)</span>
<span class="n">pars</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">gauss2</span><span class="o">.</span><span class="n">make_params</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">155</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">125</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">175</span><span class="p">),</span>
                               <span class="n">sigma</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span>
                               <span class="n">amplitude</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">2000</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">)))</span>

<span class="n">mod</span> <span class="o">=</span> <span class="n">gauss1</span> <span class="o">+</span> <span class="n">gauss2</span> <span class="o">+</span> <span class="n">exp_mod</span>

<span class="n">init</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">pars</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">fit_report</span><span class="p">(</span><span class="n">correl_mode</span><span class="o">=</span><span class="s1">&#39;table&#39;</span><span class="p">))</span>

<span class="n">fig</span><span class="p">,</span> <span class="n">axes</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mf">12.8</span><span class="p">,</span> <span class="mf">4.8</span><span class="p">))</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">init</span><span class="p">,</span> <span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;initial fit&#39;</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">best_fit</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;best fit&#39;</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>

<span class="n">comps</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">eval_components</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">comps</span><span class="p">[</span><span class="s1">&#39;g1_&#39;</span><span class="p">],</span> <span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Gaussian component 1&#39;</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">comps</span><span class="p">[</span><span class="s1">&#39;g2_&#39;</span><span class="p">],</span> <span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Gaussian component 2&#39;</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">comps</span><span class="p">[</span><span class="s1">&#39;exp_&#39;</span><span class="p">],</span> <span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Exponential component&#39;</span><span class="p">)</span>
<span class="n">axes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>

<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># &lt;end examples/doc_builtinmodels_nistgauss.py&gt;</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>where we give a separate prefix to each model (they all have an
<code class="docutils literal notranslate"><span class="pre">amplitude</span></code> parameter). The <code class="docutils literal notranslate"><span class="pre">prefix</span></code> values are attached transparently
to the models.</p>
<p>Note that the calls to <code class="xref py py-meth docutils literal notranslate"><span class="pre">make_param()</span></code> used the bare name, without the
prefix. We could have used the prefixes, but because we used the
individual model <code class="docutils literal notranslate"><span class="pre">gauss1</span></code> and <code class="docutils literal notranslate"><span class="pre">gauss2</span></code>, there was no need.</p>
<p>Note also in the example here that we explicitly set bounds on many of the
parameter values.</p>
<p>The fit results printed out are:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    ((Model(gaussian, prefix=&#39;g1_&#39;) + Model(gaussian, prefix=&#39;g2_&#39;)) + Model(exponential, prefix=&#39;exp_&#39;))
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 46
    # data points      = 250
    # variables        = 8
    chi-square         = 1247.52821
    reduced chi-square = 5.15507524
    Akaike info crit   = 417.864631
    Bayesian info crit = 446.036318
    R-squared          = 0.99648654
[[Variables]]
    exp_amplitude:  99.0183278 +/- 0.53748593 (0.54%) (init = 162.2102)
    exp_decay:      90.9508853 +/- 1.10310778 (1.21%) (init = 93.24905)
    g1_amplitude:   4257.77360 +/- 42.3836478 (1.00%) (init = 2000)
    g1_center:      107.030956 +/- 0.15006851 (0.14%) (init = 105)
    g1_sigma:       16.6725772 +/- 0.16048381 (0.96%) (init = 15)
    g1_fwhm:        39.2609181 +/- 0.37791049 (0.96%) == &#39;2.3548200*g1_sigma&#39;
    g1_height:      101.880230 +/- 0.59217173 (0.58%) == &#39;0.3989423*g1_amplitude/max(1e-15, g1_sigma)&#39;
    g2_amplitude:   2493.41735 +/- 36.1697789 (1.45%) (init = 2000)
    g2_center:      153.270102 +/- 0.19466802 (0.13%) (init = 155)
    g2_sigma:       13.8069464 +/- 0.18679695 (1.35%) (init = 15)
    g2_fwhm:        32.5128735 +/- 0.43987320 (1.35%) == &#39;2.3548200*g2_sigma&#39;
    g2_height:      72.0455941 +/- 0.61722243 (0.86%) == &#39;0.3989423*g2_amplitude/max(1e-15, g2_sigma)&#39;
[[Correlations]] (unreported correlations are &lt; 0.100)
    C(g1_amplitude, g1_sigma)      = +0.8243
    C(g2_amplitude, g2_sigma)      = +0.8154
    C(exp_amplitude, exp_decay)    = -0.6946
    C(g1_sigma, g2_center)         = +0.6842
    C(g1_center, g2_amplitude)     = -0.6689
    C(g1_center, g2_sigma)         = -0.6520
    C(g1_amplitude, g2_center)     = +0.6477
    C(g1_center, g2_center)        = +0.6205
    C(g1_center, g1_sigma)         = +0.5075
    C(exp_decay, g1_amplitude)     = -0.5074
    C(g1_sigma, g2_amplitude)      = -0.4915
    C(g2_center, g2_sigma)         = -0.4889
    C(g1_sigma, g2_sigma)          = -0.4826
    C(g2_amplitude, g2_center)     = -0.4763
    C(exp_decay, g2_amplitude)     = -0.4270
    C(g1_amplitude, g1_center)     = +0.4183
    C(g1_amplitude, g2_sigma)      = -0.4010
    C(g1_amplitude, g2_amplitude)  = -0.3071
    C(exp_amplitude, g2_amplitude) = +0.2821
    C(exp_decay, g1_sigma)         = -0.2520
    C(exp_decay, g2_sigma)         = -0.2329
    C(exp_amplitude, g2_sigma)     = +0.1714
    C(exp_decay, g2_center)        = -0.1514
    C(exp_amplitude, g1_amplitude) = +0.1478
    C(exp_decay, g1_center)        = +0.1055
</pre></div>
</div>
</div>
</div>
<p>We get a very good fit to this problem (described at the NIST site as of
average difficulty, but the tests there are generally deliberately challenging) by
applying reasonable initial guesses and putting modest but explicit bounds
on the parameter values. The overall fit is shown on the left, with its individual
components displayed on the right:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_20_0.svg" src="_images/builtin_models_20_0.svg" /></div>
</div>
<p>One final point on setting initial values. From looking at the data
itself, we can see the two Gaussian peaks are reasonably well separated but
do overlap. Furthermore, we can tell that the initial guess for the
decaying exponential component was poorly estimated because we used the
full data range. We can simplify the initial parameter values by using
this, and by defining an <code class="xref py py-func docutils literal notranslate"><span class="pre">index_of()</span></code> function to limit the data range.
That is, with:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">index_of</span><span class="p">(</span><span class="n">arrval</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">    </span><span class="sd">&quot;&quot;&quot;Return index of array *at or below* value.&quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="n">value</span> <span class="o">&lt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">arrval</span><span class="p">):</span>
        <span class="k">return</span> <span class="mi">0</span>
    <span class="k">return</span> <span class="nb">max</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">arrval</span> <span class="o">&lt;=</span> <span class="n">value</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>


<span class="n">ix1</span> <span class="o">=</span> <span class="n">index_of</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">75</span><span class="p">)</span>
<span class="n">ix2</span> <span class="o">=</span> <span class="n">index_of</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">135</span><span class="p">)</span>
<span class="n">ix3</span> <span class="o">=</span> <span class="n">index_of</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">175</span><span class="p">)</span>

<span class="n">exp_mod</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">[:</span><span class="n">ix1</span><span class="p">],</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[:</span><span class="n">ix1</span><span class="p">])</span>
<span class="n">gauss1</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">ix1</span><span class="p">:</span><span class="n">ix2</span><span class="p">],</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[</span><span class="n">ix1</span><span class="p">:</span><span class="n">ix2</span><span class="p">])</span>
<span class="n">gauss2</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">ix2</span><span class="p">:</span><span class="n">ix3</span><span class="p">],</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[</span><span class="n">ix2</span><span class="p">:</span><span class="n">ix3</span><span class="p">])</span>
</pre></div>
</div>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
</div>
</div>
<p>we can get a better initial estimate (see below).</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_22_0.svg" src="_images/builtin_models_22_0.svg" /></div>
</div>
<p>The fit converges to the same answer, giving to identical values
(to the precision printed out in the report), but in fewer steps,
and without any bounds on parameters at all:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    ((Model(gaussian, prefix=&#39;g1_&#39;) + Model(gaussian, prefix=&#39;g2_&#39;)) + Model(exponential, prefix=&#39;exp_&#39;))
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 37
    # data points      = 250
    # variables        = 8
    chi-square         = 1247.52821
    reduced chi-square = 5.15507524
    Akaike info crit   = 417.864631
    Bayesian info crit = 446.036318
    R-squared          = 0.99648654
[[Variables]]
    exp_amplitude:  99.0183265 +/- 0.53748764 (0.54%) (init = 94.53724)
    exp_decay:      90.9508884 +/- 1.10310753 (1.21%) (init = 111.1985)
    g1_amplitude:   4257.77384 +/- 42.3839276 (1.00%) (init = 3189.648)
    g1_center:      107.030957 +/- 0.15006934 (0.14%) (init = 106.5)
    g1_sigma:       16.6725783 +/- 0.16048220 (0.96%) (init = 14.5)
    g1_fwhm:        39.2609209 +/- 0.37790669 (0.96%) == &#39;2.3548200*g1_sigma&#39;
    g1_height:      101.880228 +/- 0.59216965 (0.58%) == &#39;0.3989423*g1_amplitude/max(1e-15, g1_sigma)&#39;
    g2_amplitude:   2493.41698 +/- 36.1699974 (1.45%) (init = 2818.337)
    g2_center:      153.270103 +/- 0.19466966 (0.13%) (init = 150)
    g2_sigma:       13.8069440 +/- 0.18680331 (1.35%) (init = 15)
    g2_fwhm:        32.5128679 +/- 0.43988818 (1.35%) == &#39;2.3548200*g2_sigma&#39;
    g2_height:      72.0455954 +/- 0.61722288 (0.86%) == &#39;0.3989423*g2_amplitude/max(1e-15, g2_sigma)&#39;
[[Correlations]] (unreported correlations are &lt; 0.100)
    C(g1_amplitude, g1_sigma)      = +0.8243
    C(g2_amplitude, g2_sigma)      = +0.8154
    C(exp_amplitude, exp_decay)    = -0.6946
    C(g1_sigma, g2_center)         = +0.6842
    C(g1_center, g2_amplitude)     = -0.6689
    C(g1_center, g2_sigma)         = -0.6521
    C(g1_amplitude, g2_center)     = +0.6477
    C(g1_center, g2_center)        = +0.6205
    C(g1_center, g1_sigma)         = +0.5075
    C(exp_decay, g1_amplitude)     = -0.5074
    C(g1_sigma, g2_amplitude)      = -0.4914
    C(g2_center, g2_sigma)         = -0.4890
    C(g1_sigma, g2_sigma)          = -0.4826
    C(g2_amplitude, g2_center)     = -0.4763
    C(exp_decay, g2_amplitude)     = -0.4270
    C(g1_amplitude, g1_center)     = +0.4183
    C(g1_amplitude, g2_sigma)      = -0.4011
    C(g1_amplitude, g2_amplitude)  = -0.3071
    C(exp_amplitude, g2_amplitude) = +0.2821
    C(exp_decay, g1_sigma)         = -0.2520
    C(exp_decay, g2_sigma)         = -0.2329
    C(exp_amplitude, g2_sigma)     = +0.1714
    C(exp_decay, g2_center)        = -0.1514
    C(exp_amplitude, g1_amplitude) = +0.1478
    C(exp_decay, g1_center)        = +0.1055
</pre></div>
</div>
</div>
</div>
<p>This script is in the file <code class="docutils literal notranslate"><span class="pre">doc_builtinmodels_nistgauss2.py</span></code> in the examples folder,
and the figure above shows an improved initial estimate of the data.</p>
</section>
<section id="example-4-using-a-spline-model">
<h2>Example 4: Using a Spline Model<a class="headerlink" href="#example-4-using-a-spline-model" title="Link to this heading">¶</a></h2>
<p>In the example above, the two peaks might represent the interesting part of
the data, and the exponential decay could be viewed a “background” which
might be due to other physical effects or part of some response of the
instrumentation used to make the measurement.  That is, the background
might be well-understood to be modeled as an exponential decay, as in the
example above and so easily included in the full analysis. As the results
above show, there is some – but not huge – correlation of the parameters
between the peak amplitudes and the decay of the exponential function.
That means that it is helpful to include all of those components in a
single fit, as the uncertainties in the peak amplitudes (which would be
interpreted as “line strength” or “area”) will reflect some of the
uncertainty in how well we modeled the background.</p>
<p>Sometimes a background is more complex or at least has a less obvious
functional form.  In these cases, it can be useful to use a <em>spline</em> to
model part of the curve.  Just for completeness, a spline is a piecewise
continuous polynomial function (typically made of cubic polynomials) that
has a series of <code class="docutils literal notranslate"><span class="pre">x</span></code> values known as “knots” at which the highest order
derivative is allowed to be discontinuous.  By adding more knots, the
spline function has more flexibility to follow a particular function.</p>
<p>As an example (see the example file “doc_builtinmodels_splinemodel.py”), we
start with data with a single peak and a background that is hard to
characterize clearly as a simple decay, oscillatory structure.</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">from</span> <span class="nn">lmfit.models</span> <span class="kn">import</span> <span class="n">SplineModel</span><span class="p">,</span> <span class="n">GaussianModel</span>

<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">loadtxt</span><span class="p">(</span><span class="s1">&#39;test_splinepeak.dat&#39;</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>

<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;data&#39;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>which shows (figure below):</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_25_0.svg" src="_images/builtin_models_25_0.svg" /></div>
</div>
<p>There is definitely a peak there, so we could start with building a model
for a Gaussian peak, say with:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">model</span> <span class="o">=</span> <span class="n">GaussianModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;peak_&#39;</span><span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">make_params</span><span class="p">(</span><span class="n">amplitude</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">sigma</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>To account for that changing background, we’ll use a spline, but need to
know where to put the “knots”.  Picking points away from the peak makes
sense – we don’t want to fit the peak – but we want it to have some
flexibility near the peak.  Let’s try spacing knot points at <code class="docutils literal notranslate"><span class="pre">x=1,</span> <span class="pre">3,</span> <span class="pre">...,</span>
<span class="pre">13</span></code>, then skip over the peak at around <code class="docutils literal notranslate"><span class="pre">x=16</span></code> and then pick up knots points
at <code class="docutils literal notranslate"><span class="pre">x=19,</span> <span class="pre">21,</span> <span class="pre">23,</span> <span class="pre">25</span></code>.</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">knot_xvals</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">25</span><span class="p">])</span>

<span class="n">bkg</span> <span class="o">=</span> <span class="n">SplineModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;bkg_&#39;</span><span class="p">,</span> <span class="n">xknots</span><span class="o">=</span><span class="n">knot_xvals</span><span class="p">)</span>
<span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">bkg</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>Note that we used <code class="docutils literal notranslate"><span class="pre">bkg.guess()</span></code> to guess the initial values of the spline
parameters and then update the <code class="docutils literal notranslate"><span class="pre">params</span></code> Parameters object with these 11
parameters to account for the spline.  These will be very close to the <code class="docutils literal notranslate"><span class="pre">y</span></code>
values at the knot <code class="docutils literal notranslate"><span class="pre">x</span></code> values. The precise definition of the spline knot
parameters is not “the y-values through which the resulting spline curve
goes”, but these values are pretty good estimates for the resulting spline
values.  You’ll see below that these initial values are close.</p>
<p>With a spline background defined, we can create a composite model, and run
a fit.</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span> <span class="o">+</span> <span class="n">bkg</span>

<span class="n">params</span><span class="p">[</span><span class="s1">&#39;peak_amplitude&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">params</span><span class="p">[</span><span class="s1">&#39;peak_center&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">params</span><span class="p">[</span><span class="s1">&#39;peak_center&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="mi">20</span>

<span class="n">out</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">fit_report</span><span class="p">(</span><span class="n">min_correl</span><span class="o">=</span><span class="mf">0.3</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>You’ll see that we first set some “sanity bounds” on the peak parameters to
prevent the peak from going completely wrong.  This really is not necessary
in this case, but it is often a reasonable thing to do - the general advice
for this is to be generous in the bounds, not overly restrictive.</p>
<p>This fit will print out a report of</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<div class="output stream highlight-none notranslate"><div class="highlight"><pre><span></span>[[Model]]
    (Model(gaussian, prefix=&#39;peak_&#39;) + Model(spline_model, prefix=&#39;bkg_&#39;))
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 92
    # data points      = 501
    # variables        = 14
    chi-square         = 52.6611549
    reduced chi-square = 0.10813379
    Akaike info crit   = -1100.61674
    Bayesian info crit = -1041.58425
    R-squared          = 0.94690612
[[Variables]]
    peak_amplitude:  12.2231135 +/- 0.29554108 (2.42%) (init = 8)
    peak_center:     16.4280869 +/- 0.01091051 (0.07%) (init = 16)
    peak_sigma:      0.72096400 +/- 0.01336667 (1.85%) (init = 1)
    peak_fwhm:       1.69774046 +/- 0.03147610 (1.85%) == &#39;2.3548200*peak_sigma&#39;
    peak_height:     6.76360674 +/- 0.09854044 (1.46%) == &#39;0.3989423*peak_amplitude/max(1e-15, peak_sigma)&#39;
    bkg_s0:          3.51175736 +/- 0.04941392 (1.41%) (init = 3.787995)
    bkg_s1:          3.72930068 +/- 0.09558236 (2.56%) (init = 3.959487)
    bkg_s2:          4.26846495 +/- 0.12650286 (2.96%) (init = 4.384009)
    bkg_s3:          4.42375490 +/- 0.10170203 (2.30%) (init = 4.431971)
    bkg_s4:          4.49590448 +/- 0.10615552 (2.36%) (init = 4.243976)
    bkg_s5:          3.96515315 +/- 0.09336555 (2.35%) (init = 4.115153)
    bkg_s6:          3.35531899 +/- 0.12669985 (3.78%) (init = 3.965325)
    bkg_s7:          2.89909752 +/- 0.16190211 (5.58%) (init = 2.788437)
    bkg_s8:          2.82656963 +/- 0.13445495 (4.76%) (init = 2.984317)
    bkg_s9:          3.43338680 +/- 0.15987281 (4.66%) (init = 3.383491)
    bkg_s10:         3.73024843 +/- 0.12096865 (3.24%) (init = 3.791937)
[[Correlations]] (unreported correlations are &lt; 0.300)
    C(bkg_s7, bkg_s8)             = -0.8192
    C(peak_amplitude, peak_sigma) = +0.7987
    C(bkg_s8, bkg_s9)             = -0.7063
    C(bkg_s5, bkg_s6)             = -0.6950
    C(peak_amplitude, bkg_s7)     = -0.6878
    C(bkg_s2, bkg_s3)             = -0.6672
    C(bkg_s9, bkg_s10)            = -0.6060
    C(bkg_s3, bkg_s4)             = -0.5743
    C(bkg_s1, bkg_s2)             = -0.5646
    C(bkg_s4, bkg_s5)             = -0.5542
    C(bkg_s7, bkg_s9)             = +0.5216
    C(peak_sigma, bkg_s7)         = -0.5193
    C(peak_amplitude, bkg_s8)     = +0.5185
    C(bkg_s0, bkg_s1)             = +0.4448
    C(peak_sigma, bkg_s8)         = +0.3733
    C(peak_center, bkg_s6)        = +0.3599
    C(bkg_s4, bkg_s6)             = +0.3597
    C(bkg_s0, bkg_s2)             = -0.3595
    C(bkg_s2, bkg_s4)             = +0.3504
    C(bkg_s8, bkg_s10)            = +0.3455
    C(bkg_s6, bkg_s7)             = -0.3332
    C(peak_center, bkg_s7)        = -0.3301
    C(peak_amplitude, bkg_s9)     = -0.3206
</pre></div>
</div>
</div>
</div>
<p>from this we can make a few observations.  First, the correlation between
the “spline” parameters” and the “peak parameters” is noticeable, but not
extremely high – that’s good, and the estimated uncertainties do account
for this correlation.  The spline components are correlated with each other
(especially with the N-1 and N+1 spline parameter).  Second, we can see
that the initial values for the background spline parameters are pretty
good.</p>
<p>We can plot the results and fit components with</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span> <span class="n">comps</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">eval_components</span><span class="p">()</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">best_fit</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;best fit&#39;</span><span class="p">)</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">comps</span><span class="p">[</span><span class="s1">&#39;bkg_&#39;</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;background&#39;</span><span class="p">)</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">comps</span><span class="p">[</span><span class="s1">&#39;peak_&#39;</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;peak&#39;</span><span class="p">)</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>which will generate the plot shown below:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_31_0.svg" src="_images/builtin_models_31_0.svg" /></div>
</div>
<p>If we’re interested in seeing the locations of the knots, you might do</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span> <span class="n">knot_yvals</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">out</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;bkg&#39;</span><span class="p">)])</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">knot_xvals</span><span class="p">,</span> <span class="n">knot_yvals</span><span class="p">,</span> <span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;black&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;spline knots values&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>which will generate be shown as</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_33_0.svg" src="_images/builtin_models_33_0.svg" /></div>
</div>
<p>You might be interested in trying to assess what impact the select of the
knots has on the resulting peak intensity.  For example, you might try some
of the following set of knot values:</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span> <span class="n">knot_xvals1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span>         <span class="mi">19</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">25</span><span class="p">])</span>
 <span class="n">knot_xvals2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span>   <span class="mi">16</span><span class="p">,</span>   <span class="mi">19</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">25</span><span class="p">])</span>
 <span class="n">knot_xvals3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">25</span><span class="p">])</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>and re-run the fit with these different sets of knot points.  The results
are shown in the table below.</p>
<blockquote id="models-spline-results-table">
<div><p>Table of Peak amplitudes with varying spline points</p>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>spline x points</p></th>
<th class="head"><p>N</p></th>
<th class="head"><p>Peak amplitude value and uncertainty</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>knot_xvals1</p></td>
<td><p>11</p></td>
<td><p>12.223 (0.295)</p></td>
</tr>
<tr class="row-odd"><td><p>knot_xvals2</p></td>
<td><p>12</p></td>
<td><p>11.746 (0.594)</p></td>
</tr>
<tr class="row-even"><td><p>knot_xvals3</p></td>
<td><p>13</p></td>
<td><p>12.052 (0.872)</p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<p>Adding more spline points, especially near the peak center around <code class="docutils literal notranslate"><span class="pre">x=16.4</span></code>,
can impact the measurement of the amplitude but the uncertainty increases
dramatically enough to mostly cover the same range of values.  This is a
interesting case of adding more parameters to a fit and having the
uncertainties in the fitted parameters getting worse.  The interested
reader is encouraged to explore the fit reports and plot these different case.</p>
<p>Finally, the basic case above used 11 spline points to fit the baseline.
In fact, it would be reasonable to ask whether that is enough parameters
to fit the full spectra.  By imposing that there is also a Gaussian
peak nearby makes the spline fit only the background, but without the
Gaussian, the spline could fit the full curve.  By way of example, we’ll
just try increasing the number of spline points to fit this data</p>
<div class="jupyter_cell jupyter_container docutils container">
<div class="cell_input code_cell docutils container">
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span> <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;data&#39;</span><span class="p">)</span>
 <span class="k">for</span> <span class="n">nknots</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">25</span><span class="p">):</span>
     <span class="n">model</span> <span class="o">=</span> <span class="n">SplineModel</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s1">&#39;bkg_&#39;</span><span class="p">,</span>   <span class="n">xknots</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="n">nknots</span><span class="p">))</span>
     <span class="n">params</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">guess</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
     <span class="n">out</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">)</span>
     <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">best_fit</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;best-fit (</span><span class="si">{</span><span class="n">nknots</span><span class="si">}</span><span class="s1"> knots)&#39;</span><span class="p">)</span>

 <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
 <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="cell_output docutils container">
</div>
</div>
<p>which will show the fit below:</p>
<div class="jupyter_cell docutils container">
<div class="cell_output docutils container">
<img alt="_images/builtin_models_36_0.svg" src="_images/builtin_models_36_0.svg" /></div>
</div>
<p>By itself, 10 knots does not give a very good fit, but 25 knots or more
does give a very good fit to the peak.  This should give some confidence
that the fit with 11 parameters for the background spline is acceptable,
but also give some reason to be careful in selecting the number of spline
points to use.</p>
</section>
</section>


            <div class="clearer"></div>
          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="confidence.html" title="Calculation of confidence intervals"
             >next</a> |</li>
        <li class="right" >
          <a href="model.html" title="Modeling Data and Curve Fitting"
             >previous</a> |</li>
    <li>[ <a href="intro.html">intro</a> |</li>
    <li><a href="parameters.html">parameters</a> |</li>
    <li><a href="fitting.html">minimize</a> |</li>
    <li><a href="model.html">model</a> |</li>
    <li><a href="#">built-in models</a> |</li>
    <li><a href="confidence.html">confidence intervals</a> |</li>
    <li><a href="bounds.html">bounds</a> |</li>
    <li><a href="constraints.html">constraints</a> ]</li>
 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
    &#169; Copyright 2024, Matthew Newville, Till Stensitzki, Renee Otten, and others.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.2.6.
    </div>
  </body>
</html>
back to top