Python Tutorial 3

From Advanced Labs Wiki
Revision as of 02:53, 14 April 2015 by Tobias Marriage (talk | contribs) (Created page with '<pre> import numpy as np import scipy as sp import pylab as plt import scipy.stats as stats get_ipython().magic(u'matplotlib inline') # ###Nonlinear fitting # # Here we'll use …')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
import numpy as np
import scipy as sp
import pylab as plt
import scipy.stats as stats
get_ipython().magic(u'matplotlib inline')


# ###Nonlinear fitting
#
# Here we'll use the scipy.optimize.curve_fit function, which implements the L-M nonlinear fitting method, to fit a  model (a gaussian with linear polynomial) to some fake data.

# In[36]:

def model(x,a,b,c,d,e):
    return a+b*x+c*np.exp(-(x-d)**2/2/e**2)

#Make fake data
x = np.arange(-5,5,.5)
err = np.ones(len(x))*1.2
y = np.random.normal(model(x,10,2,20,1,1),scale=err)
plt.errorbar(x,y,err,fmt='o')

#Fit the data
p,cov = sp.optimize.curve_fit(model,x,y,sigma=err,absolute_sigma=True,p0=[5,1,25,1.5,2])
for i in range(len(p)):
    print p[i],'+/-',np.sqrt(cov[i][i])
plt.plot(x,model(x,*p))
plt.plot(x,p[0]+p[1]*x)
plt.plot(x,p[2]*np.exp(-(x-p[3])**2/2/p[4]**2))
plt.show()

chisq = np.sum((y-model(x,*p))**2/err**2)
dof = len(y)-len(p)
print 'chisq =', chisq
print 'dof', dof
print 'PTE', stats.chisqprob(chisq,dof)