2016-11-09 78 views
-1
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形成正确的代数表达式是唯一的方法吗?看起来很荒唐。避免通过取消变量除函数中的零误差

回答

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_intr == 0增加一个特例。

+0

事实上,可能是一个尝试/除ZeroDivisionError可能在这里帮助... –

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.

数学不会自己做,没有编程语言会自己减少函数组合,除非你问它,因为你是用户,你应该知道你想从程序中得到什么。如果您创建了一个具有点不连续性的函数组合,则预计会出于某种原因这样做。预计智能将在编程器中,而不在编译器中。无论是自己撰写和减少功能,还是做一些像sympy那样的事情。无论哪种方式,您都应该明确地向计算机说明这两个函数应该相互关联。