消除变量函数中的零除误差

2024-05-29 04:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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来形成正确的代数表达式是解决这个问题的唯一方法吗?看起来很荒谬。在


Tags: thelambdareturndef错误functiondensitystellar
2条回答

它没有做错什么。给定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来做的事情。不管是哪种方式,这都取决于你让计算机明白这两个函数应该是相互关联的。在

相关问题 更多 >

    热门问题