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

2023-11-30

我还很陌生SymPy并提出一个可能是基本问题的问题。或者我可能只是误解了 SymPy 的使用方式。

有没有办法创建一个不由原子表示而是由其他表达式组合表示的表达式?

Example:

>>> 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(或其他可打印)版本吗? (我在工作中受到严格的互联网使用限制,并且厌倦了周末在家工作。)

Update:

这就是我最终遵循 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))

Usage:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'

检查来源sympy.物理.单位您可以看到所有单位都是用米、千克、秒、安培、开尔文、摩尔和坎德拉来定义的。这些是基本单位。

那么一英里定义为 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 answer 获取文档。 Sympy 的存储库在这里:https://github.com/sympy/sympy

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SymPy:如何根据其他表达式返回一个表达式? 的相关文章

随机推荐