Найти тему

Конвертер единиц измерения (размерностей) физических величин на Python

Для конвертации единиц измерения физических величин будем использовать пакет Pint. Устанавливается Pint вводом в терминале команды

pip install pint

или для окружения Anaconda

conda install -c conda-forge pint

С помощью Pint можно, например, складывать друг с другом сантиметры, километры, футы и получать правильный результат.

Вычислим 1000 см + 0,1 км + 10 футов

>>># Импортируем класс, работающий с единицами измерения
>>>from pint import UnitRegistry
>>># Создаём экземпляр класса, работающего с единицами измерения
>>>ureg = UnitRegistry()
>>>L = 1000 * ureg['cm'] + 0.1 * ureg['km'] + 10 * ureg['foot']
>>>L
11304.8 centimeter

Возможности Pint описаны в [2] и [3], здесь мы рассмотрим только метод to предназначенный для конвертирования единиц измерения физических величин.

Для того чтобы перевести найденную выше величину L в ярды нужно выполнить команду

>>>L.to('yd')
123.63079615048119 yard

>>># Перевод в метры
>>>L.to('m')
113.048 meter

Для того чтобы узнать как в пакете Pint обозначаются размерности необходимо открыть файл default_en.txt (скачать), находящийся в каталоге, в котором установлен пакет Pint. Расположение данного каталога можно узнать с помощью команды в терминале

pip show pint

Рассмотрим раздел файла, посвящённый давлению.

# Pressure
[pressure] = [force] / [area]
pascal = newton / meter ** 2 = Pa = Па
barye = dyne / centimeter ** 2 = Ba = barie = barad = barrie = baryd
bar = 1e5 * pascal = бар
technical_atmosphere = kilogram * g_0 / centimeter ** 2 = at = кгс_на_см2
torr = atm / 760
pound_force_per_square_inch = force_pound / inch ** 2 = psi
kip_per_square_inch = kip / inch ** 2 = ksi
millimeter_Hg = millimeter * Hg * g_0 = mmHg = mm_Hg = millimeter_Hg_0C = мм_рт_ст
centimeter_Hg = centimeter * Hg * g_0 = cmHg = cm_Hg = centimeter_Hg_0C
inch_Hg = inch * Hg * g_0 = inHg = in_Hg = inch_Hg_32F
inch_Hg_60F = inch * Hg_60F * g_0
inch_H2O_39F = inch * water_39F * g_0
inch_H2O_60F = inch * water_60F * g_0
foot_H2O = foot * water * g_0 = ftH2O = feet_H2O
centimeter_H2O = centimeter * water * g_0 = cmH2O = cm_H2O
sound_pressure_level = 20e-6 * pascal = SPL

Каждая размерность описывается одной строкой. В качестве размерности величины можно использовать любое прописанное в строке обозначение, включая формулы (правда не все - при использовании, например, '1e5 * pascal' возникает ошибка, скорее всего из-за присутствующего в формуле умножения на число). Так же можно добавлять свои обозначения, что я и сделал для pascal (добавил в конец соответствующей строки ' = Па'), bar (бар), technical_atmosphere (кгс_на_см2) и millimeter_Hg (мм_рт_ст).

>>># Присвоим величине p значение 101325 размерностью Па
>>>p = 101325 * ureg['Па'] # стандартная атмосфера

>>># Перевод величины p в размерность кгс/см2
>>>p.to('кгс_на_см2')
1.033227452799886 technical_atmosphere

>>># Перевод величины p в размерность мм.рт.ст.
>>>p.to('мм_рт_ст')
759.9998917256115 millimeter_Hg

>>># Перевод величины p в размерность бар
>>>p.to('бар')
1.01325 bar

Так же в файле default_en.txt есть раздел #### PREFIXES ####, в котором приведён перечень приставок для десятичных дольных и кратных единиц (микро, санти, кило, гига и т.п.). Их тоже можно русифицировать, добавив в конец строки знак "равно" и русское обозначение со знаком "минус" справа от него.

kilo- = 1e3 = k- = к-
mega- = 1e6 = M- = М-
giga- = 1e9 = G- = Г-

# Перевод величины p в размерность кПа
>>> p.to('кПа')
101.325 kilopascal

Переведём КПД в удельный расход тепловой энергии на выработку электроэнергии (heat rate), предварительно русифицировав следующие размерности:

hour = 60 * minute = h = hr = ч
joule = newton * meter = J = Дж
watt_hour = watt * hour = Wh = watthour = Вт_ч

>>>КПД = 0.35 * ureg[''] # КПД безразмерная величина (dimensionless)
>>>hr = КПД.to('кДж/кВт_ч') # перевод в heat rate
>>>hr
1260.0 kilojoule/kilowatt_hour

>>>hr.to('') # перевод heat rate в КПД
0.35 dimensionless

Для извлечения из величины его значения следует обратиться к свойству объекта magnitude.

>>>p.magnitude # значение величины p
101325

>>>type(p.magnitude) # тип значения величины p
int

>>>type(hr.magnitude) # тип значения величины heat rate
float

Добавим в Pint возможность переводить давление в размерность пуд-сила на квадратный аршин. Сначала нужно определить размерности пуд и аршин. Для этого в раздел #### UNIT GROUPS #### файла default_en.txt добавим следующие строки:

@group СтарорусскаяСистемаМер
пуд = 16.3805 * kilogram
аршин = 0.7112 * meter = арш
@end

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

>>>ureg['пуд'].to('kg')
16.3805 kilogram

>>>ureg['арш'].to('m')
0.7112 meter

Теперь в раздел # Pressure добавим новую единицу измерения давления - пнка (пуд-сила на квадратный аршин)

пнка = пуд * g_0 / аршин ** 2

где g_0 - это ускорение, обусловленное гравитацией или ускорение свободного падения (уже определена в Pint).

>>>ureg['g_0'].to('m/s**2')
9.80665 meter/second2

>>># Сила тяжести (вес) 1 кг
>>>(ureg['kg'] * ureg['g_0']).to('newton')
9.80665 newton

Используемые Pint константы приведены в файле constants_en.txt (скачать)

>>># Выразим стандартную атмосферу в пнка
>>>p.to('пнка')
319.04524671623307 пнка

Для проверки найденного значения определим давление одного пуда на квадратный аршин в Па и умножим его на значение величины p (стандартная атмосфера), выраженной в пнка. В результате должна получиться стандартная атмосфера в Па.

>>>16.3805 * 9.80665 / 0.7112 / 0.7112 * p.to('пнка').magnitude
101325.00000000001

>>>p # Стандартная атмосфера
101325 pascal

В более удобочитаемом виде (в формате Jupyter Notebook) данная статья размещена здесь.

Ссылки

1. Установка Pint в Anaconda

2. Применение языка Python в инженерной практике. Часть 1 — обзор модуля Pint

3. Сайт пакета Pint

Наука
7 млн интересуются