所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维度的初始条件。因此,例如,目前我的功能使用这个:
>>>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
。要对列表进行索引,您需要使用整数,但由于 i
是 y
( 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/