SymPy:如何使用其他表达式返回表达式?
我对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(或其它可打印)版本? (我在工作中严厉互联网的使用限制,累了在家里的周末做的工作。)
更新:
这是我结束了以下前奏的建议,但它不是因为它感觉很脏,所以可能会像这样得到很多用途。评论和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的来源,你可以看到所有的单位都是以米,千克,秒,安培,开尔文,摩尔和坎德拉定义的。这些是基本单位。
然后一英里定义为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 sympy单位除以:
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。
我不知道sympy文档的PDF版本,但是您可能能够从他们的存储库检查分发并自行使用Sphinx to generate a PDF。
+ = 1。但是,我还没有准备好将它带入战场。 ..和Sphinx2pdf – Paul 2010-01-12 03:29:49
这里还有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
你会很高兴地听到,有SymPy的下一个版本,我们计划出货了HTML文档和PDF文档下载。数量为 – asmeurer 2012-09-13 02:42:02