2017-05-27 86 views
0

Im新的Sympy,我试图用它来计算一些表达式,但有时,单独使用.subs()函数,或后跟.evalf(),不给任何浮动或整数值。Sympy - 不能评估表达式

##--IMPORT 
from mpmath import * 
from sympy import * 
from sympy.parsing.sympy_parser import parse_expr 

x = symbols("x") 

_fOfX = "e**x + x + 1" 

if __name__== "__main__": 
    #Function to sympy expression 
    _sympyFunction = sympify(_fOfX) 
    #Calcolo la derivata prima 
    _dPrima = diff(_sympyFunction,x,1) 
    _dPrima = _dPrima.subs(x,5) 

    print(_dPrima.evalf()) 

而对于那些想知道,是的,我需要解析一个字符串来获取函数。

回答

0

的问题是,sympy不解释e作为exp(1),但作为象征e,就像它把x为标志x。如果你想让sympy了解你想要什么,你可以写exp(1)而不是e

参见下面的例子就sympy如何解释字符串1和字符串

import sympy as sym 

string1 = "e" 
string2 = "exp(1)" 

sym_string1 = sym.sympify(string1) 
sym_string2 = sym.sympify(string2) 

print(type(sym_string1)) 
print(type(sym_string2)) 

e = sym.symbols('e') 
print(type(sym_string1.subs(e, sym.exp(1)))) 

那么,你所能做的就是要么exp(1)取代e在你的字符串或更高版本替换它。您的代码可能如下所示:

from mpmath import * 
from sympy import * 
from sympy.parsing.sympy_parser import parse_expr 

x = symbols("x") 

_fOfX = "e**x + x + 1" 

if __name__== "__main__": 
    #Function to sympy expression 
    _sympyFunction = sympify(_fOfX) 
    #Calcolo la derivata prima 
    _dPrima = diff(_sympyFunction,x,1) 
    _dPrima = _dPrima.subs(x,5) 
    #Replace e with exp(1) 
    e = symbols('e') 
    _dPrima = _dPrima.subs(e, exp(1)) 

    print(_dPrima.evalf()) 
+0

不应将e的定义包含在'from mpath import *'中? – Luke84

+1

它确实被导入,但sympy应该怎么知道它呢? Sympy无法处理您导入的所有其他包,因为有太多甚至是不兼容的包。所以它只使用它自己并且是它自己的定义。小心使用'import *'。想象一下,你也可以从''numpy import *''。那么你最终会得到两个独立的(和技术点不同)'e'的定义。 – Hannebambel