web-dev-qa-db-ja.com

IndexError:インデックス1は、サイズ1 / ForwardEulerの軸0の範囲外です

私はx(t)を1次微分方程式のシステムに対して数値的に解いています。システムは次のとおりです。

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

Forward Eulerメソッドを実装して、この問題を次のように解決しました。ここに私のコードを示します。

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()

次のトレースバックを取得します。

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

おそらく何が間違っているのか理解できません。質問を解決した後、すでに調べましたが、助けにはなりません。エラーを見つけられますか?私は次のコードをオリエンテーションとして使用しています: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 )

私の目標は、関数をプロットすることです。

10
Mlle Blanche

トレースバックが言っているように、問題はx[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )行にあります。コンテキストで置き換えましょう:

  • xは[x0 * n]と等しい配列なので、その長さは1です
  • 0からn-2(ここではnは関係ありません)を反復処理し、iがインデックスです。初めはすべて大丈夫です(ここでは明らかに始まりはありません... :()、しかしi + 1 >= len(x) <=> _i >= 0_とすぐに、要素_x[i+1]_はしませんここでは、この要素はforループの開始以降存在しません。

これを解決するには、x[i+1] = x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] )x.append(x[i] + ( t[i+1] - t[i] ) * f( x[i], t[i] ))に置き換える必要があります。

10
Spirine

問題は回線にあります

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

ここで、xを-200.0の単一項目配列として定義します。これを行うことができます:

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

またはこれ:

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

注:インポートはかなり混乱しています。 numpyモジュールをヘッダーで3回インポートしてから、後でpylab(既にすべてのnumpyモジュールが含まれています)をインポートします。簡単にしたい場合は、1つのシングルで

from pylab import *

一番上の行には、必要なすべてのモジュールを使用できます。

11
leeladam