【问题标题】:Avoiding division by zero error in a function with cancelling variables在具有取消变量的函数中避免除以零错误
【发布时间】:2016-11-09 22:11:15
【问题描述】:
def nu(r):
    '''Returns the stellar density function.'''
    return 1 / ( r * (1 + (r / a))**3)

    mass_int = lambda r: 4 * r**2 * nu(r)
    print(mass_int(0))

这给了我一个除以零的误差,大概是因为 1/r 项被单独评估。使用 sympy 来形成正确的代数表达式是解决这个问题的唯一方法吗?看起来很荒谬。

【问题讨论】:

    标签: python function sympy divide-by-zero


    【解决方案1】:

    它没有做错任何事情。给定r = 0

      1 / ( r * (1 + (r / a))**3)
    = 1 / ( 0 * (1 + (0 / a))**3)
    = 1 / ( 0 * (1 +    0   )**3)
    = 1 / ( 0 *       1      **3)
    = 1 / ( 0 *          1      )
    = 1 / 0
    

    所以当你请求nu(0) 时,你会得到一个错误。它不会向前看并做特殊的代数事情,它只会抛出错误。 Python 并不神奇,为此你需要 sympy 并不荒谬。

    我建议你在mass_int 中为r == 0 添加一个特殊情况。

    【讨论】:

    • 确实,可能是 try/except ZeroDivisionError 在这里可能会有所帮助...
    【解决方案2】:

    这不是 Python 问题,甚至不是计算机编程问题。这是简单的数学运算。

    f(x) = 1 / (x * (1 + x/a)**3)
    g(x) = 4x**2
    
    h(x) = 4x / (1 + x/a)**3
    

    f(g(r)) 和 h(r) 有区别吗?当然有。尽管图看起来完全一样,但 f(g(0)) 是未定义的,并且在图上必须显示为不连续点。

    作为这个函数的聪明用户,你可以识别出点不连续的存在。如果您选择,您可以将 f(g(r)) 替换为 h(r)。唯一的区别是将函数定义在 0 处。

    数学本身不会这样做,没有编程语言会自行为你减少函数组合,除非你要求它这样做,因为你是用户,而且你'重新应该知道你想从程序中得到什么。如果您创建一个具有点不连续性的函数组合,那么您这样做是有原因的。智能应该在程序员中,而不是在编译器中。要么自己编写和减少函数,要么做一些类似 sympy 的事情。无论哪种方式,您都可以向计算机明确说明这两个函数应该相互关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多