如何摆脱ZeroDivisionError:浮点除以零

时间:2020-05-03 00:00:40

标签: python numpy

我一直遇到错误除以零的浮点数,无法理解为什么得到它。但是,当我运行最初提供给我的代码(在matlab中编写并运行)时,不会发生错误。

代码

import numpy as np
import matplotlib.pyplot as plt
from astropy import constants as const


#Part 1: Exploring Rotation Curves


M = 10**42 #Approximate mass of the Milky Way (kg)
G = const.G #Universal gravitational constant (m^3 kg^-1 s^-2)
r = np.linspace(0, 3e20) #Radii (m)
rkpc = r*(3.24e-20) #Radii (kpc)
plt.figure(1)
plt.title('Rotation Curves for Three Mass Distributions') 
v1 = np.sqrt(G * M / r) # Orbital velocity in system with central mass (m/s)
M_prop = np.linspace(0, M) # Array of masses increasing proportionally with radius
v2 = np.sqrt(G * M_prop / r) 
M_dens = (M * (r / (max(r)))**3) 
v3 = np.sqrt((G * M_dens) / r)
plt.plot(rkpc, v1/1000, 'b', label = 'Constant M_{r}')
plt.plot(rkpc, v2/1000, 'k', label = 'M_{r} \propto r')
plt.plot(rkpc, v3/1000, 'r', label = 'M_{r} \propto r^{3}')

我知道由于以下两行而发生了错误

M_dens = (M * (r / (max(r)))**3) 
v3 = np.sqrt((G * M_dens) / r)

我认为它是由于max(r)而发生的,但是有人可以阐明为什么会发生这种情况吗?可能会解决?

2 个答案:

答案 0 :(得分:0)

对不起,如果这不起作用,我对这样的数学命令会有点不了解。

在这一行:

r = np.linspace(0, 3e20)

r将以0开始。在此行后面:

v3 = np.sqrt((G * M_dens) / r)

您将r除以0。 除以0的任何东西都是不确定的,因此Python不喜欢它并引发错误。

答案 1 :(得分:0)

我不确定matlab如何处理零除,但是可以使用np.errstate来改变numpy行为。

a = np.arange(-5, 5.)
b = np.arange(-2, 8.)
with np.errstate(divide='ignore'):
     res0 = a / b
     res1 = b / a 
print(res0, '\n', res1)
# [ 2.5    4.   -inf -2.   -0.5   0.  0.25   0.4  0.5  0.57142857] 
# [ 0.4   0.25 -0.   -0.5  -2.   inf  4.    2.5   2.    1.75]

或者创建一个函数,可以将inf和-inf结果设置为有用的默认值。

def do_div( a,b, def_val=np.inf):
    with np.errstate(divide='ignore'):
        res = a / b                   
        res[ ~np.isfinite(res) ] = def_val
    return res

print( do_div( a, b, 100 ))
# [  2.5   4.   100.  -2.    -0.5   0.     0.25   0.4  0.5  0.57142857]
print( do_div( b, a, 100 ))
# [  0.4  0.25  -0.  -0.5  -2. 100.  4.  2.5  2.  1.75]

将除法的错误状态设置为“忽略”可禁止显示警告。 Numpy返回正负无穷除以零。 do_div函数将所有无穷大值设置为默认值。在我的工作中,多数情况下为零。我在这里使用了100,所以很容易看到。 Matlab可能会执行类似的操作,即返回无穷大或替代默认值,而不发出错误或警告。