135 votes

RuntimeWarning : valeur invalide rencontrée dans la division

Je dois faire un programme utilisant la méthode d'Euler pour le modèle "balle dans un ressort".

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 à obtenir cette erreur :

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

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

213voto

Yan Zhu Points 3228

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

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

Pour plus de détails, voir :

21voto

Kinch Points 311

L'indexation de Python commence à 0 (plutôt qu'à 1), donc votre affectation "r[1, :] = r0" définit l'élément deuxième (c'est-à-dire l'indice 1) de r et laisse le premier élément (indice 0) comme une paire de zéros. La première valeur de i dans votre boucle for est 0, donc rr obtient la racine carrée du produit scalaire de la première entrée de r avec elle-même (qui est 0), et la division par rr dans la ligne suivante génère l'erreur.

19voto

ItsmeJulian Points 539

Pour éviter la division par zéro, vous pouvez pré-initialiser la sortie 'out' où l'erreur div0 se produit, par exemple np.where ne suffit pas, car la ligne complète est évaluée indépendamment de son état.

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

4voto

crayzeewulf Points 1487

Vous divisez par rr qui peut être de 0.0. Vérifiez si rr est zéro et faire quelque chose de raisonnable autre que de l'utiliser dans le dénominateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X