在取消变量的函数中避免除零错误

时间:2016-11-09 22:11:15

标签: python function sympy divide-by-zero

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来形成正确的代数表达式是唯一的方法吗?似乎荒谬。

2 个答案:

答案 0 :(得分:4)

没有做错任何事。鉴于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并不神奇,你需要同情这一点并不荒谬。

我建议您为mass_int添加r == 0特殊案例。

答案 1 :(得分:0)

这不是一个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))也是未定义的,并且在图上必须显示为点不连续。

作为此功能的智能用户,您可以识别出存在点不连续性。如果选择,可以用h(r)替换f(g(r))。唯一的区别是将函数定义为0。

数学本身不会这样做,没有编程语言会自行减少你的功能构成,除非你问它,因为你是用户,而你'应该知道你想从程序中得到什么。如果您创建一个具有点不连续性的函数组合,那么您可能会出于某种原因这样做。预计情报将出现在程序员中,而不是编译器中。要么自己构建和减少功能,要么像做同事一样做。无论哪种方式,由您决定使计算机明确表示这两个功能应该相互关联。