所以我为欧拉方法编写了一个函数。但是,我希望它能够使用任意维的初始条件。例如,当前我的函数使用以下方法工作:
>>>Euler(f, x0, t0, h, N)
其中x0是一个浮点数。但是我希望它能够使用这个:
^{pr2}$其中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:列表索引必须是整数或切片,而不是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
我基本上想要返回两个列表,第一个列表是z,它返回时间值的列表,第二个列表v返回每个步骤中每个结果的列表。到目前为止,它在我使用float而不是list的地方起作用了。那我遗漏了什么代码?在
试试这个:
我不知道这是否是预期的方法,因为
y += h * f(t,y)
是死代码,不在其他任何地方使用我相信错误是由于没有注意到变量的类型。
y
是一个列表,而你做了y = x0
。在快进到这行
y += h * f(t,y[i])
。在这里,您尝试在y
上使用+=
运算符,它的作用是将另一个iterable的内容附加到y
。在在同一语句中,您尝试使用
i
索引y
。要索引到列表中,您需要使用一个整数,但是由于i
是y
(它是一个浮点数组)的元素,i
不能用于索引到列表中,这就是为什么可以出现错误:同样,当您这样做时,
y+= h* f(t, y[:])
,您会得到错误:因为
y[:]
创建了一个包含y
所有元素的新列表,因此您仍然在向函数传递一个列表。在最后,当您这样做时,
y += h * f(t, y[0])
,您会得到错误:因为正如我前面提到的,
y
是一个列表,而列表上的+=
将另一个iterable的内容附加到当前列表中。它的方法是“迭代”第二个列表,并将第二个列表中的项附加到第一个列表中。由于值h * f(t, y[0])
不是一个列表,也不是iterable,因此会得到错误相关问题 更多 >
编程相关推荐