ルンゲクッタ法(または中点法)とオイラー法を使って微分方程式を解く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
は時間t0
、t0
に初期状態である初期時間であり、h
はステップサイズであり、そしてN
は数でありますステップ。で
、どこでもあなたが例えば、あなたがリストの
TypeError
を上げると、それにアクセスしようとしているため、2番目のパラメータとしてfloat
を渡しているf
を呼んでいるということのようです。 – Marcin私は怠け者だったことをお詫びしますが、私はそれを最初に統合されたオイラーに短縮しました。私は今すぐ再編集します –