Conversión de unidades con Python 3
Librería pint
Hay varias bibliotecas de Python que incorporan unidades en los cálculos de Python. Entre estos, pint es una biblioteca relativamente nueva que se basa en la experiencia con intentos anteriores.
Pint es un paquete de Python para definir, operar y manipular cantidades físicas: el producto de un valor numérico y una unidad de medida. Permite operaciones aritméticas entre ellos y conversiones desde y hacia diferentes unidades.
Para comenzar debemos instalar la librería en nuestro interprete de python, en este caso Anaconda, para esto debemos escribir lo siguiente en nuestra terminal (como se muestra en la imagen) y posteriormente presionar ENTER, si utilizas windows debes buscar Anaconda Prompt (debe iniciar con permisos de administrador).
- pip install pint
- from pint import UnitRegistry
- ur = UnitRegistry()
Operaciones con unidades multiplicativas
El registro de unidades proporciona un medio simple para asignar unidades utilizando el operador de multiplicación. Por ejemplo, aquí se explica cómo calcular la molaridad de una solución de cloruro de sodio en 58.44 gramos de NaCl (mw = 58.44) se ha disuelto en agua para formar 3 litros de solución.El código para este ejemplo seria el siguiente:
- from pint import UnitRegistry
- ur = UnitRegistry()
- # datos del problema
- V = 3.0 * ur.liters
- m = 58.44 * ur.grams
- mw = 58.44 * ur.grams/ur.mol
- # calcular molaridad
- C = m/(mw*V)
- print(C)
0.3333333333333333 mole / liter
Conversión de unidades
Cada variable con unidades tiene disponibles los métodos to() e ito() para convertir la cantidad a un conjunto de unidades deseado. El método to() se usa para crear una nueva variable al convertir una variable existente a las unidades indicadas. Por ejemplo:- x = 0.5 * ur.kilogram/ur.gallon
- y = x.to(ur.gram/ur.liter)
- print(x)
- print(y)
El resultado es el siguiente:
0.5 kilogram / gallon
132.08602617907428 gram / liter
Por otro lado, el método ito() convierte una variable existente "en el lugar". Modificando el ejemplo anterior obtenemos lo siguiente:
- x = 0.5 * ur.kilograms/ur.gallon
- x.ito(ur.grams/ur.liter)
- print(x)
Notamos que el método to() nos da la opción de crear una nueva variable o heredarlo sobre la misma, a diferencia el método ito() el cual únicamente hereda el valor en la misma variable.
Para ejemplificar el uso de ambos métodos, en el siguiente código se ilustra cómo calcular la molaridad de una solución de cloruro de sodio en la que se han disuelto 0.5 libras de NaCl (mw = 58.44) en agua para formar 2 galones de solución.
- # Datos del problema
- V = 3.0 * ur.gallons
- m = 0.5 * ur.lbs
- mw = 58.44 * ur.grams/ur.mol
- # calculamos la concentration
- C = m/(mw*V)
- print(C)
- # convertir a las unidades deseadas e imprimir
- C = C.to(ur.mol/ur.liter)
- print(C)
- # convertir a moles por gallon
- C.ito(ur.mol/ur.gallon)
- print(C)
- 0.0028519279032626055 mole * pound / gallon / gram
- 0.34173633161332617 mole / liter
- 1.293612736710016 mole / gallon
Unidades de temperatura y otras unidades de compensación (no multiplicativas)
Algunos ejemplos de unidades no multiplicativas son grados Celsius, grados Fahrenheit y presión manométrica. Para estas unidades, el cero de la escala de medición se compensa con respecto al cero absoluto de la cantidad física subyacente. En estos casos, las unidades se asignan utilizando la función Quantity() del módulo UnitRegistry. Para ejemplificar el uso escribimos el siguiente codigo:- >>> T = ur.Quantity(25,ur.degC)
- >>> print(T, " = ", T.to(ur.degF))
- 25 degree_Celsius = 76.99999999999993 degree_Fahrenheit
Ejemplos
Problema 1La viscosidad de una sustancia es de 10 centipoises. ¿Cuál es el valor de esa viscosidad en $Ib/pie \cdot s$ ? Nota: 1 centipoise = 0.01 poise = 0.01 g/cm s
Este ejercicio se resolvió en una entrada anterior, por lo tanto ya conocemos los resultados. Un ejemplo de código para resolver este problema seria el siguiente:
- from pint import UnitRegistry
- ur = UnitRegistry()
- # datos del problema
- v=10 *ur.centipoise
- print(v)
- v=v.to(ur.poise)
- print(v)
- v.ito(ur.pound/(ur.foot*ur.second))
- print(v)
10 centipoise
0.1 poise
0.006719689751395069 pound / foot / second
Los resultados coinciden.
Problema 2
La conductividad térmica del aluminio es de 120 BTU/h ft °F. Calcule su conductividad en kcal/h m°C y en W/m °K.
De igual manera, este ejercicio ya fue resuelto manualmente en la entrada anterior, pero este problema no podemos resolverlo de manera "directa", ya que dentro de la librería no hay el cambio entre tamaños de grado, pero podemos agregar este en una linea adicional de la siguiente manera. No olvide que al final debería ubicar el °F en el divisor. El ejemplo de código seria el siguiente:
- from pint import UnitRegistry
- ur = UnitRegistry()
- # datos del problema
- k=120*ur.Btu/(ur.hour*ur.foot)
- print(k,'/°F')
- k=120*1.8*ur.Btu/(ur.hour*ur.foot)
- k=k.to(ur.kcal/(ur.hour*ur.meter))
- print(k,'/°C')
- k.ito(ur.watt/ur.meter)
- print(k,'/°K')
120.0 british_thermal_unit / foot / hour /°F
178.6992065762334 kilocalorie / hour / meter /°C
207.68818897637794 watt / meter /°K
De esta forma podemos resolver este tipo de problemas, pero hay que ser muy cuidadoso para no cometer un calculo incorrecto.
Referencias
- GitHub (s.f.). Pint: makes units easy. [Fecha de consulta 1 de mayo 2020]. Disponible en: https://github.com/hgrecco/pint
Bien :)
ResponderBorrar