这可能是一个非常基本的问题,但是我想知道在阅读完文档后是否缺少了sympy功能,或者此用例是否真的不包含此功能。
我有以下表达式:
a = sympify("b + 5")
b = sympify("c + 5")
c = sympify("5")
我正在尝试评估。sympy是否可以为您进行所有递归搜索和替换,还是我真的必须手动进行?
如:
eval(str(eval(str(a))))
区分符号和表达式:
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'}
您可以通过列表理解来形成方程式
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.var
。sy.var
将变量的名称添加到全局名称空间。这样做的唯一目的是如果您要通过name引用变量。但是通过假设,变量名在运行时才是未知的。因此,脚本代码不应(实际上应该不应该)按名称引用变量。因此,sy.var
如果变量确实是动态的,则使用应该是无用的。
但这不是真正的问题。动态变量名称(作为字符串)可以用
In [22]: formulas.keys()
Out[22]: ['a', 'c', 'b']
并且sy.Symbols
可以列出
In [23]: solution.keys()
Out[23]: [c, b, a]
因此,您无需编写每个符号的全局变量名称,就可以编写循环来访问每个变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句