Netlogo Runge-Kutta 4解中的误差

Netlogo Runge-Kutta 4解中的误差,netlogo,Netlogo,我试图用龙格-库塔4方法(RK4)求解一个常微分方程组。我正在对下面的算法进行代码测试,发现解不等于解析解(而且误差很大)。下面我已经包括了我对I.V.P.dy/dt=f(t,y)的代码测试。我尝试过在这段代码中查找错误,但无法发现它们。非常感谢您的帮助。 全球的 [t] dt 增长率] turtles-own [ state ] to setup clear-all create-turtles 1 [ set state 1] set dt .01 set growth-rate .05

我试图用龙格-库塔4方法(RK4)求解一个常微分方程组。我正在对下面的算法进行代码测试,发现解不等于解析解(而且误差很大)。下面我已经包括了我对I.V.P.dy/dt=f(t,y)的代码测试。我尝试过在这段代码中查找错误,但无法发现它们。非常感谢您的帮助。 全球的 [t] dt 增长率]

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)

我认为实现基本上是好的,但您对需要多少刻度的解释可能不正确。如果您将go语句更改为下面的代码,它将正常工作

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
您应该在状态更新后设置t+dt,因为状态n+1是从t\n处的状态n计算出来的,首先进行时间更新使其基于t\n+1。然而,在实践中,这并不能解决问题(或对值产生任何实际影响)。但是想想从t_0到t_1。你需要经历1/dt的滴答声


所以我认为当你用积分到t=100的例子来解释这个问题时,你实际上是在积分到t=101。但是我不确定,因为您没有提供您的模型的那一部分。

另外,我应该指出,此错误与时间步长无关。因此,我相信这是一个如何实现算法的问题。