Mlle Blanche Mlle Blanche - 1 month ago 6
Python Question

IndexError: index 1 is out of bounds for axis 0 with size 1/ForwardEuler

I am numerically solving for x(t) for a system of first order differential equations. The system is:

dy/dt=(C)\*[(-K\*x)+M*A]


I have implemented the Forward Euler method to solve this problem as follows:
Here is my 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()


I get following Traceback:

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


I don´t understand what is probably wrong.I already looked up after solved questions, but it doesn´t help me along.Can you find my error?
I am using following code as an 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 )


My goal is to plot the function.

Answer

The problem, as the Traceback says, comes from the line x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] ). Let's replace it in its context:

  • x is an array equal to [x0 * n], so its length is 1
  • you're iterating from 0 to n-2 (n doesn't matter here), and i is the index. In the beginning, everything is ok (here there's no beginning apparently... :( ), but as soon as i + 1 >= len(x) <=> i >= 0, the element x[i+1] doesn't exist. Here, this element doesn't exist since the beginning of the for loop.

To solve this, you must replace x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] ) by x.append(x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )).