4 Author: Bryan Steinbach
10 from scipy
import optimize
,interpolate
13 # Problem statement doesn't specify how many points or where they should go, beyond between 0 and 4
14 # Pick 100 points evenly spaced
18 return p
[0]*np
.exp(p
[1]*x
)+p
[2]
22 x
= np
.linspace(0,4,n
)
24 def rms(x
): return np
.sqrt(np
.dot(x
,x
)/x
.size
)
27 ptrue
= np
.array([2,-0.75,0.1]) # a, alpha, k
28 ynoise
= sigma
*np
.random
.randn(n
)
29 print "true parameters: ",ptrue
30 print "noise standard deviation: ",np
.std(ynoise
), "expected ",sigma
31 ysignal
= model(ptrue
,x
)
36 p0
= np
.array([1.,0.,min(yd
)])
38 p
,ier
= optimize
.leastsq(lambda p
: model(p
,x
) - yd
,p0
)
42 print "sp.optimize.leastsq ier: ",ier
44 print "leastsq parameters: ",p
46 print "leastsq rms error: ",rms(ysignal
- yleastsq
)
47 print "leastsq rms resid: ",rms(yd
- yleastsq
)
50 tck
= interpolate
.splrep(x
,yd
,s
=2.0)
51 yspline
= interpolate
.splev(x
,tck
)
53 print "spline rms error: ",rms(ysignal
- yspline
)
54 print "spline rms resid: ",rms(yd
- yspline
)
59 for i
in range(npoly
):
60 poly
= np
.polyfit(x
,yd
,i
)
62 ypoly
= np
.polyval(poly
,x
)
65 print "poly%d rms error: "%i,rms(ysignal
- ypoly
)
66 print "poly%d rms resid: "%i,rms(yd
- ypoly
)
70 pl
.plot(x
,ysignal
,label
="signal")
71 pl
.plot(x
,yd
,label
="signal+noise")
72 pl
.plot(x
,yleastsq
,label
="least squares fit")
73 pl
.plot(x
,yspline
,label
='spline smooth')
74 for i
in range(npoly
):
75 pl
.plot(x
,ypolys
[i
],label
='poly%d'%i)
80 pl
.title('Fitting to $y = a \\exp(\\alpha x) + k + n(x)$')
82 pl
.savefig('fits.png')