2013-02-13 49 views
28

遇到我使用欧拉方法为“在春天的球”,以使程序模型RuntimeWarning:无效的价值鸿沟

from pylab import* 
from math import* 
m=0.1 
Lo=1 
tt=30 
k=200 
t=20 
g=9.81 
dt=0.01 
n=int((ceil(t/dt))) 
km=k/m 
r0=[-5,5*sqrt(3)] 
v0=[-5,5*sqrt(3)] 
a=zeros((n,2)) 
r=zeros((n,2)) 
v=zeros((n,2)) 
t=zeros((n,2)) 
r[1,:]=r0 
v[1,:]=v0 
for i in range(n-1): 
    rr=dot(r[i,:],r[i,:])**0.5 
    a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr 
    v[i+1,:]=v[i,:]+a*dt 
    r[i+1,:]=r[i,:]+v[i+1,:]*dt 
    t[i+1]=t[i]+dt 

    #print norm(r[i,:]) 

plot(r[:,0],r[:,1]) 
xlim(-100,100) 
ylim(-100,100) 
xlabel('x [m]') 
ylabel('y [m]') 

show() 

我不断收到此错误:

a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr 
RuntimeWarning: invalid value encountered in divide 

我可以不知道,代码有什么问题?

+0

打印该行代码中每个较小项目中正在发生的事情。这是调试它的唯一方法。 – CppLearner 2013-02-13 20:11:55

+1

你有'nan's'rr',它抛出了那个错误。 'rr'的问题来源于'r [i,:]',在某些情况下,它等于'array([nan,nan])'。正如@CppLearner提到的那样,调试(或编写)代码的最好方法是在实现之前测试每个较小的部分。 – cosmosis 2013-02-13 20:20:25

回答

1

您除以rr,可能为0.0。检查rr是否为零,并在分母中使用它以外的其他值。

48

我认为你的代码试图“除以零”或“除以NaN”。如果你意识到这一点,不希望它打扰你,那么你可以尝试:

import numpy as np 
np.seterr(divide='ignore', invalid='ignore') 

有关详细信息,请参阅:

+17

使用'with NP.errstate(divide ='ignore',invalid ='ignore'):'如果您想要抑制一段代码的警告可能很有用。 – GWW 2016-03-16 17:02:13

+1

为什么要忽略零或NaN的除法? – 2017-11-10 14:38:46

6

Python的索引开始于0(而不是1),所以你的赋值“r [1 ,:] = r0”定义了r的第二个(即索引1)元素,并且将第一个(索引0)元素作为一对零。在for循环中,i的第一个值是0,所以rr获得r中第一个条目与其自身(它是0)的点乘积的平方根,并且在随后的行中由rr除法将引发错误。