多维欧拉方法 python
multidimensional Euler's method python
所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维度的初始条件。因此,例如,目前我的功能使用这个:
>>>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 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
我基本上想要 return 2 个列表,第一个列表是 z,其中 returns 是时间值的列表,第二个列表 v,其中 return这是每个步骤中每个结果的列表列表。到目前为止,它在我使用浮点数而不是列表的地方有效。那么我缺少什么代码?
试试这个:
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
。
在同一语句中,您尝试使用 i
索引到 y
。要对列表进行索引,您需要使用整数,但是由于 i
是 y
(浮点数数组)的一个元素,因此 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
是一个列表,列表上的 +=
将另一个可迭代对象的内容附加到当前列表。它这样做的方法是 "iterate" 在第二个列表上并将第二个列表中的项目附加到第一个列表中。由于值 h * f(t, y[0])
不是列表,也不是可迭代对象,因此您会得到错误
所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维度的初始条件。因此,例如,目前我的功能使用这个:
>>>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 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
我基本上想要 return 2 个列表,第一个列表是 z,其中 returns 是时间值的列表,第二个列表 v,其中 return这是每个步骤中每个结果的列表列表。到目前为止,它在我使用浮点数而不是列表的地方有效。那么我缺少什么代码?
试试这个:
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
。
在同一语句中,您尝试使用 i
索引到 y
。要对列表进行索引,您需要使用整数,但是由于 i
是 y
(浮点数数组)的一个元素,因此 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
是一个列表,列表上的 +=
将另一个可迭代对象的内容附加到当前列表。它这样做的方法是 "iterate" 在第二个列表上并将第二个列表中的项目附加到第一个列表中。由于值 h * f(t, y[0])
不是列表,也不是可迭代对象,因此您会得到错误