多维欧拉方法python

时间:2016-11-10 22:24:02

标签: python list ode

所以我为Euler的方法编写了一个函数。但是,我希望它能够使用任意尺寸的初始条件。例如,目前我的函数使用此函数:

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

其中x0是浮点数。但是我希望它能够使用它:

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

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

f = function,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必须是整数或切片,而不是float。我理解,这意味着我必须索引y,如使用y [0],y [1]等...但是当我这样做时

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

它给我一个关于我在文件中的其他功能的错误:f =&gt;

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

我基本上想要返回2个列表,第一个列表是z,其中它返回时间值的列表,第二个列表v,其中它返回每个步骤中每个结果的列表列表。到目前为止,它已经在我使用浮动但不是列表的地方工作。那么我错过了什么代码?

1 个答案:

答案 0 :(得分: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时,y = x0就是一个列表。

快进到此行y += h * f(t,y[i])。在这里,您尝试在+=上使用y运算符,其作用是将另一个iterable的内容追加到y

在同一声明中,您尝试使用y索引i。要索引到列表,您需要使用整数,但由于iy的元素(它是一个浮点数组),i不能用于索引到列表,这就是为什么你可以错误:

  

TypeError:list indices必须是整数或切片,而不是float。

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

  

TypeError:需要浮点数

由于y[:]创建了包含y所有元素的新列表,因此您仍然会将列表传递给您的函数。

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

  

builtins.TypeError:&#39; float&#39;对象不可迭代

因为正如我之前提到的,y是一个列表,列表上的+=会将另一个iterable的内容附加到当前列表中。这样做的方式是&#34;迭代&#34;在第二个列表上,将第二个列表中的项目附加到第一个列表中。由于值h * f(t, y[0])不是列表,也不是可迭代的,因此会出现错误