#!/usr/bin/env python #------------------------------------------------------------ # Purpose: Demonstrate quality improvement weighted vs # unweighted fit for Wolberg data. Wolberg's # best fit parameters for a weighted fit is not # accurate (a,b) = (1.8926, 4.9982) # Improved values are derived from the analytical # solutions and kmpfit: (a,b) = (1.8705, 5.0290) # # Vog, 01 Jan 2012 #------------------------------------------------------------ import numpy from numpy.random import normal from kapteyn import kmpfit def model(p, x): a, b = p return a + b*x def residuals(p, my_arrays): x, y, err = my_arrays a, b = p return (y-model(p,x))/err x = numpy.array([1.0, 2, 3, 4, 5, 6, 7]) y = numpy.array([6.9, 11.95, 16.8, 22.5, 26.2, 33.5, 41.0]) N = len(y) err = numpy.ones(N) errw = numpy.array([0.05, 0.1, 0.2, 0.5, 0.8, 1.5, 4.0]) print "Data x:", x print "Data y:", y print "Errors:", errw fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, err)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit unit weighting wi=1.0:" print "Best-fit parameters: ", fitobj.params print "Parameter errors using measurement uncertainties: ", fitobj.xerror print "Parameter errors unit-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Covariance matrix:" print fitobj.covar fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, 10*err)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit with (scaled) equal weights wi=10*1.0:" print "Best-fit parameters: ", fitobj.params print "Parameter errors using measurement uncertainties: ", fitobj.xerror print "Parameter errors unit-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Covariance matrix:" print fitobj.covar fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, errw)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit with weights:" print "Best-fit parameters: ", fitobj.params print "Parameter errors using measurement uncertainties: ", fitobj.xerror print "Parameter errors unit-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Minimum reduced chi^2: ", fitobj.rchi2_min print "Covariance matrix:" print fitobj.covar rchi2 = fitobj.rchi2_min # Store for future scaling purposes errw10 = errw * 10.0 fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, errw10)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit with scaled individual errors (factor=10):" print "Best-fit parameters: ", fitobj.params print "Parameter errors using measurement uncertainties: ", fitobj.xerror print "Parameter errors unit-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Minimum reduced chi^2: ", fitobj.rchi2_min print "Covariance matrix:" print fitobj.covar scaled_errw = errw * numpy.sqrt(rchi2) print """\n\nNew array with measurement errors, scaled with factor %g to give a reduced chi-squared of 1.0:"""%rchi2 print scaled_errw fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, scaled_errw)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit with scaled individual errors to force red_chi2=1:" print "Best-fit parameters: ", fitobj.params print "Parameter errors using measurement uncertainties: ", fitobj.xerror print "Parameter errors unit-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Minimum reduced chi^2: ", fitobj.rchi2_min print "Covariance matrix:" print fitobj.covar