式を象徴的に生成し、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
に緩い呼び出しを使用している
も、この(もっとして1つの引数を持つ)を使用することができます私が実際に使用するコードは 'return lambdify(subs.keys()、expr)(* subs.values())'です。 –