Python 为什么我们在这个程序中使用enumerate?

Python 为什么我们在这个程序中使用enumerate?,python,enumerate,Python,Enumerate,我正在上一门叫做“数值方法”的课,我们学习如何为某些物理问题编写程序。我们必须编写4个程序来解决ODE(隐式/显式euler,velocity verlet,隐式中点规则),现在我们必须使用| y_N-y(T)|来计算误差。我们已经有了需要填写的模板。 这是我们必须完成的代码 def ex2_d(): T = 0.2 y0 = np.array([0.3, 0.0]) all_methods = [explicit_euler, implicit_euler, implicit_mid_poi

我正在上一门叫做“数值方法”的课,我们学习如何为某些物理问题编写程序。我们必须编写4个程序来解决ODE(隐式/显式euler,velocity verlet,隐式中点规则),现在我们必须使用| y_N-y(T)|来计算误差。我们已经有了需要填写的模板。 这是我们必须完成的代码

def ex2_d():
T = 0.2
y0 = np.array([0.3, 0.0])

all_methods = [explicit_euler, implicit_euler, implicit_mid_point, velocity_verlet]
all_rhs = 3*[pendulum_rhs] + [pendulum_verlet_rhs]
resolutions = 2**np.arange(4, 11)

_, y_exact = ode45(pendulum_rhs, (0.0, T), y0, reltol=1e-12)

for method, rhs in zip(all_methods, all_rhs):
    error = np.empty(resolutions.size)
    for k, N in enumerate(resolutions):
        # TODO: Berechen Sie die Lösung und den Fehler
        error[k] = np.absolute(methode())

    rate = convergence_rate(error, resolutions)
    print(method)
    print("rate: " + str(rate) + "\n")
我只需要填写待办事项部分。但是我不理解for循环,它在enumerate(resolution)中在k和N上循环,为什么resolution数组声明为原来的状态


提前感谢您的帮助

在数值求解ODE时,您希望使用标准方法获得加倍分辨率(将步长减半),以找到收敛速度:

(u_h - u_(h/2))/(u_(h/2) - u_(h/4)) = 2^p + O(h)
使用
u\u h
一步的数值解
h
u\u(h/2)
一步的解
h/2
(例如双分辨率)和
u\u(h/4)
一步的解
h/4
(例如再次使用双分辨率)。误差的顺序是
p
,它给出了
h^p

这就是为什么分辨率被声明为
2**np.arange(4,11),它给出了
[16,32,64,128,256,512,1024]`。(您可以使用其他网格尺寸,这将相应地更改公式。有关详细信息,请参阅

要将错误存储在列表中,您需要相应的分辨率索引,这就是为什么要使用
enumerate

enumerate(resolutions) -> [(0,16), (1,32), (2,64), (3,128), (4,256), (5,512), (6,1024)]
由for循环解包:

iteration    k    N
1            0    16
2            1    32

等。

本练习的目的是比较不同的方法来求解由
摆锤_rhs
给出的微分方程

进行比较的数量是收敛速度。为了确定这一速度,您需要使用不同的分辨率(底层网格)求解DE,并计算每个分辨率的误差

要使用的分辨率如下所示:
分辨率=[16,32,64,…]

因此,对于给定的方法
方法
,您可以迭代以下分辨率:

for k in range(len(resolutions)):
    N = resolutions[k]
    # calculate the result using N
    result = method(..., N, ...)
    #store it in an array called 
    error[k] = np.abs(y_exact - result)

因为您设置了
k
-错误
的第四个索引,所以您需要索引。
k
为您提供
分辨率的索引
N
为您提供其值。
2**np.arange(4,11)
为numpy整数数组
[16,32,64,128,256,512,1024]
。分辨率数组是这样声明的,因为这是作者想要使用的一组分辨率值。这有帮助吗?啊哈,好的,我想我明白了:所以实际上k将被设置为1,2,3,4,5,6,7,N将被设置为2**np。arange(4,11)…有意义:D