多维欧拉方法 python

multidimensional Euler's method python

所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维度的初始条件。因此,例如,目前我的功能使用这个:

>>>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 slice, not float。据我所知,这意味着我必须为 y 编制索引,例如使用 y[0]、y[1] 等...但是当我这样做时

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

关于我在文件中的其他函数,它给我一个错误: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

我基本上想要 return 2 个列表,第一个列表是 z,其中 returns 是时间值的列表,第二个列表 v,其中 return这是每个步骤中每个结果的列表列表。到目前为止,它在我使用浮点数而不是列表的地方有效。那么我缺少什么代码?

试试这个:

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 是您执行 y = x0 时的列表。

快进到这一行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 是一个列表,列表上的 += 将另一个可迭代对象的内容附加到当前列表。它这样做的方法是 "iterate" 在第二个列表上并将第二个列表中的项目附加到第一个列表中。由于值 h * f(t, y[0]) 不是列表,也不是可迭代对象,因此您会得到错误