Parameters ========== Model parameters are very flexible, and can be accessed and modified in many parallel ways. The `parinfo` class is built on top of `lmfit-py's parameters `_ for compatibility with lmfit-py, but it builds on that. The code for the parameter overloading is in `parinfo.py `_. Simple Example -------------- Start with a simple example: if you want to limit parameters to be within some range, use the `limits` and `limited` parameters. .. code-block:: python # define shorthand first: T,F = True,False sp.specfit(fittype='gaussian', guesses=[-1,5,1,0.5,2,1], limits=[(0,0), (0,0), (0,0), (0,0), (0,0), (0,0)], limited=[(F,T), (F,F), (T,F), (T,F), (F,F), (T,F)]) In this example, there are two gaussian components being fitted because a Gaussian takes 3 parameters, an amplitude, a center, and a width, and there are 6 parameters in the input guesses. The first line is forced to be an absorption line: its limits are `(0,0)` but `limited=(F,T)` so only the 2nd parameter, the upper limit, is respected: the amplitude is forced to be :math:`A\leq 0`. The second line has its amplitude (the 4th parameter in `guesses`) forced *positive* since its limits are also `(0,0)` but its `limited=(T,F)`. Both lines have their *widths* forced to be positive, which is true by default: there is no meaning to a negative width, since the width enters into the equation for a gaussian as :math:`\sigma^2`. Note that the need to limit parameters is the main reason for the existence of `lmfit-py `_ and `mpfit `_. Tying Parameters ---------------- It is also possible to explicitly state that one parameter depends on another. If, for example, you want to fit two gaussians, but they must be at a fixed wavelength separation from one another (e.g., for fitting the [S II] doublet), use `tied`: .. code-block:: python sp.specfit(fittype='gaussian', guesses=[1,6716,1,0.5,6731,1], tied=['','','','','p[1]','']) If you use `lmfit-py` by specifying `use_lmfit=True`, you can use the more advanced `mathematical constraints `_ permitted by lmfit-py. :doc:`example_sdss` shows a more complete example using `tied`. Making your own `parinfo` ------------------------- You can also build a `parinfo` class directly. Currently, the best example of this is in `tests/test_formaldehyde_mm_radex.py`. Here's an example of how you would set up a fit using `parinfo` directly. .. WARNING:: There is a bug in the use_lmfit section of this code that keeps it from working properly. =( .. code-block:: python amplitude0 = pyspeckit.parinfo.Parinfo(n=0, parname='Amplitude0', shortparname='$A_0$', value=1, limits=[0, 100], limited=(True,True)) width0 = pyspeckit.parinfo.Parinfo(n=2, parname='Width0', shortparname='$\sigma_0$', value=1, limits=(0, 0), limited=(True,False)) center0 = pyspeckit.parinfo.Parinfo(n=1, parname='Center0', shortparname='$\Delta x_0$', value=6716, limits=(0, 0), limited=(False,False)) amplitude1 = pyspeckit.parinfo.Parinfo(n=3, parname='Amplitude1', shortparname='$A_1$', value=1, limits=[0, 100], limited=(True,True)) width1 = pyspeckit.parinfo.Parinfo(n=5, parname='Width1', shortparname='$\sigma_1$', value=1, limits=(0, 0), limited=(True,False)) center1 = pyspeckit.parinfo.Parinfo(n=4, parname='Center1', shortparname='$\Delta x_1$', value=6731, limits=(0, 0), limited=(False,False), tied=center0) parinfo = pyspeckit.parinfo.ParinfoList([amplitude0,center0,width0,amplitude1,center1,width1]) sp.specfit(parinfo=parinfo, use_lmfit=True)