Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sympy解析器不';t将expm1标识为符号函数_Python_Sympy - Fatal编程技术网

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