2017-03-07 8 views
0

式を象徴的に生成し、uncertaintiesのようなライブラリの型を持つ値をサブタイプしたいとしますが(カスタムタイプのライブラリでも可能です)、.evalf(subs={...})メソッドを使用すると、エラーメッセージ:sympy式をPythonの同等の演算で評価する

>>> 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が文字列で私の値を変換している知っています。

は、私が(差別のような)多くのsympy操作がこれをサポートすることはできないことを知っていると、すべての自由のシンボルが2つの種類が素晴らしいプレーしていないので、置換された場合にのみ可能である:

>>> 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 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にしてくださいevalに緩い呼び出しを使用している

答えて

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

も、この(もっとして1つの引数を持つ)を使用することができます私が実際に使用するコードは 'return lambdify(subs.keys()、expr)(* subs.values())'です。 –

0

モジュール。