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形成正确的代数表达式是唯一的方法吗?看起来很荒唐。避免通过取消变量除函数中的零误差
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形成正确的代数表达式是唯一的方法吗?看起来很荒唐。避免通过取消变量除函数中的零误差
这没有什么不对。鉴于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
增加一个特例。
这不是一个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那样的事情。无论哪种方式,您都应该明确地向计算机说明这两个函数应该相互关联。
事实上,可能是一个尝试/除ZeroDivisionError可能在这里帮助... –