多维欧拉方法 Python实现

4

我已经编写了一个欧拉方法的函数。然而,我希望它能够使用任意维度的初始条件。例如,当前我的函数使用如下方式:

>>>Euler(f, x0, t0, h, N) 

x0是一个浮点数。但我希望它能使用以下内容:

>>>Euler(f, [x0], t0, h, N) 

其中x0现在是一个浮点数列表(使其成为多维的)。

f = 函数,x0 = 时间t0下的初始条件,
t0 = 初始时间,h = 步长,N = 步数。

我尝试使用for循环:

    def Euler(f,x0,t0,h,N):
        t = t0
        y = x0
        z = []
        v = []
        for i in y:
            while t <= N:
                xval = t
                yval = [y]
                t += h
                y += h * f(t,y[i]) #i have also tried y+= h*f(t, i)
                z.append(xval)
                v.append(yval)
        return z, v

我遇到的错误是TypeError: list indices must be integers or slices, not float。我理解这意味着我必须对y进行索引,例如使用y[0]、y[1]等等......但是当我执行以下操作时: y+= h* f(t, y[:])
它会给我返回一个有关文件中其他函数f的错误: f = >
TypeError: a float is required 
line 22, in <module> vv = -x**3 - x + sin(t)

当我也尝试时

y += h * f(t, y[0])

我输入并进入

>>>Euler(f, [0., 1.], 0., 1, 10)
line 15, in <module>
y += h * f(t,y[0])
builtins.TypeError: 'float' object is not iterable

我需要返回两个列表,第一个列表是z,它返回一个时间值的列表,第二个列表v,它返回每一步结果的列表。到目前为止,使用浮点数是有效的,但是使用列表则不行。那么我缺少哪些代码呢?


如果您将x0定义为numpy.array,它可能会在更多地方起作用。 - Lutz Lehmann
1个回答

2

试试这个:

def Euler(f,x0,t0,h,N):
    t = t0
    z = []
    v = []
    for y in x0:
        while t <= N:
            xval = t
            yval = [y]
            t += h
            y += h * f(t,y) #i have also tried y+= h*f(t, i)
            z.append(xval)
            v.append(yval)
    return z, v

我不确定这是否是正确的方法,因为y += h * f(t,y)是死代码,在其他地方没有被使用。


我认为错误是由于没有注意到变量类型引起的。在你执行y = x0时,y是一个列表。

快进到这一行y += h * f(t,y[i])。在这里,你尝试在y上使用+=运算符,它的作用是将另一个可迭代对象的内容附加到y上。

在同一条语句中,你尝试使用i来索引y。要索引列表,需要使用整数,但由于iy的一个元素(它是浮点数数组),所以不能使用i来索引列表,这就是为什么会出现以下错误:

TypeError: list indices must be integers or slices, not float.

当你执行y+= h* f(t, y[:])时,你会得到错误:

TypeError: a float is required

因为y[:]创建一个包含y所有元素的新列表,所以你仍然向函数传递了一个列表。

最后,当你执行y += h * f(t, y[0])时,你会得到错误:

builtins.TypeError: 'float' object is not iterable

因为如前所述,y是一个列表,而列表上的+=将另一个可迭代对象的内容附加到当前列表中。它实现此操作的方法是"迭代"第二个列表,并将该第二个列表中的项附加到第一个列表中。由于值h * f(t, y[0])不是列表,也不是可迭代对象,因此你会得到错误。


哦不,我确实使用了y。 yval = [y],因此我将其附加到列表中,从而为每个步骤创建值的列表。非常感谢!我现在理解得更好了,谢谢!编辑:我刚意识到我的错误非常粗心。再次感谢您帮助我看清它。 - Anon Emouse
@AnonEmouse 没问题。 - smac89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接