Python sympy解析器不';t将expm1标识为符号函数
以下示例中未正确解析函数Python sympy解析器不';t将expm1标识为符号函数,python,sympy,Python,Sympy,以下示例中未正确解析函数expm1: from sympy.parsing.sympy_parser import parse_expr print parse_expr('expm1(x)').diff('x') 给予 如何将sympy识别expm1作为符号函数,从而获得与相同的结果 print parse_expr('exp(x) - 1').diff('x') 它给出了exp(x)?,因为symphy中没有内置的expm1,解析器对这种表示法一无所知。parse\u expr的参数lo
expm1
:
from sympy.parsing.sympy_parser import parse_expr
print parse_expr('expm1(x)').diff('x')
给予
如何将sympy
识别expm1
作为符号函数,从而获得与相同的结果
print parse_expr('exp(x) - 1').diff('x')
它给出了
exp(x)
?,因为symphy中没有内置的expm1
,解析器对这种表示法一无所知。parse\u expr
的参数local\u dict
可用于向SymPy解释不熟悉的函数和符号的含义
expm1 = lambda x: exp(x)-1
parse_expr('expm1(x)', local_dict={"expm1": expm1})
这将返回exp(x)-1
要使expm1保持为具有已知导数的单个函数,而不是exp(x)-1
,请将其定义为辛函数(有关更多此类示例,请参阅)
确认其有效性:
e = parse_expr('expm1(x)', local_dict={"expm1": expm1})
print(e) # expm1(x)
print(e.diff(x)) # exp(x)
f = lambdify(x, e)
print(f(1)) # 1.718281828459045
print(f(1e-20)) # 1e-20, unlike exp(x)-1 which would evaluate to 0
这是可行的,但它相当于在我的表达式中编写
exp(x)-1
。此解决方案的缺点是,当我lambdify时,它使用exp
函数而不是expm1
。有没有一种方法可以用expm1
来对表达式进行lambdizing,但要将它区别开来,因为它是用普通的exp(x)-1
编写的?实际上expm1
的定义存在于.codegen.cfunctions
class expm1(Function):
def fdiff(self, argindex=1):
return exp(self.args[0])
e = parse_expr('expm1(x)', local_dict={"expm1": expm1})
print(e) # expm1(x)
print(e.diff(x)) # exp(x)
f = lambdify(x, e)
print(f(1)) # 1.718281828459045
print(f(1e-20)) # 1e-20, unlike exp(x)-1 which would evaluate to 0