繁体   English   中英

使用python等效操作评估sympy表达式

[英]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)
  • 我知道sympy正在用字符串转换我的值,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM