from lmfit import Parameters, minimize from bb import BoxBOD, report_results # Define model with named parameters pars = Parameters() pars.add("b1", value=BoxBOD.p0[0]) pars.add("b2", value=BoxBOD.p0[1]) def model(pars, x): b1 = pars["b1"].value b2 = pars["b2"].value return BoxBOD.model(x, b1, b2) # Define chi vector # Nothe that (chi ** 2).sum() is automatically # computed by minimize. def chi(pars, x, y): return model(pars, x) - y # Perform fit result = minimize(chi, pars, args=(BoxBOD.x, BoxBOD.y)) # Report results popt = [pars["b1"].value, pars["b2"].value] perr = [pars["b1"].stderr, pars["b2"].stderr] chi2 = result.chisqr report_results("lmfit", popt, perr, chi2)
b1, b2 = pars return BoxBOD.model(x, b1, b2) ui.load_user_model(boxbod_func, "boxbod") ui.add_user_pars("boxbod", ["b1", "b2"]) bb = boxbod ui.set_model(bb) bb.b1, bb.b2 = BoxBOD.p0[0], BoxBOD.p0[1] # Perform fit ui.set_stat('chi2datavar') #ui.set_method('levmar') # ['levmar', 'moncar', 'neldermead', 'simplex'] ui.set_method_opt('xtol', 1e-10) ui.fit() # Compute best-fit parameters ui.set_covar_opt('eps', 1e-5) # @todo: Why does this parameter have no effect ui.covariance() # Compute covariance matrix (i.e. errors) #ui.conf() # Compute profile errors #ui.show_all() # Print a very nice summary of your session to less # Report results fr = ui.get_fit_results() cr = ui.get_covar_results() # Report results (we have to apply the s factor ourselves) popt = np.array(fr.parvals) chi2 = fr.statval s_factor = np.sqrt(chi2 / fr.dof) perr = s_factor * np.array(cr.parmaxes) report_results('sherpa', popt, perr, chi2)
import numpy as np from numpy import sqrt from scipy.optimize import curve_fit, leastsq from bb import BoxBOD, report_results # Perform fit popt, pcov = curve_fit(BoxBOD.model, BoxBOD.x, BoxBOD.y, BoxBOD.p0) def chi(pars): return BoxBOD.y - BoxBOD.model(BoxBOD.x, *pars) res = leastsq(chi, BoxBOD.p0, full_output=True) from pprint import pprint pprint(res) raise # Report results perr = sqrt(pcov.diagonal()) # chi2 is not returned, we have to compute it by hand chi = (BoxBOD.y - BoxBOD.model(BoxBOD.x, *popt)) chi2 = (chi ** 2).sum() report_results('scipy_curve_fit', popt, perr, chi2)