2017-03-07 45 views
0

我想用符號生成方程,然後在值與類型的子從庫等uncertainties(但也可以是使用自定義類型的任何庫),但是,似乎使用.evalf(subs={...})方法失敗,而奇錯誤信息:評估與Python等效的操作sympy表達

>>> 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)) sympy被轉換我的價值用繩子給'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表達式?

回答

2

也許你想多了,但你可以創建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 
+0

清楚,既更容易,更迂迴,然後我期待,這(與一個以上參數)正是我所需要的,所以我實際上要使用的代碼是'return lambdify(subs.keys(),expr)(* subs.values())'非常感謝你! –

0

我目前的解決方案是隻使用一個鬆散的呼叫eval這似乎不是個好主意,尤其是因爲Sympy is fine with Basic.__str__ method being monkey patched.

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而不是默認的數學模塊。