如何在netlogo中实现ODE? 现在,我使用欧拉方法来解决给定的方程:
R[t+1] = r[t] + v[t] * step-size
V[t+1] = v[t] + f * step-size
发现这个类似的question,但它建议从mathematica到netlogo的单向链接,这使得它无法实现。
我在matlab中寻找类似于ode solver的东西?
答案 0 :(得分:1)
部分答案,比较Euler的精度 - 运行时估计,改进Euler和RK4
假设最耗时的部分是对系统函数的评估,即Runge-Kutta方法的向量算法开销很小。
给定T=1
的时间间隔,将方法限制为100个函数评估。然后
h=0.01
,幅度为pow(h,1)=0.01
的全局误差。h=0.02
和全局误差pow(h,2)=4e-4
的50个步骤。h=0.04
的25步,全局误差幅度为pow(h,4)=2.56e-6
。将全局错误修复为大约1e-4
,得到函数评估数的反向
h=1e-4
h=1e-2
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
的集合的串联组成。组件。