シンピー:他の式に関して式を返すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2038100

  •  19-09-2019
  •  | 
  •  

質問

私はかなり初心者です シンピー そして、基本的な質問かもしれません。あるいは、単に SymPy の使用方法を誤解しているだけかもしれません。

原子ではなく、他の式の組み合わせによって表現を作成する方法はありますか?

例:

>>> from sympy.physics.units import *
>>> expr1 = m/s
>>> expr2 = mile/hour
>>> expr1
m/s
>>> expr2
1397*m/(3125*s)
>>> expr1.in_terms_of([mile,hour]) #in my dreams?
3125*mile/(1397*hour)
>>> 

余談ですが:完全な SymPy ドキュメントの「公式」 PDF (またはその他の印刷可能な) バージョンを見つけることはできますか?(職場では厳しいインターネット使用制限を受けており、週末に家で仕事をするのにうんざりしています。)

アップデート:

Preludeさんの提案に従って最終的にはこれになりましたが、汚い感じがするのでこのままではあまり使えそうにありません。コメントやWTFは大歓迎です。

def in_terms_of(self, terms):
    expr2 = eval(str(self), physics.units.__dict__)
    converter = {}
    for term in terms:
        term_expr = physics.units.__dict__[term]
        coeff = term_expr.as_coeff_terms()[0]
        unit = physics.units.Unit('my_'+term, term)
        converter[term_expr/coeff] = unit/coeff
    return str(expr2.subs(converter))

使用法:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'
役に立ちましたか?

解決

ソースを確認すると、 sympy.physics.units すべての単位がメートル、キログラム、秒、アンペア、ケルビン、モル、カンデラで定義されていることがわかります。これらが基本単位です。

次に、1 マイルは 5280 フィート、1 フィートは 0.3048 メートルと定義されます。

したがって、非基本単位を使用するすべての式では、非基本単位が基本単位に置き換えられます。

特定の単位を使用する式が必要な場合は、式に代入できる独自の単位を定義できます。

import sympy.physics.units as units
from sympy import Rational

my_mile = units.Unit('my_mile', 'mile')
my_hour = units.Unit('my_hour', 'hour')

次に、新しい単位を基本単位に置き換える辞書を定義します。

converter = {units.m: my_mile/Rational('1609.344'),
             units.s: my_hour/Rational('3600')}

すべての計算は基本単位を使用して実行します。その後、マイルと時間を使用した値が必要な場合は、式に新しい単位を代入できます。

v = 10*units.miles/units.hour
print v # = 2794*m/(625*s)

print v.subs(converter) # = 10*mile/hour

ドキュメントを取得するには、ars Answer を使用します。Sympy のリポジトリはここにあります。 https://github.com/sympy/sympy

docs フォルダーには、HTML ドキュメントの作成方法を説明した README ファイルがあります。

他のヒント

それもあります :

In [1]: from quantities import *
In [2]: v = 1397*m / (3125*s)
In [3]: v
Out[3]: array(0.44704) * m/s
In [8]: v.units = mile/hour
In [9]: v
Out[9]: array(1.0) * mi/h

sympy 単位では、次のように除算して expr1 から expr2 に変換します。

In [120]: import sympy.physics.units as units

In [121]: expr1 = units.m / units.s

In [122]: expr2 = units.miles / units.hour

In [123]: a = (1397/3125) * expr1 / expr2

In [124]: a
Out[124]: 1

唯一の問題は、最終的には無次元の量になってしまうことです。を検討することもできます。 このタイプのもののパッケージ:

In [125]: import quantities as pq

In [126]: a = pq.Quantity(1397/3125, 'm/s')

In [127]: a
Out[127]: array(0.44703999999999999) * m/s

In [128]: a.units = pq.mile / pq.hour

In [129]: a
Out[129]: array(1.0) * mi/h

それもあります ウヌム.

sympy ドキュメントの PDF 版は知りませんが、リポジトリから配布物をチェックアウトして使用できるかもしれません。 PDF を生成する Sphinx あなた自身のための。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top