Sympy指数表达式无法忽略无意义小数导致化简失效的解决方法
Sympy整数与浮点数类型差异导致化简失败的解决方案
Sympy默认化简逻辑会严格区分内置的Integer(整数型)和Float(浮点型)数值,尤其在指数、幂次等位置的两类数值不会被判定为相等,就是示例中化简失败的核心原因。以下是三种可直接落地的解决方案:
方案1:事后统一转换表达式内所有数值为浮点数
如果表达式已经生成,你可以在化简前调用evalf()方法将表达式内所有非符号数值统一转换为指定精度的浮点数,再执行化简操作即可:
from sympy import * x = symbols('x') y = -exp(2.0*x) + exp(2*x) # 先转换所有数值为浮点数再化简,默认精度15位 y_float = y.evalf() print(simplify(y_float)) # 输出为 0 y = -x**2.0 + x**2 y_float = y.evalf() print(simplify(y_float)) # 输出为 0
如果需要自定义精度,可以给evalf()传入数值参数,比如evalf(10)代表精度为10位。
方案2:从运算源头统一数值类型
如果你希望避免运算过程中生成混合类型的表达式,可以自定义一个数值包装函数,所有参与Sympy运算的字面量数值都先经过转换,统一为Float类型:
from sympy import * # 自定义包装函数,所有输入数值统一转成Sympy浮点型 def to_float(num): return Float(num) x = symbols('x') # 运算时用包装函数包裹所有非符号数值 y = -exp(to_float(2)*x) + exp(to_float(2)*x) print(simplify(y)) # 输出为 0 y = -x**to_float(2) + x**to_float(2) print(simplify(y)) # 输出为 0
方案3:自定义化简函数适配混合类型场景
如果你不想修改原有运算逻辑,可以自定义封装化简函数,在执行官方化简逻辑前先统一表达式内的数值类型,替换原有simplify调用即可:
from sympy import * def custom_simplify(expr): # 将表达式内所有整数类型数值替换为等数值的浮点型 expr = expr.replace(lambda e: isinstance(e, Integer), lambda e: Float(e)) return simplify(expr) x = symbols('x') y = -exp(2.0*x) + exp(2*x) print(custom_simplify(y)) # 输出为 0 y = -x**2.0 + x**2 print(custom_simplify(y)) # 输出为 0
该方案适配性最高,不需要改动原有业务逻辑的代码。
内容的提问来源于stack exchange,提问作者Shoaib Mirzaei
相关产品推荐
相关产品推荐

