2017-03-07 4 views
0

Ich möchte Gleichungen symbolisch erzeugen, dann sub in Werte mit Typen aus Bibliotheken wie uncertainties (aber könnte jede Bibliothek mit benutzerdefinierten Typen sein), aber es scheint, dass mit .evalf(subs={...}) Methode mit einem eher ungerade Fehlermeldung:evaluate sympy Ausdruck mit Python-äquivalenten Operationen

>>> 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) 
  • ich weiß sympy mein Wert seit str(ufloat(5,1)) mit einem String konvertiert gibt '5.0+/-1.0' so ist es offensichtlich die String-Darstellung meines Ersatzwert will wie ein symbolischer Ausdruck aussehen wird.

Ich weiß, dass viele sympy Operationen (wie Differenzierung) dies nicht möglich sein würde, zu unterstützen, und es wäre nur möglich, wenn alle freien Symbole, da die beiden Arten schön spielen nicht ersetzt wurden:

>>> 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' 

Aber angenommen, ich lasse keine symbolischen Operationen/Variablen, ist es möglich, einfach einen Sympy-Ausdruck mit den Python-äquivalenten Operationen zu evaluieren?

Antwort

2

vielleicht wollen Sie mehr, aber man kann nur normale Funktionen von sympy Ausdrücke erstellen und dann Unsicherheiten verwenden

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

gut, die sowohl einfacher und Kreisverkehr war dann, erwartete ich dies (mit mehr als einem Argument) ist genau das, was ich brauchte, also werde ich den Code verwenden, der 'lambdify (subs.keys(), expr) zurückgibt (* subsvalues ​​()) 'vielen Dank! –

0

Meine aktuelle Lösung ist nur ein lockeres Gespräch eval verwendet, die wie eine gute Idee scheint nicht, zumal 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) 

und für uncertainties Unterstützung würde ich nur import uncertainties.umath as math anstelle der Standard-Mathematik Modul.

Verwandte Themen