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

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

pip install pint

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

conda install -c conda-forge pint

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

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

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

In [2]:
L.to('yd')
Out[2]:
123.63079615048119 yard
In [3]:
# Перевод в метры
L.to('m')
Out[3]:
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 (мм_рт_ст).

In [4]:
# Присвоим величине p значение 101325 размерностью Па 
p = 101325 * ureg['Па']  # стандартная атмосфера
In [5]:
# Перевод величины p в размерность кгс/см2
p.to('кгс_на_см2')
Out[5]:
1.033227452799886 technical_atmosphere
In [6]:
# Перевод величины p в размерность мм.рт.ст.
p.to('мм_рт_ст')
Out[6]:
759.9998917256115 millimeter_Hg
In [7]:
# Перевод величины p в размерность бар
p.to('бар')
Out[7]:
1.01325 bar

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

kilo- =  1e3   = k- = к-
mega- =  1e6   = M- = М-
giga- =  1e9   = G- = Г-
In [8]:
# Перевод величины p в размерность кПа
p.to('кПа')
Out[8]:
101.325 kilopascal

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

hour = 60 * minute = h = hr = ч
joule = newton * meter = J = Дж
watt_hour = watt * hour = Wh = watthour = Вт_ч
In [9]:
КПД = 0.35 * ureg['']  # КПД безразмерная величина (dimensionless)
hr = КПД.to('кДж/кВт_ч')  # перевод в heat rate
hr
Out[9]:
1260.0 kilojoule/kilowatt_hour
In [10]:
hr.to('')  # перевод heat rate в КПД
Out[10]:
0.35 dimensionless

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

In [11]:
p.magnitude  # значение величины p
Out[11]:
101325
In [12]:
type(p.magnitude)  # тип значения величины p
Out[12]:
int
In [13]:
type(hr.magnitude)  # тип значения величины heat rate
Out[13]:
float

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

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

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

In [14]:
ureg['пуд'].to('kg')
Out[14]:
16.3805 kilogram
In [15]:
ureg['арш'].to('m')
Out[15]:
0.7112 meter

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

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

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

In [16]:
ureg['g_0'].to('m/s**2')
Out[16]:
9.80665 meter/second2
In [17]:
# Сила тяжести (вес) 1 кг
(ureg['kg'] * ureg['g_0']).to('newton')
Out[17]:
9.80665 newton

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

In [18]:
# Выразим стандартную атмосферу в пнка
p.to('пнка')
Out[18]:
319.04524671623307 пнка

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

In [19]:
16.3805 * 9.80665 / 0.7112 / 0.7112 * p.to('пнка').magnitude
Out[19]:
101325.00000000001
In [20]:
p  # Стандартная атмосфера
Out[20]:
101325 pascal

Ссылки¶

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

Инженерные расчёты на Python, С.В. Медведев, 2020-2023
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2023