Je résous numériquement pour x(t)) un système d'équations différentielles du premier ordre. Le système est le suivant:
dy/dt=(C)\*[(-K\*x)+M*A]
J'ai implémenté la méthode Forward Euler pour résoudre ce problème comme suit: Voici mon code:
import matplotlib
import numpy as np
from numpy import *
from numpy import linspace
from matplotlib import pyplot as plt
C=3
K=5
M=2
A=5
#------------------------------------------------------------------------------
def euler (f,x0,t):
n=len (t)
x=np.array ([x0*n])
for i in xrange (n-1):
x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
return x
#---------------------------------------------------------------------------------
if __name__=="__main__":
from pylab import *
def f(x,t):
return (C)*[(-K*x)+M*A]
a,b=(0.0,10.0)
n=200
x0=-1.0
t=linspace (a,b,n)
#numerical solutions
x_euler=euler(f,x0,t)
#compute true solution values in equal spaced and unequally spaced cases
x=-C*K
#figure
plt.plot (t,x_euler, "b")
xlabel ()
ylabel ()
legend ("Euler")
show()
`
M=2
A=5
#----------------------------------------------------------------------------
def euler (f,x0,t):
n=len (t)
x=np.array ([x0*n])
for i in xrange (n-1):
x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
return x
#---------------------------------------------------------------------------
if __name__=="__main__":
from pylab import *
def f(x,t):
return (C)*[(-K*x)+M*A]
a,b=(0.0,10.0)
n=200
x0=-1.0
t=linspace (a,b,n)
#numerical solutions
x_euler=euler(f,x0,t)
#compute true solution values in equal spaced and unequally spaced cases
x=-C*K
#figure
plt.plot (t,x_euler, "b")
xlabel ()
ylabel ()
legend ("Euler")
show()
Je reçois Traceback suivant:
Traceback (most recent call last):
File "C:/Python27/testeuler.py", line 50, in <module>
x_euler=euler(f,x0,t)
File "C:/Python27/testeuler.py", line 28, in euler
x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
IndexError: index 1 is out of bounds for axis 0 with size 1
Je ne comprends pas ce qui est probablement faux. J'ai déjà levé les yeux sur des questions résolues, mais cela ne m'aide pas. Vous pouvez retrouver mon erreur? J'utilise le code suivant comme orientation: def euler (f, x0, t):
n = len( t )
x = numpy.array( [x0] * n )
for i in xrange( n - 1 ):
x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
return x
if __name__ == "__main__":
from pylab import *
def f( x, t ):
return x * numpy.sin( t )
a, b = ( 0.0, 10.0 )
x0 = -1.0
n = 51
t = numpy.linspace( a, b, n )
x_euler = euler( f, x0, t )
Mon but est de tracer la fonction.
Le problème, comme dit le Traceback, vient de la ligne x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
. Replaçons-le dans son contexte:
i + 1 >= len(x)
<=> i >= 0
, L'élément x[i+1]
Ne le fait pas. n'existe pas. Ici, cet élément n'existe pas depuis le début de la boucle for.Pour résoudre ce problème, vous devez remplacer x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )
par x.append(x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] ))
.
Le problème est avec votre ligne
x=np.array ([x0*n])
Ici, vous définissez x comme un tableau à élément unique de -200.0. Vous pourriez faire ceci:
x=np.array ([x0,]*n)
ou ca:
x=np.zeros((n,)) + x0
Remarque: vos importations sont assez confuses. Vous importez trois fois des modules numpy dans l'en-tête, puis vous importez plus tard pylab (qui contient déjà tous les modules numpy). Si vous voulez y aller doucement, avec un seul
from pylab import *
ligne en haut, vous pouvez utiliser tous les modules dont vous avez besoin.