2009-06-22 10 views
11

SymPy è un ottimo strumento per fare conversioni di unità in Python:disponibilità in Python

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

Si può facilmente rotolare il proprio:

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

Tuttavia, non posso implementare questa nella mia applicazione, a meno Posso convertire i gradi C (assoluto) in K in gradi F in gradi R o qualsiasi combinazione di essi.

ho pensato che forse qualcosa di simile a questo dovrebbe funzionare:

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

Ma è chiaro che questa è la strada sbagliata per scendere. Qualche suggerimento per implementare in modo pulito le conversioni delle unità di tipo "offset" in SymPy?

Nota: sono aperto a provare altri moduli di conversione unità, ma non conosco alcun altro oltre a Unum e l'ho trovato ingombrante.

Modifica: OK, ora è chiaro che ciò che voglio fare è determinare innanzitutto se le due grandezze da confrontare si trovano nello stesso sistema di coordinate. (come le unità di tempo che fanno riferimento a epoche o fusi orari diversi o dB a un'ampiezza diretta), effettuare la trasformazione appropriata, quindi effettuare la conversione. Esistono strumenti generali di gestione dei sistemi di coordinate? Sarebbe grandioso.

Vorrei supporre che ° F e ° C si riferiscano sempre ad Δ ° F Δ ° C ​​all'interno di un'espressione ma si riferiscono ad assoluto quando si è soli. Mi stavo chiedendo se ci fosse un modo per rendere una funzione units.degF e schiaffare un decoratore property() su di esso per far fronte a queste due condizioni.

Ma per ora, mi misi units.C == units.K e cercare di mettere bene in chiaro nella documentazione utilizzare le funzioni convertCtoK(...) e convertFtoR(...) quando si tratta di unità assolute. (Sto scherzando No non lo farò..)

+2

Peccato che sympy.physics.units non abbia documentazione. –

+0

Le unità GNU le separano in 'degF' e' tempF (x) ': https://www.gnu.org/software/units/manual/units.html#Temperature-Conversions – endolith

risposta

4

Personalmente mi piace Quantities grazie alla sua integrazione NumPy, tuttavia fa solo temperature relative, non assolute.

+0

Penso che potresti farmi vendere su Quantities. Nice and lightwieght, integrazione numpy e/incertezze/per l'avvio. Grazie. ..ancora una soluzione decente per il "problema del sistema di coordinate offset". – Paul

+0

Lo consiglieresti su [unità] (https://pypi.python.org/pypi/units/)? – endolith

8

La documentazione Unum ha una buona writeup sul perché questo è difficile:

Unum è in grado di gestire in modo affidabile le conversioni tra ° Celsius e Kelvin. Il problema è indicato come "problema di origine falsa": lo 0 ° Celsius è definito come 273,15 K. Questo è davvero un caso speciale e noioso, poiché in generale il valore 0 non è influenzato dalla conversione di unità, ad es. 0 [m] = 0 [miglia] = .... Qui, la conversione Kelvin/° Celsius è caratterizzata da un fattore 1 e un offset di 273,15 K. L'offset non è fattibile nella versione corrente di Unum.

Inoltre, presumibilmente non sarà mai integrato in una versione futura perché esiste anche un problema concettuale: l'offset dovrebbe essere applicato se la quantità rappresenta una temperatura assoluta, ma non dovrebbe se la quantità rappresenta una differenza di temperature. Ad esempio, un innalzamento della temperatura di 1 ° C è equivalente a un aumento di 1 K. È impossibile indovinare cosa c'è nella mente dell'utente, che si tratti di una temperatura assoluta o relativa. La questione delle quantità assolute e relative non è importante per le altre unità poiché la risposta non influisce sulla regola di conversione. Unum non è in grado di fare la distinzione tra i due casi.

È piuttosto facile vedere concettualmente i problemi cercando di rappresentare simbolicamente la conversione della temperatura assoluta. Con qualsiasi unità relativa normale, la matematica dell'unità (x unit) * 2 == (x * 2) unit è commutativa.Con temperature assolute, che si rompono, è difficile fare qualcosa di più complesso delle conversioni di temperatura diritte senza altre dimensioni dell'unità. Probabilmente stai meglio tenere tutti i calcoli in Kelvin e convertirli in e da altre unità di temperatura solo nei punti di entrata e di uscita del tuo codice.

+3

C'è un motivo per cui ci sono entrambi datetime e timedelta oggetti. Cosa impedisce di fare lo stesso per la temperatura? – jfs

+0

È possibile farlo, non è possibile integrare le unità di temperatura assoluta in una libreria matematica simbolica in cui la matematica dell'unità è commutativa. – Miles

+0

È possibile integrarlo perfettamente. Vedi la mia risposta http://stackoverflow.com/questions/1025145/units-conversion-in-python/1025258#1025258 – jfs

0

esempio, come potrebbe funzionare:

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

>>> T (0 * F + 10 * C) #? – Miles

+0

@Miles: Grazie per aver reso il tuo commento criptico come la risposta! Qualcosa è stato lasciato fuori dalla copia/incolla. T è un Tesla in fisica. Ma suppongo di dover ridefinirlo da solo .. – Paul

+0

@bpowah: 'T' è' absolute_temperature' qui. – jfs

0

Il pacchetto natu gestisce unità di temperatura. Per esempio, si può fare questo: sono supportati anche

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

prefissi:

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

natu gestisce anche le unità non lineari come la decibel, non solo quelli con offset come degree Celsius e degree Fahrenheit.

relativi al primo esempio che ha dato, si può fare questo:.

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

BTU è già integrato nel È possibile modificare la sua unità di visualizzazione di m ** 2 * kg/s ** 2, ma per impostazione predefinita natu semplifica l'unità su J:

>>> from natu.units import BTU 
>>> BTU.display = 'm2*kg/s2' 
>>> 1*BTU 
1055.05585262 J 
Problemi correlati