我有两个函数,一个使用Runge-Kutta方法(或中点方法)和欧拉方法来求解微分方程。然而,它应该解决的功能并不能让它发挥作用。 我收到错误:
TypeError: 'float' object is not subscriptable
这是我的代码
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
我尝试过列表理解,在Euler函数中我用
替换它x += [h*i for i in f(t,x)]
但我仍然在同一行中得到同样的错误。最初我的程序使用f(t,x)
函数编码,如此
return -x**3 - x + sin(t)
我得到列表的返回值和列表列表。但是这个带尺寸的新功能,我想知道我该怎么做呢?列表理解不起作用。我不明白为什么,因为我使用函数f(t,x)
中返回的列表中的值。
在我输入的shell中:
>>>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
其中f
是函数,x0
是t0
时的初始条件,t0
是初始时间,h
是步长,并且N
是步数。
答案 0 :(得分:2)
在:
def f(t,x):
return [-x[0]**3 - x[0] + sin(t)] #returns a list
您正在尝试使用x
,就像它是一个列表一样,x[0]
尝试获取列表的第一个元素。一个问题似乎是,在您调用f
的任何地方,您传递float
作为第二个参数,因此尝试以列表的形式访问它会引发TypeError
,例如,
# 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)