多维欧拉方法

2024-04-18 09:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维的初始条件。例如,当前我的函数使用以下方法工作:

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

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

^{pr2}$

其中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:列表索引必须是整数或切片,而不是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

我基本上想要返回两个列表,第一个列表是z,它返回时间值的列表,第二个列表v返回每个步骤中每个结果的列表。到目前为止,它在我使用float而不是list的地方起作用了。那我遗漏了什么代码?在


Tags: 方法函数in列表for错误时间float
1条回答
网友
1楼 · 发布于 2024-04-18 09:28:47

试试这个:

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。在

在同一语句中,您尝试使用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是一个列表,而列表上的+=将另一个iterable的内容附加到当前列表中。它的方法是“迭代”第二个列表,并将第二个列表中的项附加到第一个列表中。由于值h * f(t, y[0])不是一个列表,也不是iterable,因此会得到错误

相关问题 更多 >