SymPy解析器无法识别expm1为符号函数的解决方案咨询
解决SymPy解析器无法识别expm1的问题
刚好碰到过类似的问题,SymPy默认的解析器确实没把expm1纳入内置符号函数的识别列表里,不过咱们可以通过两种方法来配置,让它和exp(x)一样正常解析、支持符号运算:
方法一:解析时临时传入自定义映射字典
如果只是偶尔需要解析包含expm1的表达式,最直接的方式就是在调用parse_expr时,通过**local_dict参数**把SymPy的expm1函数映射给解析器:
from sympy import expm1, parse_expr, symbols x = symbols('x') # 自定义字典,将字符串"expm1"映射到sympy.expm1函数 custom_mapping = {'expm1': expm1} # 传入local_dict让解析器识别expm1 expr = parse_expr("expm1(x)", local_dict=custom_mapping) print(expr) # 输出 expm1(x) print(expr.subs(x, 0)) # 输出 0,符合expm1(0)=0的特性 print(expr.diff(x)) # 输出 exp(x),正确计算导数
方法二:全局注册expm1到解析器
如果需要频繁解析expm1,可以直接把它添加到SymPy解析器的全局内置函数字典里,这样后续不用每次传参数就能识别:
from sympy import expm1 from sympy.parsing.sympy_parser import functions # 将expm1添加到解析器的内置函数列表 functions['expm1'] = expm1 # 之后直接使用parse_expr或sympify都能识别expm1了 from sympy import parse_expr, symbols x = symbols('x') expr = parse_expr("expm1(x)") print(expr) # 输出 expm1(x) print(expr.series(x, 0, 3)) # 输出 x + x**2/2 + O(x**3),正确展开泰勒级数
原理其实很简单:SymPy的解析器通过内置的函数字典匹配字符串和对应的符号函数,默认字典里没有expm1,所以我们手动把它加进去就行,配置后expm1就能和exp(x)一样支持所有符号运算啦。
内容的提问来源于stack exchange,提问作者dPol
相关产品推荐
相关产品推荐

