Вопрос

SymPy - отличный инструмент для преобразования единиц в Python:

>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000

Вы можете легко свернуть свой собственный:

>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2

Однако я не могу реализовать это в своем приложении, если не смогу преобразовать градусы C (абсолютные) в K в градусы F в градусы R или любую их комбинацию.

Я думал, может быть, что-то вроде этого будет работать:

units.degC = <<somefunc of units.K>>

Но ясно, что это неправильный путь. Есть ли какие-либо предложения по чистой реализации преобразования единиц типа "смещение" в SymPy?

Примечание: я готов попробовать другие модули преобразования единиц, но не знаю ни одного, кроме Unum и нашел его громоздким.

Редактировать. Хорошо, теперь ясно, что сначала я хочу определить, находятся ли две сравниваемые величины в одной и той же системе координат. (например, единицы времени относятся к разным эпохам или часовым поясам или дБ к прямой амплитуде), выполните соответствующее преобразование, а затем выполните преобразование. Существуют ли общие инструменты управления системой координат? Это было бы прекрасно.

Я бы сделал предположение, что & # 176; F и & # 176; C всегда ссылаются на & # 916; & # 176; F & # 916; & # 176; C внутри выражения, но ссылаются на абсолютные, когда стоят в одиночестве. Мне было просто интересно, есть ли способ сделать units.degF функцией и добавить к ней декоратор property () , чтобы справиться с этими двумя условиями.

Но сейчас я установлю unit.C == units.K и попытаюсь сделать это очень ясно в документации, чтобы использовать функции convertCtoK (...) и convertFtoR (...) при работе с абсолютными единицами. (Шучу. Нет, не буду.)

Это было полезно?

Решение

Мне лично нравится количество благодаря его NumPy , однако она использует только относительные температуры, а не абсолютные.

Другие советы

В документации Unum есть довольно хорошая запись о том, почему это сложно:

  

Unum не может надежно обрабатывать преобразования между & # 176; Цельсия и Кельвина. Эта проблема называется «проблемой ложного происхождения»: 0 ° C определяется как 273,15 K. Это действительно особый и раздражающий случай, поскольку в целом на значение 0 не влияет преобразование единиц измерения, например 0 [м] = 0 [миль] = .... Здесь преобразование в градусы Кельвина / & # 176; Цельсия характеризуется коэффициентом 1 и смещением 273,15 К. Смещение невозможно в текущей версии Unum.

     

Более того, он, вероятно, никогда не будет интегрирован в будущую версию, поскольку существует также концептуальная проблема: смещение следует применять, если величина представляет абсолютную температуру, но не следует, если количество представляет разницу температур. Например, повышение температуры на 1 & # 176; Цельсия эквивалентна повышению на 1 К. Невозможно угадать, что у пользователя на уме, будь то абсолютная или относительная температура. Вопрос об абсолютных и относительных количествах не важен для других единиц, поскольку ответ не влияет на правило преобразования. Unum не может провести различие между этими двумя случаями.

Концептуально довольно легко увидеть проблемы с попыткой символически представить абсолютное преобразование температуры. Для любой нормальной относительной единицы (x unit) * 2 == (x * 2) unit & # 8212; unit math является коммутативной. При абсолютных температурах, которые нарушаются, трудно сделать что-либо более сложное, чем прямые преобразования температуры без других единичных размеров. Вероятно, лучше всего хранить все расчеты в Кельвинах и преобразовывать их в другие единицы температуры и обратно только в точках входа и выхода вашего кода.

Пример того, как это может работать:

>>> T(0*F) + 10*C
T(265.37222222222221*K) # or T(47767/180*K)
>>> T(0*F + 10*C)
T(283.15*K)
>>> 0*F + T(10*C)
T(283.15*K)
>>> 0*F + 10*C
10*K
>>> T(0*F) + T(10*C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'absolute_temperature' and \
'absolute_temperature'
>>> T(0*F) - T(10*C)
T(245.37222222222223*K) # or T(44167/180*K)
>>> 0*F - 10*C
-10*K

natu обрабатывает единицы температуры. Например, вы можете сделать это:

>>> from natu.units import K, degC, degF
>>> T = 25*degC
>>> T/K
298.1500
>>> T/degF
77.0000
>>> 0*degC + 100*K
100.0 degC

Префиксы также поддерживаются:

>>> from natu.units import mdegC
>>> 100*mdegC/K
273.2500

natu также обрабатывает нелинейные единицы, такие как децибел , а не только со смещениями, такими как градус Цельсия и градус Фаренгейта .

Относительно первого примера, который вы привели, вы можете сделать это:

>>> from natu import units
>>> 12*units.inch/units.m
0.3048

BTU уже встроен. Вы можете изменить его единицу отображения на m ** 2 * кг / с ** 2, но по умолчанию natu упрощает единицу измерения до J:

>>> from natu.units import BTU
>>> BTU.display = 'm2*kg/s2'
>>> 1*BTU
1055.05585262 J
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top