Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Average of an uarray in python uncertainties

My problem:

I have an array of ufloats (e.g. an unarray) in pythons uncertainties package. All values of the array got their own errors, and I need a funktion, that gives me the average of the array in respect to both, the error I get when calculating the mean of the nominal values and the influence the values errors have.

I have an uarray:

2 +/- 1 3 +/- 2 4 +/- 3

and need a funktion, that gives me an average value of the array.

Thanks

like image 452
DomR Avatar asked Sep 19 '25 14:09

DomR


2 Answers

Assuming Gaussian statistics, the uncertainties stem from Gaussian parent distributions. In such a case, it is standard to weight the measurements (nominal values) by the inverse variance. This application to the general weighted average gives,

$$ \frac{\sum_i w_i x_i}{\sum_i w_i} = \frac{\sum_i x_i/\sigma_i^2}{\sum_i 1/\sigma_i^2} $$.

One need only perform good 'ol error propagation on this to get an uncertainty of the weighted average as,

$$ \sqrt{\sum_i \frac{1}{1/\sum_i \sigma_i^2}} $$

I don't have an n-length formula to do this syntactically speaking on hand, but here's how one could get the weighted average and its uncertainty in a simple case:

    a = un.ufloat(5, 2)
    b = un.ufloat(8, 4)
    wavg = un.ufloat((a.n/a.s**2 + b.n/b.s**2)/(1/a.s**2 + 1/b.s**2), 
                     np.sqrt(2/(1/a.s**2 + 1/b.s**2)))
    print(wavg)
    >>> 5.6+/-2.5298221281347035

As one would expect, the result tends more-so towards the value with the smaller uncertainty. This is good since a smaller uncertainty in a measurement implies that its associated nominal value is closer to the true value in the parent distribution than those with larger uncertainties.

like image 165
Captain Morgan Avatar answered Sep 21 '25 03:09

Captain Morgan


Unless I'm missing something, you could calculate the sum divided by the length of the array:

from uncertainties import unumpy, ufloat
import numpy as np
arr = np.array([ufloat(2, 1), ufloat(3, 2), ufloat(4,3)])
print(sum(arr)/len(arr))
# 3.0+/-1.2

You can also define it like this:

arr1 = unumpy.uarray([2, 3, 4], [1, 2, 3])
print(sum(arr1)/len(arr1))
# 3.0+/-1.2

uncertainties takes care of the rest.

like image 38
Eric Duminil Avatar answered Sep 21 '25 02:09

Eric Duminil