web-dev-qa-db-fra.com

RuntimeWarning: valeur non valide rencontrée dans la division

Je dois créer un programme utilisant la méthode d'Euler pour le modèle "ballon au printemps"

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

Je continue à avoir cette erreur:

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

Je ne peux pas comprendre, qu'est-ce qui ne va pas avec le code?

62
Bogdan Osyka

Je pense que votre code essaie de "diviser par zéro" ou "diviser par NaN". Si vous en êtes conscient et que vous ne voulez pas que cela vous dérange, vous pouvez alors essayer:

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

Pour plus de détails, voir:

106
Yan Zhu

L'indexation Python commence à 0 (au lieu de 1), donc votre affectation "r [1 ,:] = r0" définit l'élément second (index 1) de r et laisse le premier (index 0) élément en tant que paire de zéros. La première valeur de i dans votre boucle for est 0, ainsi rr obtient la racine carrée du produit scalaire de la première entrée dans r avec lui-même (qui est 0), et la division par rr dans la ligne suivante renvoie l'erreur.

12
Kinch

Vous divisez par rr qui peut être 0.0. Vérifiez si rr est égal à zéro et effectuez une opération raisonnable autre que son utilisation au dénominateur.

4
crayzeewulf

Pour éviter la division par zéro, vous pouvez pré-initialiser la sortie "sortie" à l'endroit où l'erreur div0 se produit, par exemple, np.where ne le coupe pas car la ligne complète est évaluée quelle que soit la condition.

exemple avec pré-initialisation:

a = np.arange(10).reshape(2,5)
a[1,3] = 0
print(a)    #[[0 1 2 3 4], [5 6 7 0 9]]
a[0]/a[1]   # errors at 3/0
out = np.ones( (5) )  #preinit
np.divide(a[0],a[1], out=out, where=a[1]!=0) #only divide nonzeros else 1
2
qrtLs