Modifying the value of a float-like object
Peter Otten
__peter__ at web.de
Tue Apr 14 12:26:16 EDT 2009
Eric.Le.Bigot at spectro.jussieu.fr wrote:
> Alternatively, I'd be happy with a way of handling numerical
> uncertainties in Python calculations (such as in "calculate the value
> and uncertainty of a*sin(b) knowing that a=3.0 +/- 0.1 and b=1.00 +/-
> 0.01").
Naive no warranties implementation:
from math import sin, sqrt
class Value(object):
def __init__(self, value, err):
self.value = value
self.err = err
def __str__(self):
return "%s +- %s" % (self.value, self.err)
def derive(f, values, i, eps=1e-5):
x1 = f(*values)
values = list(values)
values[i] += eps
x2 = f(*values)
return (x2-x1)/eps
def calc(f, *args):
values = [v.value for v in args]
errs = [v.err for v in args]
sigma = 0
for i, (v, e) in enumerate(zip(values, errs)):
x = derive(f, values, i)*e
sigma += x*x
return Value(f(*values), sqrt(sigma))
a = Value(3.0, 0.1)
b = Value(1.0, 0.01)
def f(x, y):
return x * sin(y)
print "a = %s" % a
print "b = %s" % b
print "c = %s" % calc(f, a, b)
Peter
More information about the Python-list
mailing list