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