相关文章推荐
谦和的灌汤包  ·  Android ...·  9 月前    · 
讲道义的青蛙  ·  未解析的引用go-掘金·  11 月前    · 
冲动的消炎药  ·  NPM 7 ...·  1 年前    · 
·  阅读
11 --- 重访羊-草模型与系统动力学建模

这是最后一节课程了,在这里,我们主要学习是:
基于系统动力学的建模方式

我们之前一直学习的都是 多主体建模方式 ,这种方式适合模拟具有中等尺度,具有一定异质性的系统。使用这种建模方式,是出于以下几点的考虑:
  • 关心每个 agent 的属性和变化
  • 注重观察不同规则下的“涌现”现象

这种建模方式并不适合:
  • 大规模系统(上千以上的个体数)
  • 个体行为不起作用
  • 空间因素不显著
这几种情况。
而 基于系统动力学的建模方式 则能很好地弥补这种短板。

我们先创建一个最简单的动力学模型:
羊的繁殖模型(不考虑缺草,不考虑天敌)

先从数学模型入手,我们分析 羊的数量X 随时间步 t 的变化率:
a 是一个时间步 t 后,羊的数量X 的繁衍率;
b 是一个时间步 t 后,羊的数量X 的死亡率。
(a-b )X 就代表了一个时间步 t 后,羊的数量X 的增量。


由此我们可以计算 羊的数量X 随 时间步t 的变化函数(是微分方程)。
其中exp(a-b) 的意思是 自然对数 e 的 (a-b)次方。

然而,不是所有的微分动力系统都能用解析的方式求解,所以需要:
把微分方程转换成 差分方程(数值模拟的求解方法)。



接着我们就可以开始写代码了。
1. 依次添加按钮和 绘制羊群数量X的图。
绘图笔更新命令记得要删干净
2. 在“工具” 一栏 ,打开系统动力学建模工具

先来介绍这些
  • 检查 ------ 对代码的语法检测
  • 存量 ------ 好比是一个水桶,代表着 对象的数量。(在这里,羊是一个对象,存量代表羊的数量)
  • 变量 ------ 通常拿来代表数学模型的 系数、参数,方便调试
  • 流量 ------ 好比水龙头+水管。可以给水桶储水,也可以给水桶放水。流量上有一个“水龙头”,水龙头拧的角度小,水流就小,反之。而拧水龙头的角度是由变量和存量来决定的,所以就需要下面的连接。
  • 连接 ----- 把变量和存量指向“水龙头”,“水龙头”就能调用这些数值进行计算,从而控制水流大小。

照着教程,完成建模。
一些要注意的细节:
  • 先点击四个图标之一,再点击画布进行创建
  • 存量和变量都是点击一次画布就行。流量和连接 需要先点击 存量或变量 后鼠标不松开,拖到合适的位置再松开鼠标。

之后就很简单了,去调用 系统动力学建模工具中的代码 里的三个函数就行了。
system-dynamics-setup
system-dynamics-go
system-dynamics-do-plot (绘图函数)
to setup
  clear-all
  system-dynamics-setup
to go
  system-dynamics-go
  system-dynamics-do-plot
end复制代码

模型运行:
如果画的太快的话,就修改视图更新方式。



有了之前建模的基础,我们可以开始写 羊-草 模型

老样子,先从数学模型开始分析:
X 代表了 羊, Y 代表了草。


  • 羊群的变化:
aY(t) * X(t) 这一项代表着草越多,增长率越高。
-b * X(t) 这一项代表着羊群的恒定 死亡率。

  • 草 的变化:
R ----- 草 以一个常数生长出来
-cX(t)* Y(t) ----- 草 的减少与羊的数量成反比

看懂数学模型后,我们使用系统动力学建模工具进行建模:
此时不出意料的话会报错: 数值过大异常。
这是由于模型精度不够,或者系统趋于发散导致的。(系统有三种趋势:发散、周期解、混沌)

解决方法一:
降低 Δt ,提高模型精度

解决方法二:
从方程稳态的角度,计算羊群和草变化率为0、且锚定某些初始值,求解方程,得到稳态的参数。
运行界面:
注意蓝线的变化,其实到后面是维持在了12只左右,并不是灭绝了。

仿真数据还可以通过直接右键图,点 Export 导出。


分类:
阅读
标签: