2013-02-13 8 views
28

muszę zrobić program stosując metodę Eulera dla „piłkę w sprężynie” ModelRuntimeWarning: nieprawidłowa wartość napotkanych w przepaści

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() 

Wciąż otrzymuję ten błąd:

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

mogę nie rozumiem, co jest nie tak z kodem?

+0

wydrukuj, co dzieje się w każdym z mniejszych elementów w tym wierszu kodu. To jedyny sposób na debugowanie. – CppLearner

+1

Masz 'nan's dla' rr', który rzuca ten błąd. Problem z 'rr' pochodzi od' r [i,:] ', który w niektórych przypadkach jest równy' array ([nan, nan]) '. Jak wspomniał @CppLearner, najlepszym sposobem na debugowanie (lub zapisywanie) kodu jest przetestowanie każdej mniejszej części przed implementacją. – cosmosis

Odpowiedz

1

Dzielisz się przez rr, która może być 0.0. Sprawdź, czy rr jest zero i rób coś sensownego poza użyciem go w mianowniku.

48

Myślę, że twój kod próbuje "podzielić przez zero" lub "podzielić przez NaN". Jeśli jesteś świadomy, że i nie ma to przeszkadza, to można spróbować:

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

Aby uzyskać więcej informacji zobacz:

+17

Może być przydatne użycie 'z NP.errstate (divide = 'ignore', invalid = 'ignore'):' jeśli chcesz wyłączyć ostrzeżenia dla bloku kodu. – GWW

+1

Dlaczego ktoś chciałby zignorować dzielenie przez zero lub NaN? –

6

Python indeksowanie zaczyna się od 0 (zamiast 1), więc twoje zadanie "r [1 ,:] = r0" definiuje element sekund (tj. Indeks 1) r i pozostawia pierwszy element (indeks 0) jako parę zer. Pierwsza wartość i w pętli for wynosi 0, więc rr otrzymuje pierwiastek kwadratowy iloczynu punktowego pierwszego wpisu r z samym sobą (który wynosi 0), a podział rr w kolejnej linii powoduje błąd.

Powiązane problemy