#!/usr/bin/env python #------------------------------------------------------------ # Purpose: Demonstrate that kmpfit gives the same solution # as the analytical solution of the linear regression problem # (using weights). # Vog, 02 Dec 2011 #------------------------------------------------------------ import numpy from numpy.random import normal from kapteyn import kmpfit def lingres(xa, ya, err): w = numpy.where(err==0.0, 0.0, 1.0/(err*err)) sum = w.sum() sumX = (w*xa).sum() sumY = (w*ya).sum() sumX2 = (w*xa*xa).sum() sumY2 = (w*ya*ya).sum() sumXY = (w*xa*ya).sum() delta = sum * sumX2 - sumX * sumX a = (sumX2*sumY - sumX*sumXY) / delta b = (sumXY*sum - sumX*sumY) / delta siga = numpy.sqrt(abs(sumX2/delta)) sigb = numpy.sqrt(abs(sum/delta)) return a, b, siga, sigb, delta, sum, sumX2, sumX 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 N = 100 a0 = 0; b0 = 0 #x = numpy.linspace(0.0, 2.0, N) #y = a0 + b0*x + normal(0.0, 0.4, N) # Mean,sigma,N #err = normal(0.0, 0.2, N) x = numpy.array([1,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) err = numpy.array([0.05, 0.1, 0.2, 0.5, 0.8, 1.5, 4.0]) A0, B0, sigA0, sigB0, delta, S, Sxx, Sx = lingres(x, y, err) chi2 = (((y-model((A0,B0),x))/err)**2).sum() rchi2 = chi2/(N-2) da = sigA0*numpy.sqrt(rchi2) db = sigB0*numpy.sqrt(rchi2) print "\n-- Results analytical solution:" print "Best fit parameters: ", [A0, B0] print "Parameter errors weighted fit: ", [sigA0, sigB0] print "Parameter errors un-/relative weighted fit: ", [da, db] print "Minimum chi^2: ", chi2 print "Covariance matrix:" print Sxx/delta, -Sx/delta print -Sx/delta, S/delta fitobj = kmpfit.Fitter(residuals=residuals, data=(x, y, err)) fitobj.fit(params0=[1,1]) print "\n-- Results kmpfit:" print "Best-fit parameters: ", fitobj.params print "Parameter errors weighted fit: ", fitobj.xerror print "Parameter errors un-/relative weighted fit: ", fitobj.stderr print "Minimum chi^2: ", fitobj.chi2_min print "Covariance matrix:" print fitobj.covar