所以我为Euler的方法编写了一个函数。但是,我希望它能够使用任意尺寸的初始条件。例如,目前我的函数使用此函数:
>>>Euler(f, x0, t0, h, N)
其中x0是浮点数。但是我希望它能够使用它:
>>>Euler(f, [x0], t0, h, N)
其中x0现在是浮点数列表。 (使其成为多维的)
f = function,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必须是整数或切片,而不是float。我理解,这意味着我必须索引y,如使用y [0],y [1]等...但是当我这样做时
y + = h * f(t,y [:])
它给我一个关于我在文件中的其他功能的错误:f =&gt;
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,其中它返回每个步骤中每个结果的列表列表。到目前为止,它已经在我使用浮动但不是列表的地方工作。那么我错过了什么代码?
答案 0 :(得分:2)
试试这个:
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
运算符,其作用是将另一个iterable的内容追加到y
。
在同一声明中,您尝试使用y
索引i
。要索引到列表,您需要使用整数,但由于i
是y
的元素(它是一个浮点数组),i
不能用于索引到列表,这就是为什么你可以错误:
TypeError:list indices必须是整数或切片,而不是float。
当你执行此操作y+= h* f(t, y[:])
时,会收到错误:
TypeError:需要浮点数
由于y[:]
创建了包含y
所有元素的新列表,因此您仍然会将列表传递给您的函数。
最后,当你执行此操作y += h * f(t, y[0])
时,会收到错误:
builtins.TypeError:&#39; float&#39;对象不可迭代
因为正如我之前提到的,y
是一个列表,列表上的+=
会将另一个iterable的内容附加到当前列表中。这样做的方式是&#34;迭代&#34;在第二个列表上,将第二个列表中的项目附加到第一个列表中。由于值h * f(t, y[0])
不是列表,也不是可迭代的,因此会出现错误