NetLogo 中的 OTP 实现

ODE implemetation in NetLogo

如何在netlogo中实现ODE? 现在,我使用欧拉方法求解给定方程:

R[t+1] = r[t] + v[t] * step-size
V[t+1] = v[t] + f    * step-size

发现了类似的 question,但它建议从 mathematica 到 netlogo 的单向 link 这使得它无法实现。

我在寻找类似于 matlab 中的 ode 求解器的东西?

部分答案,比较 Euler、改进的 Euler 和 RK4 的准确运行时估计

假设最耗时的部分是对系统函数的求值,即Runge-Kutta方法的向量运算是一个很小的开销。

给定时间间隔 T=1,将方法限制为 100 次函数评估。然后

  • Euler 执行 100 步,步长为 h=0.01,全局误差为 pow(h,1)=0.01
  • 改进的 Euler 具有全局错误顺序 2 和 2 函数评估。因此执行 50 个步骤,步长 h=0.02 和全局误差大小 pow(h,2)=4e-4.
  • 每步 4 阶和 4 函数评估的经典 RK4 执行步长 h=0.04 的 25 步,全局误差幅度 pow(h,4)=2.56e-6

修复全局误差大约 1e-4 函数求值次数的反比

  • 欧拉为 10000,h=1e-4
  • 200 用于改进欧拉,h=1e-2
  • 经典 RK4 为 40,h=0.1

这解释了如果针对相同级别的全局错误调整方法时的速度差异。


在球示例中实现 RK4 的策略是针对 ODE 系统 x'=f(t,x),其中 x 是可能非常大的状态向量

 save t0=t, x0=x
 evaluate k1 = f(t,x)
 set t=t0+h/2, x=x0+h/2*k1
 evaluate k2=f(t,x)
 set x=x0+h/2*k2
 evaluate k3=f(t,x)
 set t=t+h, x=x0+h*k3
 evaluate k4=f(t,x)
 set x=x0+h/6*(k1+2*(k2+k3)+k4)

在基于代理的系统中,将属于代理的状态向量的组件存储为代理的内部变量是合理的。然后通过迭代代理集合并计算针对内部变量定制的操作来执行向量操作。


如问题所示,二阶 ODE 被转换为一阶系统,x''=a(x,x') 被转换为 [x',v']=[v, a(x,v)]。代理系统的大向量由 [x,v] 对的集合组成,或者,如果需要,作为所有 x 组件的集合和所有 v 的集合的串联组件。