## Fitting with lmfit

General-purpose fitting in Python can sometimes be a bit more
challenging than one might at first suspect given the robust nature of
tools like Numpy and Scipy. First we had `leastsq`

. It works, although
often requires a bit of manual tuning of initial guesses and *always*
requires manual calculation of standard error from a covariance matrix
(which isn't even one of the return values by default). Later we got
`curve_fit`

which is a bit more user friendly and even estimates and
returns standard error for us by default! Alas, `curve_fit`

is just a
convenience wrapper on top of `leastsq`

and suffers from some of the
same general headaches.

These days, we have the wonderful lmfit package. Not only can lmfit make fitting more user friendly, but it also is quite a bit more robust than using scipy directly. The documentation is thorough and rigorous, but that can also mean that it can be a bit overwhelming to get started with it. Here I work through a basic example in two slightly different ways in order to demonstrate how to use it.

## Generating the data

Let's assume we have data that resembles a decaying sine wave (e.g., a damped oscillator). lmfit has quite a few pre-defined models, but this is not one of them. We can simulate the data with the following code:

```
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(5*x)*np.exp(-x/2.5)
```

Real data is noisy, so ...

more ...