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(或其他可打印)版本吗?(我在工作中受到严苛的Internet使用限制,厌倦了周末在家工作。)
更新:
这就是我遵循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的来源,您会发现所有单位都是按照米,千克,秒,安培,开尔文,摩尔和坎德拉来定义的。这些是基本单位。
然后,将一英里定义为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 docs。