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 ...