[英]Convert string of a named expression in sympy to the expression itself
实际问题描述:
我已经使用sympy
定义了许多表达式,如
import sympy as sp
a, b = sp.symbols('a,b', real=True, positive=True)
Xcharles_YclassA_Zregion1 = 1.01 * a**1.01 * b**0.99
Xbob_YclassA_Zregion1 = 1.009999 * a**1.01 * b**0.99
Xbob_YclassA_Zregion2 = 1.009999 * a**1.01 * b**0.99000000001
...
所以我使用表达式的名称来描述类别(例如X
)中的选项(例如charles
、 bob
)。
现在我想要一个 function 接受两个字符串(例如, 'Xcharles_YclassA_Zregion1'
和'Xbob_YclassA_Zregion1'
)并返回其简化比率(在本例中为1.00000099009999
),因此我可以快速检查它们在结果方面的“差异”,不是根据它们的书写方式。 例如, 2*a
和a*2
对于我的目标是相同的。
我怎样才能做到这一点?
注意事项:
Xcharles_YclassA_Zregion2
可能不存在。 实际上,如果我要为现有的表达式名称编写一个表,它会被稀疏地填充。dict
重写我的代码来存储表可能会解决我的问题。 但是我必须为此修改很多代码。Symbol
(这是一个特定的类)和expression之间是否有任何形式上的区别。 从我阅读的资料(例如, 这个)我没有得出结论。 这种理解可能有助于解决问题。TL;DR - 我试过的
我的目标是类似
def verify_ratio(vstr1, vstr2):
"""Compare the result of two different computations of the same quantity"""
ratio = sp.N(sp.parsing.sympy_parser.parse_expr(vstr1)) / sp.parsing.sympy_parser.parse_expr(vstr2)
print(vstr1 + ' / ' + vstr2, '=', sp.N(ratio))
return
这没有用。 下面的代码说明了原因
import sympy as sp
a, b = sp.symbols('a,b', real=True, positive=True)
expr2 = 1.01 * a**1.01 * b**0.99
print(type(expr2), '->', expr2)
expr2b = sp.parsing.sympy_parser.parse_expr('expr2')
print(type(expr2b), '->', expr2b)
expr2c = sp.N(sp.parsing.sympy_parser.parse_expr('expr2'))
print(type(expr2c), '->', expr2c)
#print(sp.N(sp.parsing.sympy_parser.parse_expr('expr2')))
expr2d = sp.sympify('expr2')
print(type(expr2d), '->', expr2d)
output
<class 'sympy.core.mul.Mul'> -> 1.01*a**1.01*b**0.99
<class 'sympy.core.symbol.Symbol'> -> expr2
<class 'sympy.core.symbol.Symbol'> -> expr2
<class 'sympy.core.symbol.Symbol'> -> expr2
我需要一些接受字符串'expr2'
并返回表达式1.01 * a**1.01 * b**0.99
的东西。
我的尝试都没有达到目标。 没有帮助的问题或链接(至少对我而言):
如果在解析时要使用已映射到变量的表达式,则必须传递 python 用来跟踪这些映射的字典,即locals()
>>> from sympy.abc import x
>>> from sympy import sympify, parse_expr
>>> y = x + 2
>>> sympify('y')
y
>>> sympify('y', locals=locals())
x + 2
>>> parse_expr('y', local_dict=locals())
x + 2
正如 Sympy Google 小组的 Oscar Benjamin 所建议的那样, eval
完成了这项工作
def verify_ratio(vstr1, vstr2):
"""Compare the result of two different computations of the same quantity"""
print(vstr1 + ' / ' + vstr2, '=', eval(vstr1 + ' / ' + vstr2))
return
表明这行得通的是
>>> import sys
>>> import sympy as sp
>>> a, b = sp.symbols('a,b', real=True, positive=True)
>>> a is eval('a')
True
就我而言,我在vstr1
和vstr2
中使用的所有表达式和符号都是全局的。 如果嵌套在其他函数中,我可能需要将更多参数传递给verify_ratio
,就像 smichr 的解决方案一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.