python - 多维欧拉法python

标签 python list ode

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

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

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

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

其中 x0 现在是一个 float 列表。 (使其多维)

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

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

最佳答案

试试这个:

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( float 数组)的一个元素,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]) 不是列表,也不是可迭代的,因此您会得到错误

关于python - 多维欧拉法python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40538090/

相关文章:

python - Python中findall和括号的使用

r从数据框中提取列表元素

python - 集成 ODE 后打印数组中的特定值

python - odeint() 中的 Sympy 表达式给出推导错误

python - 在 python 中向下舍入到下一个 1000

python - Google Colab : loading large image dataset is very long, 上的深度学习如何加速这个过程?

python - Django 调度和队列非周期性任务

python - 如何使用 BeautifulSoup 从期刊版本列表中抓取 pdf 网址?

python - 用python从列表中制作字典

python - 使用 SymPy 表达式和 SciPy 求解器求解 ODE 的一阶系统