# Define model def power_law(x, norm, gamma): return norm * x ** -gamma # Define fit statistic def chi2(norm, gamma): model = power_law(x, norm, gamma) chi = (y - model) / y_err return (chi ** 2).sum() # Perform fit m = Minuit(chi2, norm=1e-12, gamma=2) m.migrad() m.hesse() #m.minos() #print 'matrix:\n', m.matrix() #print 'errors: ', m.errors #print 'merrors:', m.merrors # Report results package = 'minuit' gamma, norm = m.values.values() gamma_err, norm_err = m.errors.values() chi2 = m.fval cov = m.covariance[('norm', 'gamma')] corr = m.matrix(correlation=True)[0][1] report_results(package, norm, norm_err, gamma, gamma_err, chi2, cov, corr)
red_chi2 = chi2(popt) / (len(x) - len(p0)) pcov = approx_covar(popt, red_chi2) print 'fmin and approx_hess results:' print 'values:', popt print 'errors:', np.sqrt(pcov.diagonal()) """Just to check, here is what Minuit has to say""" from minuit import Minuit def chi2(a, b, c): chi = yn - func(x, a, b, c) return (chi ** 2).sum() m = Minuit(chi2, a=2.5, b=1.3, c=0.5) m.migrad() m.hesse() pcov = red_chi2 * np.array(m.matrix()) popt = np.array(m.args) print 'minuit results' print 'values:', popt print 'errors:', np.sqrt(pcov.diagonal()) try: raise import matplotlib.pyplot as plt plt.plot(x, yn, label='data') yfit = func(x, *popt) plt.plot(x, yfit, label='fit') plt.show() except: print('No matplotlib, no plot')