如何在sympy中计算表达式树?

2024-10-16 22:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有以下表述:

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

我想评估a。 你真的可以用递归的方法来代替吗?在

例如:

^{pr2}$

Tags: 方法文档功能用例sypy遗漏pr2sympify
1条回答
网友
1楼 · 发布于 2024-10-16 22:25:16

区分符号和表达式:

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)])

收益率

^{pr2}$

上面,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]

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

相关问题 更多 >