On Apr 18, 4:21 pm, eric.le.bi...@spectro.jussieu.fr wrote: > On Apr 15, 5:33 pm, Arnaud Delobelle <arno...@googlemail.com> wrote: > > I adjusted your code in a few ways, and put the result > athttp://code.activestate.com/recipes/576721/(with due credit): > > 1) There was a strange behavior, which is fixed (by performing only > dynamic calculations of UExpr, with an optimization through a new > "constant" class): >
Although normal arithmetic operations are correlated, the correlation is lost (AFAICT) as soon as you use a function: >>> a=Number_with_uncert(3,1);y=a+cos(a);y.error 1.0099083406911706 >>> #check it manually >>> def f(a): ... return a+cos(a) ... >>> h=1e-5;print (f(3+h)-f(3))/h 0.858884941879 >>> #check it analytically >>> 1-sin(3) 0.85887999194013276 It's effectively creating a new variable, tmp=cos(a) so y looks like a +tmp and the uncertainty in this is (a.error**2 + tmp.error**2)**.5: >>> a <class '__main__.Semi_formal_var'> object with result 3.0 +- 1 >>> cos(a) <class '__main__.Semi_formal_var'> object with result -0.9899924966 +- 0.14112000806 >>> (1+0.14112000806**2)**.5 1.009908340729422 That result we got when requesting the error in y We can also see that the a inside the cos() is invisible by taking the derivative wrt a >>> y.derivative_value(a) 0.99999999996214217 Also, this approach is limited in that only variables can be arguments to functions, not node expressions. If x and d are variables, x/d becomes an expression and you cannot compute sin(x/d). Or am I missing something? /c -- http://mail.python.org/mailman/listinfo/python-list