2017-03-14 45 views
0

我有一個叫做數值方法的類,我們學習如何編寫物理學中某些問題的程序。我們必須編寫4個可以求解ODE的程序(隱式/顯式式,速度式,隱式式中點規則),現在我們必須使用| 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") 

我需要填寫的唯一東西是TODO部分。但我不明白,for循環,循環在枚舉(分辨率)K和N,爲什麼解析數組聲明爲反正呢?

非常感謝您的幫助!

+0

因爲你設置了error'的'了'k'個索引。所以你需要索引。 –

+1

'k'給你'決議'的索引,'N'給你它的價值。 –

+0

'2 ** np.arange(4,11)'給出了numpy整數數組''[16,32,64,128,256,512,1024]'。所以解析數組就是這樣聲明的,因爲這是算法作者想要使用的一組解析值。這有幫助嗎? – nekomatic

回答

1

在數值求解的ODE,你想有使用標準方法加倍分辨率(減半步長),以找到收斂速度,:

(u_h - u_(h/2))/(u_(h/2) - u_(h/4)) = 2^p + O(h) 

u_h在步驟h數值解, u_(h/2)該解決方案採用步驟h/2(例如雙精度分辨率)和u_(h/4)該解決方案採用步驟h/4(例如再次雙精度)。錯誤的順序是p,其收斂率爲h^p

這就是爲什麼決議聲明爲2**np.arange(4,11), which gives [16,32,64,128,256,512,1024]`。 。(您可以使用其他網格大小,這將相應地更改公式的詳細信息,請參閱this

要存儲在列表中的錯誤,你需要的分辨率的相應指標,這就是爲什麼使用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 

0

這樣做的目的練習是比較不同方法求解由pendulum_rhs給出的微分方程。

比較發生的數量是收斂速度。爲了確定這個比率,你需要用變化的分辨率(底層網格)來解決DE問題,並計算每個分辨率的誤差。

使用的分辨率爲:resolutions =[16, 32, 64, ...]

因此,對於一個給定的方法method,你遍歷決議:

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) 
相關問題