Skip to content

Instantly share code, notes, and snippets.

@kryzhovnik
Last active June 1, 2022 13:43
Show Gist options
  • Save kryzhovnik/b4c2146307a204b2cf6933f726699faa to your computer and use it in GitHub Desktop.
Save kryzhovnik/b4c2146307a204b2cf6933f726699faa to your computer and use it in GitHub Desktop.

Вычисление измерений и погрешностей

Базовая теория

Поверители в ходе поверки делают проливы определенного количества воды через счетчик - volume (показания счетчика) - и фиксируют какой объем пролитой воды измерил счетчик - measurement (показания эталона). Разнича между volume и measurement, вычисляемая в процентах, называется погрешнойстью delta.

У счетчиков есть условно три режима работы:

  • min - минимальный поток, который фиксирует счетчик
  • transition - переходных режим
  • max - максимальный поток

Измерения производятся в каждом из трех режимов. Для каждого из трех режимов допустимая погрешность отличается. У разных счетчиков количество воды, которое необходимо пролить, различается.

Вычисления

Формула расчета погрешности

PRECISION = 6
delta = (((volume - measurement) / measurement) * 100).round(PRECISION)

Расход min, пер., max - consumption_1, consumption_2, consumption_3

Поверитель в форме указывает паспортные значения счетчика в полях Расход (consumption). Значения consumption_1 (min) и consumption_2 (transition) выбираются из предустановленных:

min :        [0.03, 0.05, 0.06, 0.1]
transition : [0.13, 0.16, 0.22, 0.275]

Значение consumption_3 (max) указывается пользователем самостоятельно, допустимый диапазон: 0.35-1.56 (позже будет понятно откуда он берется)

Погрешность - delta_1, delta_2, delta_3

Допустимые диапазоны погрешности

delta_1 (min)        : (-4.9)..(4.9)
delta_2 (transition) : (-1.9)..(1.9)
delta_3 (max)        : (-1.8)..(1.8)

Объем воды по счетчику - volume

Таблицы, в соответствии с которой, выбирается значение volume

min: [
  { range: (0.003)..(0.033), volume: 0.008 },
  { range: (0.050)..(0.055), volume: 0.012 },
  { range: (0.060)..(0.066), volume: 0.014 },
  { range: (0.100)..(0.120), volume: 0.02 },
]

transition: [
  { range: (0.117)..(0.143), volume: 0.014 },
  { range: (0.144)..(0.176), volume: 0.017 },
  { range: (0.198)..(0.242), volume: 0.023 },
  { range: (0.247)..(0.302), volume: 0.03 },
]

max: [
  { range: (0.35)..(0.56), volume: 0.019 },
  { range: (0.56)..(0.76), volume: 0.026 },
  { range: (0.76)..(0.86), volume: 0.029 },
  { range: (0.86)..(1.01), volume: 0.034 },
  { range: (1.01)..(1.56), volume: 0.050 },
]

Пример:

значение `consumption_2` равно 0.22,
consumption_2 соответствует таблице transition
находим в ней сточку с диапазоном, в который попадает 0.22 - это треться строчка
значит `volume` равен 0.023

Работа с числами с десятичными долями и округление

Чтобы избежать ошибок с десятичными долями, не используйте для вычислений числа с плавающей точкой (real, float), используйте Decimal.

Ниже пример как работает округление Decimal на сервере. Обратите внимание на 4-5 строчки. Убедитесь, пожалуйста, что с вашей стороны округление Decimal работает в том же режиме.

BigDecimal('0.123456789').round(0) == 0.0
BigDecimal('0.123456789').round(1) == 0.1
BigDecimal('0.123456789').round(2) == 0.12
BigDecimal('0.123456789').round(3) == 0.123
BigDecimal('0.123456789').round(4) == 0.1235
BigDecimal('0.123456789').round(5) == 0.12346
BigDecimal('0.123456789').round(6) == 0.123457
BigDecimal('0.123456789').round(7) == 0.1234568
BigDecimal('0.123456789').round(8) == 0.12345679
BigDecimal('0.123456789').round(9) == 0.123456789
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment