我试图让sympy在值x = 0处评估表达式x / x,以便引发异常或返回NaN。
例如,以下代码:
x = sympy.Symbol("x")
expr = (x/x).subs({x:0}).evalf()
print(expr)
返回1.这完全是假的。确实,当x接近零时x / x的极限是1,但就x = 0时的实际值而言,它是未定义的。我想要同意提出一个除零异常或返回NaN,这是数学上正确的答案。
事实上,在我替换x = 0:
之前,问题已经存在x = sympy.Symbol("x")
expr = x/x
print(expr)
返回1。
感谢您提供任何帮助。
答案 0 :(得分:1)
正如您所注意到的,问题是x/x
立即求值为1,因此后续将x替换为0并非真正发生。
避免评估的一种方法是将evaluate = False标志传递给x与1 / x的乘积:
>>> expr = Mul(x, 1/x, evaluate=False)
>>> expr
x/x
>>> expr.subs(x, 0)
nan
结果是“非数字”,这意味着这不会评估为数字。
(在SymPy中,所有除法都是乘以倒数:有Add,Mul,Pow但没有Div或Sub)。