Please cite this DOI if symfit
benefited your publication. Building this has been a lot of work, and as young researchers your citation means a lot to us.
Martin Roelfs & Peter C Kroon, symfit. doi:10.5281/zenodo.1133336
The goal of this project is simple: to make fitting in Python pythonic. What does pythonic fitting look like? Well, there's a simple test. If I can give you pieces of example code and don't have to use any additional words to explain what it does, it's pythonic.
from symfit import parameters, variables, Fit, Model
import numpy as np
xdata = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
ydata = np.array([2.3, 3.3, 4.1, 5.5, 6.7])
yerr = np.array([0.1, 0.1, 0.1, 0.1, 0.1])
a, b = parameters('a, b')
x, y = variables('x, y')
model = Model({y: a * x + b})
fit = Fit(model, x=xdata, y=ydata, sigma_y=yerr)
fit_result = fit.execute()
Cool right? So now that we have done a fit, how do we use the results?
import matplotlib.pyplot as plt
yfit = model(x=xdata, **fit_result.params)[y]
plt.plot(xdata, yfit)
plt.show()
Need I say more? How about I let another code example do the talking?
from symfit import parameters, Fit, Equality, GreaterThan
x, y = parameters('x, y')
model = 2 * x * y + 2 * x - x**2 - 2 * y**2
constraints = [
Equality(x**3, y),
GreaterThan(y, 1),
]
fit = Fit(- model, constraints=constraints)
fit_result = fit.execute()
I know what you are thinking. "What if I need to fit to a system of Ordinary Differential Equations?"
from symfit import variables, Parameter, ODEModel, Fit, D
import numpy as np
tdata = np.array([10, 26, 44, 70, 120])
adata = 10e-4 * np.array([44, 34, 27, 20, 14])
a, b, t = variables('a, b, t')
k = Parameter('k', 0.1)
model_dict = {
D(a, t): - k * a**2,
D(b, t): k * a**2,
}
ode_model = ODEModel(model_dict, initial={t: 0.0, a: 54 * 10e-4, b: 0.0})
fit = Fit(ode_model, t=tdata, a=adata, b=None)
fit_result = fit.execute()
For more fitting delight, check the docs at http://symfit.readthedocs.org.