11

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、華氏からR、またはそれらの組み合わせを変換できない限り、これをアプリケーションに実装することはできません。

私は多分このようなものがうまくいくと思いました:

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

しかし、明らかにそれは間違った道です。SymPyで「オフセット」タイプの単位変換をきれいに実装するための提案はありますか?

注:私は他の単位変換モジュールを試してみることにオープンですが、Unum以外は何も知らず、面倒であることがわかりました。

編集:わかりました。最初に、比較する2つの量が同じ座標系にあるかどうかを判断する必要があることは明らかです。(異なるエポックまたはタイムゾーンを参照する時間単位、または直線振幅へのdBのように)、適切な変換を行ってから、変換を行います。一般的な座標系管理ツールはありますか?それは素晴らしいことです。

私は、°Fと°Cは常に式内のΔ°FΔ°Cを参照していると仮定しますが、スタンドアロンの場合は絶対値を参照します。これらの2つの条件に対処するためunits.degFに、関数を作成し、それにデコレータを叩く方法があるかどうか疑問に思っていました。property()

しかし、今のところ、関数を使用する場合と絶対単位を扱う場合は、ドキュメントで非常に明確にするように設定してunits.C == units.Kみます。(冗談です。いいえ、しません。)convertCtoK(...)convertFtoR(...)

4

4 に答える 4

8

Unum のドキュメントには、これが難しい理由についてのかなり良い記事があります。

Unum は、°Celsius と Kelvin の間の確実な変換を処理できません。この問題は「偽原点問題」と呼ばれます。摂氏 0°は 273.15 K と定義されています。一般に、0 [m] = 0 などのように値 0 は単位変換の影響を受けないため、これは本当に特別で面倒なケースです。 [マイル] = ... . ここで、変換ケルビン/°Celsius は、係数 1 と 273.15 K のオフセットによって特徴付けられます。オフセットは、現在のバージョンの Unum では実行できません。

さらに、概念的な問題もあるため、おそらく将来のバージョンに統合されることはありません。量が絶対温度を表す場合はオフセットを適用する必要がありますが、量が温度差を表す場合は適用しないでください。たとえば、摂氏 1 度の温度上昇は 1 度の温度上昇に相当します。絶対温度であろうと相対温度であろうと、ユーザーが何を考えているかを推測することは不可能です。絶対量と相対量の問題は、答えが変換規則に影響を与えないため、他の単位にとっては重要ではありません。Unum は 2 つのケースを区別できません。

絶対温度変換を記号で表現しようとすると、問題を概念的に理解するのは非常に簡単です。通常の相対単位では、(x unit) * 2 == (x * 2) unit単位演算は交換可能です。絶対温度では、これはうまくいきません。他の単位次元がない単純な温度変換よりも複雑なことを行うのは困難です。おそらく、すべての計算をケルビンで行い、コードの入口と出口でのみ他の温度単位との変換を行うのが最善でしょう。

于 2009-06-22T01:00:47.443 に答える
4

個人的には、 NumPy統合のおかげでQuantitiesが気に入っていますが、これは絶対温度ではなく相対温度のみを処理します。

于 2009-06-22T01:07:29.177 に答える