Frage

SymPy ist ein großartiges Tool für die Einheitenumrechnung in Python:

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

Sie können es ganz einfach selbst rollen:

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

Ich kann dies jedoch nicht in meine Anwendung implementieren, es sei denn, ich kann Grad C (absolut) in K in Grad F in Grad R oder eine beliebige Kombination davon umwandeln.

Ich dachte, vielleicht würde so etwas funktionieren:

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

Aber das ist eindeutig der falsche Weg.Irgendwelche Vorschläge zur sauberen Implementierung von Einheitenumrechnungen vom Typ „Offset“ in SymPy?

Notiz:Ich bin offen dafür, andere Einheitenumrechnungsmodule auszuprobieren, kenne aber keine anderen Unum, und fand es umständlich.

Bearbeiten:OK, jetzt ist klar, dass ich zunächst feststellen möchte, ob die beiden zu vergleichenden Größen im selben Koordinatensystem liegen.(z. B. Zeiteinheiten beziehen sich auf verschiedene Epochen oder Zeitzonen oder dB auf reine Amplitude), nehmen Sie die entsprechende Transformation vor und führen Sie dann die Konvertierung durch.Gibt es allgemeine Tools zur Koordinatensystemverwaltung?Das wäre großartig.

Ich gehe davon aus, dass sich °F und °C innerhalb eines Ausdrucks immer auf Δ°F Δ°C beziehen, sich aber einzeln auf absolute Werte beziehen.Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, es zu machen units.degF eine Funktion und schlagen Sie einen Dekorateur property() darauf, mit diesen beiden Bedingungen umzugehen.

Aber für den Moment werde ich es festlegen units.C == units.K und versuchen Sie, in der Dokumentation die Verwendung von Funktionen deutlich zu machen convertCtoK(...) Und convertFtoR(...) beim Umgang mit absoluten Einheiten.(Nur ein Scherz.Nein, das werde ich nicht.)

War es hilfreich?

Lösung

Ich persönlich mag Mengen Danke an sein Numpy Integration, jedoch nur relative Temperaturen, nicht absolut.

Andere Tipps

Die Unum -Dokumentation hat eine ziemlich gute Abgabe darüber, warum dies schwierig ist:

Unum kann keine zuverlässigen Umwandlungen zwischen ° Celsius und Kelvin zuverlässig behandeln. Das Problem wird als "falsches Ursprungsproblem" bezeichnet: Der 0 ° Celsius wird als 273.15 K definiert. Dies ist wirklich ein besonderer und nerviger Fall, da im Allgemeinen der Wert 0 durch Einheitsumwandlung nicht beeinflusst wird, z. B. 0 [m] = 0 [Meilen] = .... Hier ist der Umwandlungskelvin/° Celsius durch einen Faktor 1 und einen Versatz von 273,15 K gekennzeichnet. Der Versatz ist in der aktuellen Version von Unum nicht möglich.

Darüber hinaus wird es vermutlich nie in eine zukünftige Version integriert, da es auch ein konzeptionelles Problem gibt: Der Offset sollte angewendet werden, wenn die Menge eine absolute Temperatur darstellt, dies jedoch nicht, wenn die Menge eine Differenz der Temperaturen darstellt. Beispielsweise ist eine Erhöhung der Temperatur von 1 ° Celsius einer Erhöhung von 1 K entspricht. Es ist unmöglich zu erraten, was im Benutzer der Benutzer ist, ob es sich um eine absolute oder eine relative Temperatur handelt. Die Frage der absoluten und relativen Größen ist für andere Einheiten unwichtig, da die Antwort die Konversionsregel nicht beeinflusst. Unum kann nicht zwischen den beiden Fällen unterschieden.

Es ist ziemlich einfach, die Probleme mit dem Versuch zu sehen, die absolute Temperaturumwandlung symbolisch darzustellen. Mit jeder normalen relativen Einheit, (x unit) * 2 == (x * 2) unit- Einheit Mathematik ist kommutativ. Mit absoluten Temperaturen bricht das zusammen - es ist schwierig, etwas Komplexeres als geradlinige Temperaturumwandlungen ohne andere Abmessungen der Einheiten durchzuführen. Sie sind wahrscheinlich am besten davon ab, alle Berechnungen in Kelvin zu behalten und nur an den Eingangs- und Ausgangspunkten Ihres Codes in und von anderen Temperatureinheiten umzuwandeln.

Beispiel, wie es funktionieren könnte:

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

Der natu Das Paket verwaltet Temperatureinheiten.Sie können beispielsweise Folgendes tun:

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

Präfixe werden ebenfalls unterstützt:

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

natu Behandelt auch nichtlineare Einheiten wie die Dezibel, nicht nur solche mit Offsets wie Grad Celsius Und Grad Fahrenheit.

Bezogen auf das erste Beispiel, das Sie gegeben haben, können Sie Folgendes tun:

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

BTU ist bereits eingebaut.Sie können die Anzeigeeinheit standardmäßig auf m**2*kg/s**2 ändern natu vereinfacht die Einheit zu J:

>>> from natu.units import BTU
>>> BTU.display = 'm2*kg/s2'
>>> 1*BTU
1055.05585262 J
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top