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

匿名 (未验证) 提交于 2019-12-03 08:42:37

问题:

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.

回答1:

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



回答2:

The problem is with your line

x=np.array ([x0*n]) 

Here you define x as a single-item array of -200.0. You could do this:

x=np.array ([x0,]*n) 

or this:

x=np.zeros((n,)) + x0 

Note: your imports are quite confused. You import numpy modules three times in the header, and then later import pylab (that already contains all numpy modules). If you want to go easy, with one single

from pylab import * 

line in the top you could use all the modules you need.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!