Pregunta

SymPy es una gran herramienta para hacer conversiones de unidades en Python:

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

Puedes rodar fácilmente el tuyo:

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

Sin embargo, no puedo implementar esto en mi aplicación a menos que pueda convertir grados C (absolutos) a K a grados F a grados R, o cualquier combinación de los mismos.

Pensé que tal vez algo como esto funcionaría:

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

Pero claramente ese es el camino equivocado para bajar. ¿Alguna sugerencia para implementar de forma limpia las conversiones de unidades de tipo "offset" en SymPy?

Nota: estoy abierto a probar otros módulos de conversión de unidades, pero no conozco ninguno además de Unum , y me pareció engorroso.

Editar: OK, ahora está claro que lo que quiero hacer es determinar primero si las dos cantidades a comparar están en el mismo sistema de coordenadas. (al igual que las unidades de tiempo hacen referencia a diferentes épocas o zonas horarias o dB a amplitud lineal), realice la transformación adecuada y luego realice la conversión. ¿Hay alguna herramienta general de gestión de sistemas de coordenadas? Eso seria genial.

Supongo que ° F y ° C siempre se refieren a ? ° F ? ° C ??dentro de una expresión, pero se refieren a absoluto cuando están solos. Me preguntaba si había una manera de hacer que units.degF fuera una función y aplicarle una decoradora property () para tratar esas dos condiciones.

Pero por ahora, estableceré units.C == units.K e intentaré dejarlo muy claro en la documentación para usar las funciones convertCtoK (...) y convertFtoR (...) cuando se trata de unidades absolutas. (Es broma. No, no lo haré).

¿Fue útil?

Solución

Personalmente me gustan Cantidades gracias a su integración NumPy , sin embargo, solo tiene temperaturas relativas, no absolutas.

Otros consejos

La documentación de Unum tiene una muy buena descripción de por qué esto es difícil:

  

Unum no puede manejar conversiones confiables entre ° Celsius y Kelvin. El problema se conoce como el 'problema del origen falso': el 0 ° Celsius se define como 273,15 K. Este es realmente un caso especial y molesto, ya que en general el valor 0 no se ve afectado por la conversión de unidades, p. Ej. 0 [m] = 0 [millas] = .... Aquí, la conversión Kelvin / ° Celsius se caracteriza por un factor 1 y una compensación de 273,15 K. La compensación no es factible en la versión actual de Unum.

     

Además, presumiblemente nunca se integrará en una versión futura porque también existe un problema conceptual: la compensación debe aplicarse si la cantidad representa una temperatura absoluta, pero no debería si la cantidad representa una diferencia de temperaturas. Por ejemplo, un aumento de temperatura de 1 ° Celsius es equivalente a un aumento de 1 K. Es imposible adivinar lo que está en la mente del usuario, ya sea una temperatura absoluta o relativa. La cuestión de las cantidades absolutas vs relativas no es importante para otras unidades ya que la respuesta no afecta la regla de conversión. Unum no puede hacer la distinción entre los dos casos.

Es bastante fácil ver conceptualmente los problemas al tratar de representar simbólicamente la conversión de temperatura absoluta. Con cualquier unidad relativa normal, (x unit) * 2 == (x * 2) unit : la unidad matemática es conmutativa. Con temperaturas absolutas, eso se descompone: es difícil hacer algo más complejo que las conversiones de temperatura directas sin otras dimensiones unitarias. Probablemente sea mejor mantener todos los cálculos en Kelvin, y convertir hacia y desde otras unidades de temperatura solo en los puntos de entrada y salida de su código.

Ejemplo, cómo podría funcionar:

>>> 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

El paquete natu maneja unidades de temperatura. Por ejemplo, puedes hacer esto:

>>> 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

Los prefijos también son compatibles:

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

natu también maneja unidades no lineales como decibel , no solo aquellos con desplazamientos como grado Celsius y grado Fahrenheit .

En relación con el primer ejemplo que dio, puede hacer esto:

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

BTU ya está incorporado. Puede cambiar su unidad de visualización a m ** 2 * kg / s ** 2, pero por defecto natu simplifica la unidad a J:

>>> from natu.units import BTU
>>> BTU.display = 'm2*kg/s2'
>>> 1*BTU
1055.05585262 J
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top