SymPy:如何根据其他表达式返回表达式?

时间:2010-01-10 18:49:02

标签: python sympy

我对SymPy很新,并且可能是一个基本问题。或者我可能只是误解了应该如何使用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'

3 个答案:

答案 0 :(得分:2)

检查sympy.physics.units的来源,您可以看到所有单位都以米,千克,秒,安培,开尔文,鼹鼠和坎德拉来定义。这些是基本单位。

然后一英里被定义为5280英尺,一英尺被定义为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答案获取文档。 Sympy的存储库位于:https://github.com/sympy/sympy

docs文件夹中有一个README文件,描述了如何创建html文档。

答案 1 :(得分:2)

还有quantities

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

答案 2 :(得分:1)

在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

唯一的问题是您最终得到无量纲数量。您可能还会考虑此类事件的Quantities包:

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

还有Unum

我不知道症状文档的PDF版本,但您可以从其存储库中检查分发并自行使用Sphinx to generate a PDF