如何在sympy中评估表达式树?

时间:2015-06-21 01:41:47

标签: python sympy

这可能是一个非常基本的问题,但是我想知道在阅读完文档后是否遗漏了一个问题功能,或者是否真的没有包含在这个用例中。

我有以下表达式:

a = sympify("b + 5")
b = sympify("c + 5")
c = sympify("5")

我正在尝试评估一个。 是否有任何方式,sympy会对您进行所有递归搜索和替换,或者我是否真的必须手动执行此操作?

如:

eval(str(eval(str(a))))

1 个答案:

答案 0 :(得分:0)

区分符号和表达式:

import sympy as sy
a, b, c = sy.symbols('a:c')

a_expr = sy.sympify("b + 5")
b_expr = sy.sympify("c + 5")
c_expr = sy.sympify("5")

sy.solve([sy.Eq(a,a_expr), sy.Eq(b,b_expr), sy.Eq(c,c_expr)])

产量

{c: 5, b: 10, a: 15}

上面,a是一个符号,但a_expr是一个表达式:

In [117]: type(a)
Out[117]: sympy.core.symbol.Symbol

In [118]: type(a_expr)
Out[118]: sympy.core.add.Add

给出了诸如

之类的公式
formulas = {'a': 'b+5', 'b': 'c+5', 'c': '5'}

你可以用list comprehension

形成方程式
equations = [sy.Eq(sy.symbols(variable), sy.sympify(expr))
             for variable, expr in formulas.items()]

求解方程组
solution = sy.solve(equations)
# {c: 5, b: 10, a: 15}

为什么不应该使用sympy.var

处理动态变量时 - 直到名称未知的变量 运行时 - 建议避免使用sy.varsy.var添加了名称 变量到全局命名空间。这样做的唯一目的就是你 将按名称引用变量。但通过假设变量 在运行时之前,名称是未知的。所以脚本代码不应该 - 事实上, 不应该 - 通过名称引用变量。因此,如果变量是真正动态的,那么使用sy.var应该没用。

然而,这不是真正的问题。动态变量名称(作为字符串) 可以列出

In [22]: formulas.keys()
Out[22]: ['a', 'c', 'b']

可以使用

列出sy.Symbols
In [23]: solution.keys()
Out[23]: [c, b, a]

因此,您可以编写循环来访问每个变量,而无需定义 每个符号的全局变量名称。