如何修复'RuntimeWarning:在 double_scalars 中遇到的除以零'

Posted

技术标签:

【中文标题】如何修复\'RuntimeWarning:在 double_scalars 中遇到的除以零\'【英文标题】:How to fix 'RuntimeWarning: divide by zero encountered in double_scalars'如何修复'RuntimeWarning:在 double_scalars 中遇到的除以零' 【发布时间】:2019-09-03 08:11:59 【问题描述】:

在我的代码中做了for循环后,出现了一行错误:

RuntimeWarning: divide by zero encountered in double_scalars

另外一行有两个错误:

RuntimeWarning: divide by zero encountered in double_scalars

RuntimeWarning: invalid value encountered in arcsin

我发现浮点值可能有问题,但我不确定,我在这里输入它以寻求您的帮助。 :)

代码如下:

T_max = 0.5 * v_PM(Me) * RTOD 
DT = (90 - T_max) - np.fix(90 - T_max) 
n = int(T_max * 2)

P = np.zeros((n+1))    
T = np.zeros((n+1))
M = np.zeros((n+1))
RR = np.zeros((n+1))
LR = np.zeros((n+1))
SL = np.zeros((n+1))

for m in range(n+1):
    T[m] = (DT + m) * DTOR
    func = lambda x: T[m] - v_PM(x) 
    M[m] = brentq(func, 1, Me+1) 
    M[0] = 0
    P[m] = TR * np.tan(T[m]) #X-AXIS POINTS
    P[0] = 0
    RR[m] = -TR / P[m]
    RR[0] = 0
    LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m]))) 
    LR[0] = 0
    SL[m] = -RR[m] 
    SL[0] = 0 

我之前定义过(循环前)v_PM,它是相等的

v_PM = lambda x : (A * np.arctan(np.sqrt(B * (x ** 2 - 1))) - np.arctan(np.sqrt(x ** 2 - 1)))

正如我提到的,错误 RuntimeWarning: divide by zero encountered in double_scalars 参考RR[m] = -TR / P[m]

还有两个错误 RuntimeWarning: divide by zero encountered in double_scalars

RuntimeWarning: invalid value encountered in arcsin指的是:

LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m])))

我还放在那里 P[0] = 0M[0] = 0 等,因为我希望第一个元素为 0。

我不知道我是否可以忘记这个错误并继续我的代码,或者它是否是一个严重的问题。感谢您的帮助。

【问题讨论】:

首先你应该找出是哪一行导致了警告。这通常显示在 Traceback 中。 试试if abs(P[m]) <1E-6: print(m, P[m]。就在划分之前找出导致问题的值。您可以对 T[m] 和 M[m] 执行类似的操作。了解这些值可能有助于您了解正在发生的事情。 【参考方案1】:

这些不是实际错误,而是警告。 它们在那里是因为您试图将某物除以零。

也就是说,您设置M[0] = 0,然后除以M[0](第一次迭代,m = 0)和P[0]相同。

问题是,您希望第一个值是什么?

也许一种解决方案是根据您的意愿(在循环之前)初始化零值并以m=1 开始循环(因此使用for m in range(1,n+1):)。这是你需要的吗?

但是,如果在不同的迭代中 P[m]M[m] 为零,警告可能仍然存在。

T_max = 0.5 * v_PM(Me) * RTOD 
DT = (90 - T_max) - np.fix(90 - T_max) 
n = int(T_max * 2)

P = np.zeros((n+1))    
T = np.zeros((n+1))
M = np.zeros((n+1))
RR = np.zeros((n+1))
LR = np.zeros((n+1))
SL = np.zeros((n+1))

# initialize your values
M[0] = 0 # actually not needed
P[0] = 0 # actually not needed
RR[0] = 0 # actually not needed
LR[0] = 0 # actually not needed
SL[0] = 0 # actually not needed
T[m] = (DT) * DTOR

for m in range(1,n+1):
    T[m] = (DT + m) * DTOR
    #Mach from T[i] using T[i] = v_PM (FALSE POSITION)
    func = lambda x: T[m] - v_PM(x) 
    M[m] = brentq(func, 1, Me+1) 
    P[m] = TR * np.tan(T[m]) #X-AXIS POINTS

    #RR SLOPES
    RR[m] = -TR / P[m]

    #LR slopes
    LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m]))) 
    SL[m] = -RR[m] 

【讨论】:

以上是关于如何修复'RuntimeWarning:在 double_scalars 中遇到的除以零'的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 python RuntimeWarning 打印到终端? [复制]

RuntimeWarning:在除法中遇到无效值

Django:RunTimeWarning:DateTimeField 在时区支持处于活动状态时收到了一个天真的日期时间

Django 中 DateField 的 RuntimeWarning

RuntimeWarning:启用 tracemalloc 以使用 asyncio.sleep 获取对象分配回溯

RuntimeWarning:协程“Messageable.send”从未等待 python.py