最近,某个重要的同学在学习系统动力学,于是也花了几天学习了一下,今天找了篇简单的paper,花了半天用Vensim建了下模,感受了下这个软件以及系统动力学的妙处,感觉还是比较有趣的。本文主要介绍宋成举等人的paper“基于系统动力学的哈尔滨市私人小汽车出行特征建模分析”,并用Vensim复现了一下。 由于,我也是第一次使用这个软件,所以文章有些观点可能不正确,有些做法可能可以改进,还请大佬看到了给我留言,定当改正,谢谢!
这篇文章是用vensim软件来对哈尔滨的私人小汽车出行特征随着时间的推进的演化过程的分析,首先文章定型描述了下对小汽车出行特性的影响因素,这为因果回路图的构建打下了基础,继而就绘制出了因果回路图如下所示:
进而再更进一步地分析上述因果回路图如何用一些定量化的指标来量化。文章给出了具体的因果回路图和流量存量图如下所示:
有了这个图就可以使用Vensim进行建模了,但是还没有结束,因为光有模型是不行的,还要有equation和赋值这一个关键的步骤。
文章给出了一些关键的结构公式和初始值:
理论上接下来我们就可以复现文章的内容了。
关于Vensim软件大家可以看B站的视频学习下,老师讲得非常得仔细,看一遍就可以操作了。传送门。
我使用Vensim软件进行了建模,结果如下:
这个模型和paper中的模型有一点不一样,主要是我加入了一些“中转变量”和“协调量纲”等一些量,因为units check无法通过,所以加了一些辅助变量来调整量纲。后续也会继续对量纲问题进行一个说明。
论文里给出了一些结构等式,但是还有很多变量没有给出初始值和结构等式,于是我就按照定性的理解自己大致给了些等式,这些等式往往是经验公式,因此量纲是不一定会完全统一的。 也就是说经验性公式可能无法通过unit check,那是不是说软件就不好呢?那也不是,因为实际上经验性公式也是需要去对齐量纲的(使得等式两边的量纲一致),怎么做呢?就是引入一些系数,借助这些系数来调整量纲,在本例子中,我懒得去一个个命名这些系数了,于是就叫做“调整量纲”、“中转变量”之类的名字了,其实它们便是经验公式的系数了。 此外,我还发现了一个这个软件的漏洞,比如我通过计算会得出下面的一个单位“亿元/万人”,其实这个单位就是“万元/人”,但是由于有些变量我的单位取为“亿元”,有些变量我的单位取为“万人”,因此如果想要通过unit check就只能取为“亿元/万人”这样的单位了,这个我没想到更好的解决办法。此外,我还有一个想法,其实为了简单起见,我们可以把所有的变量都设为dmnl,也就是无量纲(其中有几个需要设为dmnl.time unit),这样就一定会通过unit check了。当然这种做法是不推荐,也是毫无意义的,因为unit check本来就是一种检验正确性的机制,逃避这种机制就等于增加了错误几率,而且其实unit check即使不通过也是可以进行simulink的,而且对结果是没有影响的,但是也不推荐,因为量纲不正确,往往意味着存在一些bug。不过,有时候,存在上面提到的问题,也就是对于一个经验性公式,我们懒得定义系数了,这时如果确保公式是没问题的,也可以忽略这个unit does not match的问题,有时候,还有下面的问题,我们使用了Y = IN(X),而X是有量纲的,这时unit check也会报错的,说是IN函数不允许有量纲的值作为输入,但是我们也懒得去定义一个系数去除X的量纲了,那么这时也可以忽略这个unit does not match的问题,总之还是具体问题具体分析吧。
下面4张图也就是4个level variable的仿真结果,单位可能有一些问题,因为论文里少了很多变量初值和等式的说明,然后自己在做的时候又有点急,所以单位很多就去掉了,为了通过unit check。但是总的来说应该是没问题,图形趋势应该说也是符合图形的信息反馈的。不过和文章的结果还是有一些出入。对于文章的结论说实话我是存疑的,尤其是私人小汽车总量,从流图中我们可以知道私人小汽车总量《-私家车增长量《-私家车增长率《-人均GDP《-GDP and 主城区人口,一般来说人均GDP肯定是递增的,不可能递减,要不然经济就衰退了,私家车增长率也肯定是递增的,进而私家车增长量也肯定是递增的,最后私家车总量也肯定是递增的,也就是我仿真出来的图,出现论文里的先增后减我表示怀疑,除非是文章在私家车增长率和人均GDP这个function处做了一些修正,但是作者没给出这个function,所以也就不得而知了。
论文中的结果。
参考文献
宋成举,薛大维,张鹏.基于系统动力学的哈尔滨市私人小汽车出行特征建模分析[J]. 黑龙江工程学院学报. 2019年第3期