功能给出一个列表。我想将该列表乘以另一个函数

时间:2016-11-11 05:19:53

标签: python list python-3.x list-comprehension

我有两个函数,一个使用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是函数,x0t0时的初始条件,t0是初始时间,h是步长,并且N是步数。

1 个答案:

答案 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)