【问题标题】:How to make sympy acknowledge that 0/0 is a division by zero如何让 sympy 承认 0/0 是除以零
【发布时间】:2018-04-28 16:58:04
【问题描述】:

我试图让 sympy 以引发异常或返回 NaN 的方式在值 x = 0 处评估表达式 x/x。

例如下面的代码:

x = sympy.Symbol("x")
expr = (x/x).subs({x:0}).evalf()
print(expr)

返回 1。这完全是错误的。确实,当 x 接近零时 x/x 的极限是 1,但就 x = 0 时的实际值而言,它是未定义的。我希望 sympy 引发除零异常或返回 NaN,这是数学上正确的答案。

其实问题在我代入x = 0之前就已经存在了:

x = sympy.Symbol("x")
expr = x/x
print(expr)

返回 1。

感谢您提供的任何帮助。

【问题讨论】:

  • 我认为 with evaluate(False): expr = x/x; val = expr.subs(x, 0) 可能会这样做,但 val.evalf() 为零,val0*1/0。这令人不安。
  • 我试了(1/x).subs({'x':0}),结果进了动物园。
  • @wim 对。默认情况下,x 允许为复数。复平面中的 1/0 被理解为复无穷大,在 SymPy 中表示为 zoo(其中 oo 看起来像无穷大,z 是复变量的传统表示法。)
  • 谁说的?我从来没有听说过 1/0 被理解为复无穷大。它只是未定义。

标签: python sympy


【解决方案1】:

正如您所注意到的,问题在于 x/x 立即计算为 1,因此随后将 x 替换为 0 并没有真正发生。

避免评估的一种方法是将评估=假标志传递给 x 与 1/x 的乘积:

>>> expr = Mul(x, 1/x, evaluate=False)
>>> expr
x/x
>>> expr.subs(x, 0)
nan    

结果是“非数字”,这意味着它不会计算为数字。

(在 SymPy 中,所有除法都是乘以倒数:有 Add、Mul、Pow 但没有 Div 或 Sub)。

【讨论】:

  • 运算符/ 挂钩到或多或少相同的表达式,但sympy.core.expr.py:Symbol.__truediv__ 中没有evaluate=False。这种早期的隐式评估或多或少是 SymPy 中的一个糟糕的错误,imo,他们不应该那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2018-09-11
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多