[SciPy-user] linear (polynomial) fit with error bars
massimo sandal
massimo.sandal at unibo.it
Thu Apr 10 08:09:12 EDT 2008
Hi,
Fabrice Silva ha scritto:
> Using the diag input argument of leastsq :
>
> from scipy import optimize
> def errfunc(a,X,Y):
> return Y-(a[0]*X+a[1])
> #b may be the vector containing the error bars sizes.
> weigths = 1./b
> a, success = optimize.leastsq(errfunc, [0,0],args=(X,Y), diag=weigths)
>
> You here give more importance to points having small error bars.
Thanks for your advice. I am trying however to use your code, but I am
stuck upon an error.
Here is the script, that reads a very raw data file (see below):
#!/usr/bin/env python
from scipy import optimize
def errfunc(a,X,Y):
return Y-(a[0]*X+a[1])
#b may be the vector containing the error bars sizes.
f=open("data.txt", "r")
datf=f.readlines()
numofdatapoints=len(datf)/3
xval=[0.0]*numofdatapoints
yval=[0.0]*numofdatapoints
err=[0.0]*numofdatapoints
# print len(datf)
# print datf
for i in range(numofdatapoints):
xval[i]=float(datf[i])
yval[i]=float(datf[i+numofdatapoints])
err[i]=float(datf[i+2*numofdatapoints])
weigths=[0.0]*numofdatapoints
for i in range(numofdatapoints):
weigths[i] = 1./err[i]
w=[0.0]*numofdatapoints
success=[0.0]*numofdatapoints
w, success = optimize.leastsq(errfunc, [0,0], args=(xval,yval),
diag=weigths)
print valA
print success
-------
data.txt:
118.877580092022
110.450590941286
108.684062758621
109.314800167624
103.090778781767
98.5714370869397
29.1
31.42
33.74
36.06
38.38
40.7
2.76010170015786
3.52143474842509
2.45059986418858
3.21254530326032
2.11363073382134
2.14664809861522
-------
and the script dies with the following error:
massimo at calliope:~/Python/linfit$ python linfit.py
Traceback (most recent call last):
File "linfit.py", line 31, in <module>
w, success = optimize.leastsq(errfunc, [0,0], args=(xval,yval),
diag=weigths)
File "/usr/lib/python2.5/site-packages/scipy/optimize/minpack.py",
line 262, in leastsq
m = check_func(func,x0,args,n)[0]
File "/usr/lib/python2.5/site-packages/scipy/optimize/minpack.py",
line 12, in check_func
res = atleast_1d(apply(thefunc,args))
File "linfit.py", line 4, in errfunc
return Y-(a[0]*X+a[1])
ValueError: shape mismatch: objects cannot be broadcast to a single shape
which baffles me. What should I look for to understand what I am doing
wrong?
m.
--
Massimo Sandal
University of Bologna
Department of Biochemistry "G.Moruzzi"
snail mail:
Via Irnerio 48, 40126 Bologna, Italy
email:
massimo.sandal at unibo.it
tel: +39-051-2094388
fax: +39-051-2094387
-------------- next part --------------
A non-text attachment was scrubbed...
Name: massimo.sandal.vcf
Type: text/x-vcard
Size: 274 bytes
Desc: not available
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20080410/62d3445c/attachment.vcf>
More information about the SciPy-User
mailing list