【问题标题】:Function gives a list. I want to multiply that list within another function函数给出一个列表。我想将该列表乘以另一个函数
【发布时间】:2016-11-11 05:19:53
【问题描述】:

我有两个函数,一个使用 Runge-Kutta 方法(或中点方法)和 Euler 方法来求解微分方程。然而,它应该解决的功能并不能让它发挥作用。 我得到了错误:

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       

我尝试了列表理解,在欧拉函数中我用

替换了它
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是步数。

【问题讨论】:

  • 你没有提供Euler功能码。
  • 我很抱歉我很懒惰,但我将它缩短为欧拉,它最初是集成欧拉。我现在重新编辑一下

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


【解决方案1】:

在:

 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)

【讨论】:

  • 啊,谢谢!我意识到我的错误。我拿出了我的 for 循环,现在它可以工作了!感谢您对错误的澄清!
  • 但是,我如何将它在integrateMidpoint 方法中相乘,特别是k2?我能够在 Euler 方法中轻松使用列表推导。
  • 很难说,那个函数的缩进是关闭的。另外我不确定您的意思,如果您可以举例说明,也许我可以提供帮助。
  • 因此,例如在欧拉函数中,我取出了 for 循环,并添加了 x += [[h * i for i in f(t, x)]] 。尽管初始条件不在列表中,但我能够返回我想要的内容。 '([[0.0、[0.84] 等..)。那么对于k2,我将如何编写代码以使其运行?我是否必须使用多个列表推导,因为我不能将浮点数与第二个参数中的列表相乘。
  • 看起来k1k2 的值独立于i,您可以将它们移出内部for 循环,我认为您应该在尝试之前重组和简化代码使用列表推导重写。有一些事情似乎他们可能行为不端,例如您正在修改 x 的值,同时将其用作循环索引。我不确定这是否能回答你的问题,但我真的认为你需要重新组织你的代码,以便更容易理解你想要做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2023-02-01
  • 1970-01-01
相关资源
最近更新 更多