首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在NetLogo中求解ODEs,欧拉vs R-K vs R求解器

在NetLogo中求解ODEs,欧拉vs R-K vs R求解器
EN

Stack Overflow用户
提问于 2015-04-10 22:28:04
回答 1查看 302关注 0票数 1

在我的模型中,每个智能体在每个节拍上求解一个ODE系统。我采用了欧拉法(类似于NetLogo中的系统动力学模型)来求解这些一阶常微分方程。然而,为了获得稳定的解决方案,我被迫使用非常小的时间步长(dt),这意味着使用这种方法进行模拟的速度非常慢。我很好奇,有没有人有建议可以更快地解决这些常微分方程?我正在考虑实现Runge-Kutta (具有更大的时间步长?)正如这里所做的(http://academic.evergreen.edu/m/mcavityd/netlogo/Bouncing_Ball.html)。我也会考虑使用R扩展和在R中使用ODE求解器,但同样,ODE是由每个代理求解的,所以我不知道这是不是一种有效的方法。

我希望有人对这些方法的性能有所了解,并能提供一些建议。如果没有,我会尝试分享我的发现。

EN

回答 1

Stack Overflow用户

发布于 2015-04-11 02:27:23

总的来说,你的想法是正确的。为了使p排序方法在长度为T的积分间隔内达到全局误差水平tol,您需要在幅度范围内设置步长

代码语言:javascript
复制
h=pow(tol/T,1.0/p). 

然而,不仅离散化误差会在N=T/h步长上累积,浮点误差也会累积。这给出了有效步长h=pow(T*mu,1.0/(p+1))的下限。

示例:对于T=1mu=1e-15tol=1e-6

阶数为1的欧拉方法需要的步长约为h=1e-6,因此需要N=1e+6步长和函数求值。可以得到合理结果的步长范围被h=3e-8.

  • the改进的欧拉或Heun方法限制在2阶以下,这意味着步长1e-3N=1000步长和2N=2000函数的计算,有效步长的下界是4阶的经典龙格-库塔法,它给出了大约h=3e-2的步长和大约N=30步长和4N=120函数的计算。下限是1e-3.

因此,通过使用高阶方法可以获得显着的收益。同时,步长减小导致更低的全局误差的范围也随着阶数的增加而显着缩小。但与此同时,可实现的精度也增加了。因此,人们必须在知情的情况下关心何时达到该点,以便足够好地离开。

与通常用于ODE的数值积分一样,球例子中的RK4的实现用于ODE系统x'=f(t,x),其中x是可能非常大的状态向量

通过使速度成为状态向量的成员,将二阶常微分方程(系统)变换为一阶系统。将x''=a(x,x')转换为[x',v']=[v, a(x,v)]。然后,代理系统的大向量由[x,v]对的集合组成,或者,如果需要,作为所有x组件的集合和所有v组件的集合的串联。

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

考虑到LOGO语言中没有显式的函数调用参数,在调用dotx = f(t,x)的函数求值之前,需要先确定tx的正确值

代码语言:javascript
复制
 save t0=t, x0=x
 evaluate k1 = f_of_t_x

 set t=t0+h/2, x=x0+h/2*k1
 evaluate k2=f_of_t_x

 set x=x0+h/2*k2
 evaluate k3=f_of_t_x

 set t=t+h, x=x0+h*k3
 evaluate k4=f_of_t_x

 set x=x0+h/6*(k1+2*(k2+k3)+k4)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29564018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档