2015-10-13 47 views
0

我試圖解決使用龍格庫塔4方法(RK4)的ODE系統。我正在對下面的算法進行代碼測試,並發現該解決方案不等於解析解決方案(並且錯誤很大)。下面我已經包含了我對I.V.P.的代碼測試。 dy/dt = f(t,y)。我試圖在這段代碼中發現錯誤,但無法找到它們。任何幫助深表感謝。 全局 [噸 DT 生長速率]Runge-Kutta 4解決方案中的錯誤

turtles-own [ state ] 

to setup 
clear-all 
create-turtles 1 [ set state 1] 
set dt .01 
set growth-rate .05 
reset-ticks 
end 

to go 
tick 
set t t + dt 
ask turtles [ set state rk4 t state dt ] ;integrate the diff eq. 
end 

;differential equation to be integrated using rk4 
to-report df [ t_n state_n ] ; i.v.p. y(dot) = f(t_n, y_n) 
report growth-rate * (state_n) 
end 


;;;;;;;function calls 

to-report rk4 [ t_n state_n h ] 
let k1 df t_n state_n 
let k2 df (t_n + 0.5 * h) (state_n + ((h/2) * k1)) 
let k3 df (t_n + 0.5 * h) (state_n + ((h/2) * k2)) 
let k4 df (t_n +  h) (state_n +   k3) 
let state_n+1 state_n + ((h/6) * (k1 + (2 * k2) + (2 * k3) + k4)) 
report state_n+1 
end 

積分這個函數至t = 100,我> 7的誤差(數值解〜156,和分析溶液〜148)

+0

另外,我應該評論,這個錯誤是獨立的時間步驟。因此讓我相信這是算法實現的問題。 – user3887089

回答

2

我認爲實施基本上沒有問題,但是您對需要多少滴答的解釋可能已經排除。如果你改變你去語句下面的代碼,它的工作原理

to go 
ask turtles [ set state rk4 t state dt ] ;integrate the diff eq. 
set t t + dt 
tick 
if ticks = steps/dt [ stop ] 
end 

你應該ahve狀態更新後set t t + dt,因爲state_n + 1從state_n在t_n計算,並具有時間更新第一使得它基於t_n +1。然而,在實踐中,這並不能解決問題(或者對這些值產生任何真正的區別)。但考慮從t_0到t_1。你需要通過1/dt滴答。

所以我認爲,當你用t = 100積分的例子來解釋問題時,你實際上正在整合到t = 101。但我不確定,因爲你沒有提供你的模型。