Неопределенность в отчете: приведено среднее значение и стандартная ошибка, показаны только значимые цифры - PullRequest
0 голосов
/ 30 декабря 2018

Целью является показать результат нескольких наблюдений без ненужных цифр, т. Е. Отобразить значение с количеством значащих цифр, которое согласуется с заданной неопределенностью.

Например, если вычислено mean=123.45и err=0.0012345 тогда ожидаемый результат может выглядеть как 123450 ± 1,2 (× 10 -3 ) , где используются следующие правила:

  1. ошибкавсегда имеет одну или две значащие цифры.Два, если первая цифра равна 1 (игнорируя начальные нули)
  2. , среднее значение округляется до неопределенных цифр, за исключением последней ( "останавливает среднее значение в том же десятилетии, что и первая значащая (ненулевая) цифра в SEM ").Замыкающие нули добавляются для отображения точности, соответствующей ошибке, если необходимо.

Как это можно использовать в Python:

import statistics

mean = statistics.mean(measurements)
err = statistics.stdev(measurements, mean) / len(measurements) ** 0.5
print("{} ± {} (×10<sup>{}</sup>)".format(*round_to_uncertainty(mean, err)))

Вопрос в том, как реализовать round_to_uncertainty(value, uncertainty) функция, выражающая правила 1 и 2 выше.

Примечание: термины ошибка, неопределенность используются свободно в вопросе.См. Руководство по выражению неопределенности в измерениях (GUM) .Вот связанный вопрос для R .

1 Ответ

0 голосов
/ 30 декабря 2018
Модуль

decimal может использоваться для удобного управления десятичным представлением чисел:

from decimal import Decimal

def round_to_uncertainty(value, uncertainty):
    # round the uncertainty to 1-2 significant digits
    u = Decimal(uncertainty).normalize()
    exponent = u.adjusted()  # find position of the most significant digit
    precision = (u.as_tuple().digits[0] == 1)  # is the first digit 1?
    u = u.scaleb(-exponent).quantize(Decimal(10)**-precision)

    # round the value to remove excess digits
    return round(Decimal(value).scaleb(-exponent).quantize(u)), u, exponent

Пример:

for mean, err in [
    (123.45, 0.0012345),    # 123450 ± 1.2 (×10<sup>-3</sup>)
    (8165.666, 338.9741),   # 82 ± 3 (×10<sup>2</sup>)
]: 
    print("{} ± {} (×10<sup>{}</sup>)".format(*round_to_uncertainty(mean, err)))

Вход 123.45, 0.0012345 сообщается как 123450 ± 1,2 (× 10 -3 ) 8165.666, 338.9741 переводится в 82 ± 3 (× 10 2 ) в соответствии с правилами из текущего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...