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?
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:
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.
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.
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