我已经编写了一个欧拉方法的函数。然而,我希望它能够使用任意维度的初始条件。例如,当前我的函数使用如下方式:
>>>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 slices, not float。我理解这意味着我必须对y进行索引,例如使用y[0]、y[1]等等......但是当我执行以下操作时: y+= h* f(t, y[:])
它会给我返回一个有关文件中其他函数f的错误: 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,它返回每一步结果的列表。到目前为止,使用浮点数是有效的,但是使用列表则不行。那么我缺少哪些代码呢?
x0
定义为numpy.array
,它可能会在更多地方起作用。 - Lutz Lehmann