[英]evaluate sympy expression with python equivalent operations
我想象征性地生成方程式,然后用uncertainties
类的库中的子类型值(但可以是任何具有自定义类型的库),但是似乎使用.evalf(subs={...})
方法会失败,而且有点奇怪错误信息:
>>> from uncertainties import ufloat
>>> from sympy.abc import x
>>> (x**2).evalf(subs={x: ufloat(5,1)})
Traceback (most recent call last):
...
File "<string>", line 1
Float ('5.0' )+/-Float ('1.0' )
^
SyntaxError: invalid syntax
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#116>", line 1, in <module>
(x**2).evalf(subs={x: ufloat(5,1)})
...
sympy.core.sympify.SympifyError: Sympify of expression 'could not parse '5.0+/-1.0'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
str(ufloat(5,1))
给出了'5.0+/-1.0'
所以它显然希望替代值的字符串表示形式看起来像是符号表达式。 我知道许多sympy操作(例如微分)将无法支持这一点,并且只有在所有自由符号都被替换后才有可能,因为这两种类型不能很好地发挥作用:
>>> x + ufloat(5,1)
Traceback (most recent call last):
File "<pyshell#117>", line 1, in <module>
x + ufloat(5,1)
TypeError: unsupported operand type(s) for +: 'Symbol' and 'Variable'
但是,假设我不留下任何符号运算/变量,是否可以使用python等效运算简单地评估sympy表达式?
也许您想要更多,但是您可以仅通过sympy表达式创建普通函数,然后使用不确定性
from uncertainties import ufloat
from sympy.abc import x
from sympy.utilities.lambdify import lambdify
expr = x**2
f = lambdify(x, expr)
f(ufloat(5,1))
Out[5]: 25.0+/-10.0
我当前的解决方案只是使用对eval
的松散调用,这似乎不是一个好主意,尤其是因为Sympy 可以很好地使用猴子打补丁的Basic.__str__
方法。
import math, operator
eval_globals = {"Mod":operator.mod}
eval_globals.update(vars(math))
def eval_sympy_expr(expr, **subs):
return eval(str(expr), eval_globals, subs)
为了获得uncertainties
支持,我只需import uncertainties.umath as math
而不是默认的数学模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.