2016-11-11 13 views
1

ルンゲクッタ法(または中点法)とオイラー法を使って微分方程式を解く2つの関数があります。しかし、それが解決しようとしている関数は動作させません。関数がリストを返します。私は別の関数内でそのリストを掛けたい

TypeError: 'float' object is not subscriptable 

ここオイラー関数の中で、私は

x += [h*i for i in f(t,x)] 

でそれを置き換えるが、私はまだ同じを取得する場所私はリスト内包を試してみました

def integrateMidpoint(f, x0, t0, h, N): 
     mpxaxis = [0] * (N + 1) 
     mpyaxis = [0] * (N + 1) 
     mpxaxis[0] = t = t0 
     mpyaxis[0] = x = x0 
     for x in x0:  
      for i in range(1, N +1): 
       k1 = h * f(t, x) 
       k2 = h * f(t + 0.5 * h, x + 0.5 * k1) 
       mpxaxis[i] = t= t0 + i * h 
       x = x + k2 
       mpyaxis[i] = [x] 
     return mpxaxis, mpyaxis 

    def integrateEuler(f,x0,t0,h,N): 
    t = t0 
    xaxislist = [] 
    yaxislist = [] 
    Finalxaxisvalue = N*h # #ofsteps * stepsize 
    for x in x0: 
     while t <= Finalxaxisvalue: 
     xval = t 
     yval = x 
     t += h 
     x += h * f(t,x) 
     xaxislist.append(xval) 
     yaxislist.append(yval) 
    return xaxislist, yaxislist 

    def f(t,x): 
    return [-x[0]**3 - x[0] + sin(t)] #returns a list  

私のコードだ: 私はエラーを取得します同じ行にエラーがあります。もともと私のプログラムは、私は戻りリストの値、およびリストのリストを取得し、この

return -x**3 - x + sin(t) 

のようにコード化されたf(t,x)機能で動作します。しかし、この新しい機能の次元では、私はこれについてどうやって行くのだろうと思っていましたか?リストの理解は機能しませんでした。なぜ私は関数f(t,x)で返されたリスト内の値を使用するので、私は理解していない。 Iは入力シェルで

f関数である
>>>integrateEuler(f, [0.], 0., 1., 10) 
>>>Traceback (most recent call last): 
Python Shell, prompt 2, line 1 
File "redacted.py", line 13, in <module> 
multt = [h * i[0] for i in f(t,x)] 
File "redacted.py", line 21, in <module> 
return [-x[0]**3 - x[0] + sin(t)] 
builtins.TypeError: 'float' object is not subscriptable 

x0は時間t0t0に初期状態である初期時間であり、hはステップサイズであり、そしてNは数でありますステップ。で

+0

、どこでもあなたが例えば、あなたがリストのTypeErrorを上げると、それにアクセスしようとしているため、2番目のパラメータとしてfloatを渡しているfを呼んでいるということのようです。 – Marcin

+0

私は怠け者だったことをお詫びしますが、私はそれを最初に統合されたオイラーに短縮しました。私は今すぐ再編集します –

答えて

2

def f(t,x): 
    return [-x[0]**3 - x[0] + sin(t)] #returns a list  

は、あなたはそれがリストであるかのように、リストの最初の要素を取得するには、x[0]試行をxを使用しようとしています。一つの問題は、あなたが提供する `Euler`機能コードをhaventは

# first use in integrateMidpoint 
k1 = h * f(t, x) 
k2 = h * f(t + 0.5 * h, x + 0.5 * k1) 

# second use in integrateEuler 
x += h * f(t,x) 
+0

ああ、ありがとう!私は間違いを知った。私はforループを取り出し、今は動作します!エラーの説明をありがとう! –

+0

しかし、私はintegrateMidpointメソッド(具体的にはk2)でどのようにそれを掛けますか?オイラー法ではリストの理解度を簡単に使うことができました。 –

+0

これは難しいことですが、インデントがオフになっています。また、あなたが何を意味するかわからない、もし私が助けることができるかもしれない例を手がかりにしていれば。 –

関連する問題