我一直遇到错误除以零的浮点数,无法理解为什么得到它。但是,当我运行最初提供给我的代码(在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)而发生的,但是有人可以阐明为什么会发生这种情况吗?可能会解决?
答案 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可能会执行类似的操作,即返回无穷大或替代默认值,而不发出错误或警告。