【问题标题】:multidimensional Euler's method python多维欧拉法python
【发布时间】:2016-11-10 22:24:02
【问题描述】:

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

>>>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:列表索引必须是整数或切片,而不是浮点数。我理解,这意味着我必须索引 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,它返回每个步骤中每个结果的列表列表。到目前为止,它在我使用浮点数而不是列表的地方工作。那么我缺少什么代码?

【问题讨论】:

  • 如果您将x0 定义为numpy.array,它可能会在更多地方工作。

标签: python list ode


【解决方案1】:

试试这个:

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

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

TypeError:列表索引必须是整数或切片,而不是浮点数。

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

TypeError:需要浮点数

因为y[:] 使用y 的所有元素创建了一个新列表,因此您仍在将列表传递给您的函数。

最后当你这样做y += h * f(t, y[0]),你得到错误:

builtins.TypeError: 'float' 对象不可迭代

因为正如我之前提到的,y 是一个列表,而列表上的+= 会将另一个可迭代的内容附加到当前列表中。它这样做的方式是“迭代”第二个列表并将第二个列表中的项目附加到第一个列表中。由于值 h * f(t, y[0]) 不是列表,也不是可迭代的,因此您会收到错误

【讨论】:

  • 哦不,我确实使用了 y。 yval = [y] 所以我将它附加到列表中,从而为每个步骤创建一个值列表。非常感谢你!我更明白了,谢谢!编辑:我刚刚意识到我的错误是一个非常草率的错误。再次感谢您帮助我看到它。
  • @AnonEmouse 不是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2023-03-17
  • 1970-01-01
  • 2013-05-10
相关资源
最近更新 更多