web-dev-qa-db-fra.com

IndexError: l'index 1 est hors limites pour l'axe 0 de taille 1 / ForwardEuler

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.

10
Mlle Blanche

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:

  • x est un tableau égal à [x0 * n], donc sa longueur est 1
  • vous passez de 0 à n-2 (n importe pas ici), et i est l’indice. Au début, tout est ok (ici, apparemment, il n'y a pas de commencement ... :(), mais dès que 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] )).

10
Spirine

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.

11
leeladam