2015-10-13 25 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。但我不确定,因为你没有提供你的模型。