Ich muss ein Programm nach Eulers Methode für das Modell "Ball in a Spring" erstellen
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()
Ich bekomme immer wieder diesen Fehler:
a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr
RuntimeWarning: invalid value encountered in divide
Ich kann es nicht herausfinden, was ist mit dem Code falsch?
python
python-2.7
matplotlib
Bogdan Osyka
quelle
quelle
nan
s fürrr
, was diesen Fehler auslöst. Das Problem mitrr
ist das, vonr[i,:]
dem in einigen Fällen gleich istarray([ nan, nan])
. Wie bei @CppLearner erwähnt, besteht der beste Weg zum Debuggen (oder Schreiben) von Code darin, jeden kleineren Teil vor der Implementierung zu testen.Antworten:
Ich denke, Ihr Code versucht, "durch Null zu teilen" oder "durch NaN zu teilen". Wenn Sie sich dessen bewusst sind und nicht möchten, dass es Sie stört, können Sie Folgendes versuchen:
Weitere Details finden Sie unter:
quelle
with NP.errstate(divide='ignore',invalid='ignore'):
wenn Sie die Warnungen für einen Codeblock unterdrücken möchten.with np.errstate(...)
Damit können Sie dies sicher nur für den behandelten Fall tun.'warn'
durch den Befehl auf den normalen Zustand zurückzusetzennp.seterr(divide='warn', invalid='warn')
Die Python-Indizierung beginnt bei 0 (anstatt bei 1), daher definiert Ihre Zuweisung "r [1,:] = r0" das zweite (dh Index 1) Element von r und belässt das erste (Index 0) Element als Paar von Nullen. Der erste Wert von i in Ihrer for-Schleife ist 0, also erhält rr die Quadratwurzel des Punktprodukts des ersten Eintrags in r mit sich selbst (was 0 ist), und die Division durch rr in der nachfolgenden Zeile löst den Fehler aus.
quelle
Um eine Division durch Null zu verhindern, können Sie die Ausgabe 'out' vorinitialisieren, wenn der Fehler div0 auftritt, z. B.
np.where
nicht abschneiden, da die gesamte Zeile unabhängig von der Bedingung ausgewertet wird.Beispiel mit Vorinitialisierung:
quelle
Sie teilen, durch
rr
die 0.0 sein kann. Überprüfen Sie, obrr
Null ist, und tun Sie etwas Vernünftiges, als es im Nenner zu verwenden.quelle