第1章 概述
1.1.系统动力学简介
1956年,Jay W.Forrester 放弃了其在电机控制领域的研究,转而将反馈控制的基本原则用于社会经济学系统。1961年,他在MIT工业管理学院研究公司管理问题,出版了其专著Industrial Dynomics, 这标志着这一学科的创立。 在过去的40年中,系统动力学有了长足的发展。系统动力学的理论、思想方法和工具,对于分析社会经济中许多复杂动态问题非常有效。另一方面,系统动力学的分析方法、建模方法、模拟方法和模拟工具比较规范,易于学习和应用。 1、事件-行为-结构 在日常生活中,我们往往是从事件开始认识事物的。例如股市暴涨暴跌,流行病发生,战争爆发等等。事件一般是在固定的时间点上出现的。我们要正确的认识事件,须要联系相关事件,并从它们的发展过程中去观察。也即,要考察事件所在的行为模式。行为模式是系统的外在表现,可表现为一系列的相关事件随事件的演变过程,是多个关联事件表现出的过去现在和未来。例如,我们看到的经济的缓慢增长,利率的变化,失业率的波动等。行为摸式是由系统的内部结构决定的。结构是产生行为模式的物质的、能量的、信息的内在关系。系统的结构决定其行为模式,而事件是行为模式的重要片段。 利用系统动力学分析问题,要由事件出发,分析系统的结构与行为模式的关系,以采取成功的政策和策略,调整系统结构,干预和控制系统,改善系统的行为模式,大大避免坏的事件的发生。 2、系统动力学处理问题的过程 提出 参考行为 提出假设 模型 建立模型 问题 模式分析 模拟
? 提出问题:明确建立模型的目的。即要明确要研究和解决什么问题。 ? 参考行为模式分析:分析系统的事件,及实际存在的行为模式,提出设
想和期望的系统行为模式。作为改善和调整系统结构的目标。
? 提出假设建立模型:由行为模式,提出系统的结构假设。由假设出发,
设计系统的因果关系图,流图,并列出方程,定义参数。从而将一系列的系统动力学假设,表示成了清晰的数学关系集合。
? 模型模拟:调整参数,运行模型,产生行为模式。建立好的模型是一个
实验室,可以由试验参数和结构的变化理解结构与系统行为模式的关系。
1.2 Vensim PLE 软件的特点
Vensim PLE 全名为 Ventana Simulation Enviroment Personal Learning Edition. 即Ventana 系统动力学模拟环境个人学习版。
1.利用图示化编程建立模型。在Vensim中,“编程”实际上并不存在,只有建模的概念。只要在模型建立窗口画出流图,再通过Equations输入方程和参数,就可以直接进行模拟了。如果用户需要查看有关方程和参数,可使用Mode Document工具条。另外,Vensim提供两种模型文件保存方式,一种是二进制文
1
件,后缀为.vmf;另一种是文本文件,后缀为.mdf,这种文件可以用于模型的建立和修改,但这并不是Vensim推荐的方法。
2. 运行于Windows下,数据共享性强,提供丰富的输出信息和灵活的输出方式。由于采用了多种分析方法,因此Vensim的输出信息是非常丰富的。其输出兼容性较强。一般的模拟结果,除了即时显示外,还提供保存文件和copy到剪切板。例如建立好的模型可以copy到剪贴板,再由剪贴板转到MS Word的编辑文件中。
3.对模型的多种分析方法
Vensim提供对于模型的结构分析和数据集分析。其中结构分析包括原因树分析(逐层列举作用于指定变量的变量)、结果树分析(逐层列举该变量对于其它变量的作用)和反馈列表。 模型运行后,可进行数据集分析。对指定变量,可以给出它随时间的变化图,列出数据表;可以给出原因图分析,列出所有作用于该变量的其它变量随时间变化的比较图;可以给出结果图分析,列出该变量与所有它作用的变量随时间变化的比较图;同时可以将多次运行的结果进行比较。作为最终结果的图形分析和输出,可使用Graph,它不但可以列举多个变量随时间的变化图,而且可以列举变量之间的关系图。 4.真实性检验
对于我们所研究的系统,对于模型中的一些重要变量,依据常识和一些基本原则,我们可以预先提出对其正确性的基本要求。这些假设是真实性约束。将这些约束加到建好的模型中,专门模拟现有模型在运行时对于这些约束的遵守情况或违反情况,就可以判断模型的合理性与真实性,从而调整结构或参数。真实性检验是Ventana公司的专利方法,是一种非常有效的建模工具。
1.3 使用Vensim软件处理问题的一般过程
分析系统行为模式 提出真实性检验约束 设定模型结构和参数 建模:画出流程图 填入方程和参数 建立真 实性检验 模型模拟 结构分析 数据集分析 1.4 Vensim PLE 的使用说明
Vensim PLE3.0c可使用于Window3.X,Windows 95, Windows NT操作系统下。
2
硬件要求386以上PC机,2.0M内存,1.6M磁盘空间(安装时需6M硬盘空间)。对于Machintosh机型,也可使用。
第2章 Vensim的菜单和主窗口
Vensim的用户界面是标准的Windows应用程序界面。除支持菜单和加速键外,还提供多个工具条。这使得用户操作非常方便。
2.1 Vensim PLE的主菜单
Vensim PLE提供以下菜单。对于菜单的驱动,除了逐级打开外,还可以用相应的加速键。
? File 文件管理:提供建立新模型(New Modle),打开模型(Open Modle),
保存模型(Save, Save as),打印模型(Print , Print Options)等。模型打开和建立后,检查可通过Check完成。
? View 观察:对于模型的流图进行总体观察。提供按任意比例缩放。 ? Model 模型检验:包括Reality Check 即真实性检验,Time Bounds时间
控制设置。其中Time Bounds是用于调控Simulate 和Reality Check的时间参数的。
? Windows 窗口:包括Control panel控制面板(即Variable Selection分析
变量选择,Time Axis时间轴设置,Scalling纵坐标调整,Datasets数据集选择, Graph自定义作图等),以及Pop Forward实现由其它窗口转换到模型建立窗口,Error History是出错记录,Selection History是选择记录。
? Help帮助:在该菜单下有Manual子菜单,它是Ventana 公司提供的使
用手册,比较详细。另外一个是About Modles子菜单,它提供了Vensim对模型的基本概括,如变量数目,状态量数目等。并提供对模型设置加密口令。
第3章 模型的建立
模型建立是在模型建立窗口,通过图示化的方式建立模型,或对已建立的模型进行修改。主要过程是画出流图,然后输入参数和方程。
3.1 开始
在主菜单File下,选择New Modle 或Open Modle,就可以开始一个新模型的建立或者已建模型的修改工作。在选择New Modle情况下,会出现如下窗口。它是用来对于模型初始化的。可以选择起始时间,结束时间,时间单位,时间步长(Time Step)和数据记录步长SAVEPER。
3
3.2 画图工具条
其功能依次为:
? Pointing 指针:用于选中、移动和改变变量和图符。有三种选择方式。按下
左键并拖动会看到一个虚线方框,松开左键则方框内所有变量和图符被选中,选中后可以用鼠标拖动之;可直接左键用点按变量或图符选中之,按下左键可以拖动,另外若选中图符操作柄(一个小圆圈),可对图符进行伸缩放大;对变量用左键连续点按两次会将它选为工作台变量。
? Variable 变量:用于定义非状态变量的变量,如辅助变量和常量。
? Box Variable 方框变量:用于创建状态变量。注意,Vensim 一般约定,状
态变量第一个字母大写,常量和表格量字母全大写,其余变量字母全小写。但用户也可以有自己的约定。
? Arrow 箭头:用于创建表示因果关系的箭头,可以是直的或弯曲的。注意,
创建时,先选中箭头,在因变量上按下左键,然后松开,移动鼠标到空白处点按左键,松开后移动到果变量再点按左键。在中间电按位置会有一个操作柄。
? Rates速率变量:用于创建速率变量。它有四部分构成,两个箭头,一个开
关,两朵表示源和漏的云,和变量本身。可通过选择移动开关,移动和改变图符形状。速率变量一般至少有一端指向一个状态变量,在创建时可是其一端直接指到状态变量上。
? Shadow Variable:有时模型很大,若一个变量已在一个子块中定义,在另
一子块中,只要用Shandow Variable 再声明一次即可。
? Comment 注释:用于为流图增加注释,使容易看懂。Vensim的注释方法很
丰富,可以是文字,图符等。它在模型流图中无实质性作用。 ? Delete 删除:用于删除相关内容。
? Equations建立方程: 用于方程建立,即建立等式,赋值,定义单位等。 3.3 对于图符和字体的调整 Vensim提供图符和字体的丰富多彩的表示方式。对于已有的图符和字体,有两种方法实现调整。一种是用指针选中图符和变量(注意,图符要选其操作柄),然后再点按底部工具条。一种是直接用鼠标右键点按图符操作柄或变量,就会出现相应的对话框。
4
(1) 利用工具条对图符和字符作调整:
图示工具条功能依次如下:
1. 字体选择:可用来对于当前变量或注释选择任何windows所提供的字体。也可选择汉字。 2. 字体的大小。 3. b:字体的加粗。 4. i:字体倾斜。
5. u:字体加下划线。 6. s:字体加中串线。 7. 设置字体颜色。 8. 设置变量边框颜色。 9. 变量边框形状选择。 10. 文本的位置选择。 11. 设置箭头的颜色。 12. 箭头的形状选择。
13. 设置箭头的极性。一般用“+,-”,也可选择用“S,N”。 14. 将加亮的字符移到下面。
熟练使用这些工具条可以使模型外观非常漂亮。但这些工具对于模型本身无实质影响。
(2) 利用对话框操作对图符和字符作调整: 如上所述,用鼠标右键单击要操作的图符操作柄,则会出现相应的对话框。这些对话框主要有箭头选择对话框,开关选择对话框,注释对话框,变量选择对话框。其中注释对话框和变量设置对话框我们在后面讨论。
? 箭头选择对话框:图示可以选择极性(可以选择字体),箭头可以隐藏,
可以无头,可以选择颜色及线的形状和宽度。这是对于因果关系箭头和速率量箭头操作的。
开关选择对话框:对于速率量的开关操作。用来调整速率变量相对于图符的位置,图符的颜色等。 3.4 对流图加注释 通过选择建立模型工具条可打开如下注释对话框。注释可以是文字的或图形的。文字的注释可以选择字体、大小、颜色、加粗等。图形的注释可以选择点位图或者是可以是Windows的图元文件(均可由剪贴板获得)。可以对注释加边框,选择边框形状等。 3.5 方程和参数的输入 方程的左边一定是某一变量,而Vensim是围绕这一变量来建立方程和输入参数的。在画图工具条中,有一个Equations项,当模型各种变量的关系建立完成以后,点击该项即可对任何一个变量进行建立等式和赋值等工作。点击任何一个变量后,会先出现对话框。主要内容包括:
? 方程编辑:可选择变量、函数、数字和运算符构成方程。
? Variables输入变量:若流图正确,此变量的因变量均包含于此,并构成
输入变量。在方程编辑中只要从此选择即可,不需要再写入变量了。 ? Functions 函数:此处列举了Vensim提供的所有函数,可选择进入方程
编辑。
5
? Type: 确定变量类型,如表函数等。
? Units 单位:方程右边必须有正确的单位。若是一个无量纲量,可不加
或输入dmnl。
? Comment 注释:可对于方程进行注释,以增加可读性。
? Erros 错误信息:在方程书写中,会随时提示书写是否正确。
3.6 查找表的建立 表函数是SD一个重要特征。它用于建立两个变量之间的非线性关系。特别是软变量之间的关系。例如员工士气对工作效率的影响程度。一般,两个变量先归一化,或者先规整化,再根据经验给出大致的关系图来。这样设计的变量是无量纲量。当在Type中选择Lookup项时,会有As Graph选项,选择此选项,就会出现对话框。该对话框用于图形化定义一个查找表。包括自变量和函数值列举,自变量和函数的最大值等。用鼠标左键在图形框中点按,会自动构成图形。 3.7 对于Limits 模型重新设计以后的流图
我们对于Vensim PLE的modles子目录中的模型Limits进行重新编辑,得到以下。模型文件为:limitn.vmf。
Limmits模型RABBITBIRTH RATEINITIAL RABBITPOPULATIONAVERAGERABBIT LIFE++RabbitPopulation+++rabbit births+rabbit deaths+effect ofcrowdingon deathsAREA OFGRASSLANDGRASS REQUIREDPER RABBITrabbit crowding+++carryingcapacity+EFFECT OFCROWDING ONDEATHS LOOKUP
第4章 模型建立后的静态分析
模型建立后,在运行前和运行后均可以进行静态分析。这主要的是一种结构分析。Vensim是通过分析工具条操作的。其中,原因树分析、结果树分析和反馈回路分析是对于具体的变量进行的,因此首先要选择变量到工作台。而模型文档列举和量纲检查是对于整个模型的分析。
4.1 将分析变量选人工作台
变量选入有两种方法,一是选择模型建立工具条的指针Pointing,然后连续
6
两次点按要选择的变量,就会在主窗口标题栏看到被选中的变量。另一种方法是,选择Control panel下的变量选择(Variable),则会出现一个对话框,列出了模型的所有的变量,且可以分类显示,选择要分析的变量即可。
4.2原因树分析
对于给定变量,列举作用于其上的变量;然后对于这些变量,再列举作用于其上的变量;依次类推,逐级反向追溯,直到出现给定变量本身的一级为止。这时,就得到了给定变量的一个原因树,最末一级的所有变量(除变量本身),实际上是该子系统的边界。是这些变量的外部作用决定了给定变量的。图示是对于变量Rabbit Populationd的原因树分析图。可以锁定窗口,打印该图,也可以拷贝到剪贴板或以图元文件(wmf)保存。
锁定窗口 打印 输出剪贴板
4.3结果树分析
对于给定变量,列举其作用的变量;然后对于这些变量,再列举其作用的变量;依次类推,逐级正向追溯,直到出现给定变量的一级为止。给定变量的结果树也构成了一个子系统,其最末一级的所有变量(除给定变量本身),构成子系统边界,表示指定变量对于整个系统的最终作用。图示是变量Rabbit Populationd的结果树分析图。
4.4模型文档
Vensim没有“程序”,用户可以看到的是方程列举的文档。该文档详细列举了所有等式、参数、表函数,以及用户注释及Vensim提供的用途分析。这一文档和模型流图构成了Veansim基本的模型文档。
(01) AREA OF GRASSLAND = 20000
7
Units: square yards
Uses: (03)carrying capacity - Units: Year
Uses: (13)rabbit deaths - Units: Rabbit
(01)AREA OF GRASSLAND -
(07)GRASS REQUIRED PER RABBIT - Uses: (12)rabbit crowding - Units: Dmnl
(12)rabbit crowding -
(05)EFFECT OF CROWDING ON DEATHS LOOKUP - Uses: (13)rabbit deaths -
(02) AVERAGE RABBIT LIFE = 2
(03) carrying capacity = AREA OF GRASSLAND / GRASS REQUIRED PER RABBIT
(04) effect of crowding on deaths = EFFECT OF CROWDING ON DEATHS LOOKUP(rabbit crowding)
(05) EFFECT OF CROWDING ON DEATHS LOOKUP ([(0,0)-(10,10)],(0,0.5),(1,1),(1.5,2),(2,5),(2.5,10) )
Units: Dmnl
Uses: (04)effect of crowding on deaths - Units: Year
The final time for the simulation. Units: square yards/Rabbit Uses: (03)carrying capacity - Units: Rabbit
Uses: (14)Rabbit Population - Units: Year
The initial time for the simulation.
Uses: (00)Time - Internally defined simulation time. Units: 1/Year
Uses: (11)rabbit births - Units: Rabbit/Year (14)Rabbit Population - (10)RABBIT BIRTH RATE - Uses: (14)Rabbit Population - Units: Dmnl
(14)Rabbit Population - (03)carrying capacity -
8
(06) FINAL TIME = 10
(07) GRASS REQUIRED PER RABBIT = 10
(08) INITIAL RABBIT POPULATION = 100
(09) INITIAL TIME = 0
(10) RABBIT BIRTH RATE = 1.1
(11) rabbit births = Rabbit Population * RABBIT BIRTH RATE
(12) rabbit crowding = Rabbit Population/carrying capacity
Uses: (04)effect of crowding on deaths - Units: Rabbit/Year (14)Rabbit Population - (02)AVERAGE RABBIT LIFE - (04)effect of crowding on deaths - Uses: (14)Rabbit Population - Units: Rabbit
(08)INITIAL RABBIT POPULATION - (11)rabbit births - (13)rabbit deaths - Uses: (11)rabbit births -
(12)rabbit crowding - (13)rabbit deaths -
(13) rabbit deaths = (Rabbit Population / AVERAGE RABBIT LIFE) * effect of crowding on deaths
(14) Rabbit Population = INTEG(rabbit births-rabbit deaths,INITIAL RABBIT POPULATION)
(15) SAVEPER = TIME STEP
Units: Year
The frequency with which output is stored. (16)TIME STEP - The time step for the simulation. Units: Year
The time step for the simulation.
Uses: (15)SAVEPER - The frequency with which output is stored.
(16) TIME STEP = 0.125
4.5反馈回路分析
对于给定变量,列举包含该变量的所有的反馈回路。注意,尽管在建立模型时标明了每个箭头的极性,但Vensim并不提供反馈性质分析。图示是包含变量Rabbit Populationd的反馈回路。
第5章 模型模拟及数据集分析
建立好了模型,就可以进行模拟和数据集分析。Vensim的数据集分析是对于模拟的结果—数据文件.vdf进行比较分析。可以对于一次运行结果分析,也可
9
以对于多次运行结果(即多个 .vdf文件)比较分析。同结构分析一样,数据集分析一般也是对于具体的变量进行的,须先选择要分析的变量。
5.1模型模拟
选择主菜单下面的SET选项,会出现下面对话框。它允许用户修改有关参数,表函数,设定保存运行结果的文件名等。在对于同一模型反复调整参数,比较运行结果时很重要。注意,这里对于参数和表函数的修改不会保存到模型文件中去。 另外可以利用主菜Model中的Time Bounds,对于运行起始时间,步长进行重新设定。模型运行后会产生供数据集分析用的文件.vdf。若是多次调整参数运行同一模型,并生成不同数据文件,则图形和表格显示是多次运行结果的比较。 例如,在不同的参数条件下,运行Limits模型,得到数据文件:Current.vdf,Current1.vdf,Current2.vdf。下面对于变量 Rabbit Population 进行分析。首先,在鼠标选择Pointing情况下,连续两次点按变量Rabbit Population。可以看到,该变量被选入工作台标题栏。
5.2 数据集分析的工具条
? Run Compare运行比较:在多次运行同一模型,只是改变其参数时,显示和列举各
次运行的参数比较。在此例中,按下该工具条,则出现下面对话框。将其Export到剪贴板,最后得到参数比较的文本。它详细记录了三次运行模型参数的调整情况。由于这些变化,使模型表现出不同的行为模式来。
Comparing C:\\VENSIM\\MODELS\\CURRENT2 and C:\\VENSIM\\MODELS\\CURRENT1 ******Constant differences between C:\\VENSIM\\MODELS\\CURRENT2 and
C:\\VENSIM\\MODELS\\CURRENT1******
AVERAGE RABBIT LIFE - has changed in value
2 C:\\VENSIM\\MODELS\\CURRENT2 3 C:\\VENSIM\\MODELS\\CURRENT1 -----------------------------------------------------------
GRASS REQUIRED PER RABBIT - has changed in value 10 C:\\VENSIM\\MODELS\\CURRENT2 12 C:\\VENSIM\\MODELS\\CURRENT1 -----------------------------------------------------------
******Lookup differences between C:\\VENSIM\\MODELS\\CURRENT2 and
C:\\VENSIM\\MODELS\\CURRENT1******
EFFECT OF CROWDING ON DEATHS LOOKUP - has changed in value
C:\\VENSIM\\MODELS\\CURRENT2 C:\\VENSIM\\MODELS\\CURRENT1 X | Y X | Y 0 | 0.5 0 | 0.5 1 | 1 1 | 1 1.778 | 1.69 1.5 | 2 2.629 | 3.063 2 | 5 3.17 | 4.613 2.5 | 10 4.098 | 7.359 4.974 | 9.894
10
? Strip 给出分析变量随时间的变化图。变量Rabbit Population 的Strip图如下:
? Causes Strip 结果图:给出分析变量本身及其直接作用的其它变量的Strip图。
C:\\VENSIM\\MODELS\\CURRENT2C:\\VENSIM\\MODELS\\CURRENT1C:\\VENSIM\\MODELS\\CURRENTRabbit Population6,0004,5003,0001,5000rabbit births6,0004,5003,0001,5000rabbit crowding43210rabbit deaths6,0004,5003,0001,500002.5
? Table 数据表:给出分析变量随时间变化的数据表格。
5Time (Year)7.510
5.3 控制窗口及输出的优化
一般数据集分析是结合控制窗口的操作完成的。Vensim 提供了控制输出的强大功能,使对于模型运行分析更方便、深入,输出结果更漂亮。
11
1. 控制窗口和控制工具条 在主菜单Windows中有Control panel选项,其中包含Variable,Time Axis,Scalling,Datasets, Graph,与底部的控制工具条功能相同。
? Variable 变量选择:见前述。
? Time Axis 时间轴:用于选择感兴趣的时间区间。若不选择,则分析全区间。 ? Scalling 纵坐标调整:有两种选择。在选择Raw时,曲线最高点撑满纵坐标;在
选择Rounded时,曲线最高点在纵坐标轴的适当的分割点,以使图形美观。
Raw Rounded
? Datasets 数据集选择:用于选择要分析的运行结果数据文件进入数据集,见下述。 ? Graph 作图:由用户选择作图,见下述。 2. 数据集选择
一般在作图前先要进行数据集选择。进入数据集选择有两种途径,一是直接由底部工具条进入,另一是由Control panel选项下的Datasets进入。
图示,在c:\\Vensim\\models子目录下共有三个vdf文件,其中CURRENT1和CURRENT已列人数据集。“>>”和“<<”是用来将选择文件取出和加入数据集的。而Delete选项,将会把数据文件由磁盘删除。 3. 用户自定义作图 Vensim提供两种进入用户自定义作图的途径。一种是通过Control panel选项下的Graph,一种是通过建立方程的Lookup选项。通过选择显示变量,设置X、Y轴划分,曲线宽度等,最后得到多个变量的比较曲线。
12
Variables Comparing6,0006,0006,00040000RabbitRabbit/YearRabbit/YearDmnlRabbitRabbit/YearRabbit/YearDmnl0 2 4 6 8Time (Year)Rabbit Population - C:\\VENSIM\\MODELS\\CURRaRbEbNitT2rabbit births - C:\\VENSIM\\MODELS\\CURRaEbNbTit2/Yearrabbit deaths - C:\\VENSIM\\MODELS\\CURRRaEbNbTit2/Yeareffect of crowding on deaths - C:\\VENSIM\\MDOmDnElLS\\CURRENT2
第6章 使用汉字变量建立模型
Vensim中,变量的定义几乎是随意的,完全符合自然语言规范。变量名可以直接定义成相应的单词或词组。在使用英文变量名时,一般约定状态量的第一个字母大写,常量或表函数的字母全大写,而速率量和辅助变量的字母全部小写。在中文Windows或西文Windows环境下,再加中文之星或其它汉字系统,我们可以直接用变量的汉字名作为变量名用于模型。这样使模型建立、运行、分析及模型文档的保存等非常方便易懂。下面以一个简化城市模型为例再次说明Vensim的模型建立、运行和分析过程。
6.1模型建立
13
简化城市模型建模者:复旦大学管理学院 贾建国 1997.5劳动力与工作岗位比率劳动力因子表企业劳动力因子劳动力<人口总量>工作岗位劳动力因子企业提供平均岗位率企业额定建设率企业发展因子企业建设企业土地系数企业土地系数表住房土地因子表工作吸引力因子表企业额定折旧率企业总量企业折旧企业初始总量企业占地土地占用因子住房土地因子土地面积住房占地住房初始总量工作吸引力因子住房建设因子住房建设住房总量住房折旧住房额定建设率住房可得性因子住房可得性因子表住房吸引力因子表住房吸引力因子人口迁入吸引力因子人口出生人口死亡住户数与住房比率住房额定折旧率家庭人口数人口增长百分率人口初始总量额定迁入率额定迁出率人口总量人口迁出<人口迁入>额定出生率额定死亡率
? ? ? ? ?
变量的定义:先定义状态量:人口总量,住房总量,企业总量。然后再定义速率量,并与相应的状态量连接。最后定义其它类型的变量。 建立因果关系:由变量之间的实际因果用箭头连接各变量。
输入常量数据:由Equations选项直接输入常量,注意定义其单位,单位也可以是汉字。
输入表函数数据:先打开Equations选项,再选择Lookup下的 Graph,有具体数据建立表函数。一般情况下,表函数的值是无单位的。
建立其它变量的方程式:在Equations选项下,直接选择有关变量运算
14
符和函数等建立,但要注意输入正确的单位。
? 注释:为了醒目,这里把状态量、速率量、常量、标函数和辅助变量区
别表示。
? 检查:可进行单位检查和模型检查。Vensim对于模型的变量单位符合情
况可进行严格的监测,但又有较强的容错能力,即使单位有不符,也不影响运行。
建立后的模型如上图。
6.2静态分析
对于人口总量这一变量分析,其原因树、结果树如下图:住房初始总量(住房总量)住房额定建设率住房建设住房总量住房建设因子(住房总量)定折旧率住房折旧
住房额
土地占用因子企业土地系数住房土地因子住房总量住房建设(住房总量)住房折旧(住房总量)住房可得性因子住户数与住房比率 住房吸引力因子反馈列举如下:共有
6个反馈回路经过该变量。
Loop Number 1 of length 1 住房总量 住房建设 Loop Number 2 of length 1 住房总量 住房折旧 Loop Number 3 of length 4 住房总量
住户数与住房比率 住房可得性因子 住房建设因子 住房建设 Loop Number 4 of length 4 住房总量
土地占用因子 住房土地因子 住房建设因子 住房建设 Loop Number 5 of length 15 住房总量
住户数与住房比率
15
住房吸引力因子 吸引力因子 人口迁入 人口总量 劳动力
劳动力与工作岗位比率 企业劳动力因子 企业发展因子 企业建设 企业总量 土地占用因子 住房土地因子 住房建设因子 住房建设 Loop Number 6 of length 15 住房总量
土地占用因子 企业土地系数 企业发展因子 企业建设 企业总量 工作岗位
劳动力与工作岗位比率 工作吸引力因子 吸引力因子 人口迁入 人口总量
住户数与住房比率 住房可得性因子 住房建设因子 住房建设
模型文档如下:
(01) 额定出生率 =0.03
Units: 1/年
Uses: (26)人口出生 -
(02) 额定迁出率 = 0.07
Units: 1/年
Uses: (27)人口迁出 -
………………………………..……………………………….
(37)住房初始总量 -
16
(40)住房建设 - (49)住房折旧 -
Uses: (34)土地占用因子 - (40)住房建设 - (49)住房折旧 -
(51)住户数与住房比率 -
(51)
住户数与住房比率 = 人口总量/(家庭人口数*住房总量)
Units: 户/房 (31)人口总量 - (50)住房总量 - (08)家庭人口数 -
Uses: (42)住房可得性因子 - (46)住房吸引力因子 -
SAVEPER = 1 Units: 年
The frequency with which output is stored.
TIME STEP = 1 Units: 年
The time step for the simulation.
(52)
(53)
6.3模型模拟
先按原模型数据模拟一次,再改变住房土地因子表和企业土地因子表模
拟一次,得到数据文件city.vdf和city1.vdf。由运行参数比较获得以下:
Comparing CITY and CITY1
******Constant differences between CITY and CITY1****** FINAL TIME - has changed in value 50 CITY 100 CITY1
-----------------------------------------------------------
******Lookup differences between CITY and CITY1******
企业土地系数表 - has changed in value
CITY CITY1 X | Y X | Y 0 | 1 -0.005155 | 0.7254 0.1 | 1.15 0.1289 | 0.838 0.2 | 1.3 0.2294 | 0.9437 0.3 | 1.4 0.3093 | 1.049 0.4 | 1.45 0.4175 | 1.19 0.5 | 1.4 0.4948 | 1.282 0.6 | 1.3 0.567 | 1.394 0.7 | 0.9 0.6211 | 1.493 0.8 | 0.5 0.6985 | 1.585 0.9 | 0.25 0.7448 | 1.62 1 | 0 0.7938 | 1.655
17
0.8376|1.634 0.8686|1.535 0.8969|1.373 0.9046|1.169 0.9072|1.155 1|0
住房土地因子表 - has changed in value
CITY CITY1 X | Y X | Y 0 | 0.4 0 | 0.4 0.1 | 0.7 0.1 | 0.7 0.2 | 1 0.2 | 1 0.3 | 1.25 0.2655 | 1.282 0.4 | 1.45 0.3247 | 1.493 0.5 | 1.5 0.3814 | 1.606 0.6 | 1.5 0.3814 | 1.599 0.7 | 1.4 0.4562 | 1.606 0.8 | 1 0.5541 | 1.415 0.9 | 0.5 0.634 | 1 1 | 0 0.7088 | 0.6549 0.8299|0.3451 1|0
6.3数据集分析
下图分别是住房总量随时间的变化图,它的直接决定变量随时间的变化图,及它所直接决定的变量随时间的变化图。 CITYCITY1住房总量200,000100,0000025Time (年)50
18
CITYCITY1住房总量200,000100,0000住房建设4,0002,0000住房折旧2,0001,0000012.525Time (年)37.550住房初始总量CITY: 14,000 CITYCITY1住房总量200,000100,0000土地占用因子21住房建设4,0002,0000住房折旧2,0001,0000住户数与住房比率1.50012.50CITY1: 14,000
25Time (年)37.550
第7章 真实性检验
证实所建立的模型的合理性和有效性,有好多方法。而Vensim所提供的真
实性检验(Reality Check)是一种非常有效的方法和工具。它也是Vensim的一个主要特征。
19
7.1真实性检验的概念
模型是对于现实存在的系统的简化和抽象。我们可以由建立的模型方便的得到系统的行为模式。但如何确定这些行为模式正确性?常用的一种方法是对照现实的情况,仔细分析运行得到的各个变量时间序列数据及其相互关系。在系统复杂、变量多情况下,这是很困难的。一种简单有效的方法是首先确定模型的正确性。如果模型不违反基本的常识和规则,模型本身的合理性得到了检验,则系统的行为模式的真实性就有了保证。真实性检验由这一思想出发,提供了一种简便和有效的方法和工具。
根据要研究的系统的基本情况,我们一般可以提出模型应该遵守的一些基本假定。这些基本假定是保证模型正确的必要条件,构成了对于模型正确性的一系列约束。真实性检验就是在模型建立后,通过标准的约束描述语言,具体地描述这些约束,并通过运行模型,自动的检验系统的行为模式是否违反这些约束。若违反,说明模型尚不完善,则要调整模型的结构和参数,直到符合这些约束条件。真实性检验的描述部分完全独立于模型本身,不会改变模型结构和行为模式。
7.2模型真实性检验的定义
1.变量的命名
检验语句是对于假设的描述,是由实际系统出发对于模型的行为模式的断言。它一般包含的变量是“判断句”。有别于一般的变量用名词命名,它一般用表示判断的短语命名。例如:no worker no production, rain means flooding。 2. 输入测试变量(Test Input) 用来代替一个等式。它只能用作约束的前提条件,可以使约束变得简单易读。在约束表达式中,在其条件部分出现以一个逻辑变量形式出现。其定义形式为: name :TEST INPUT: variable = expression
其中,name表示变量名,:TEST INPUT: 是变量类型标识,而后面等式是定义的对象。等式右边可以是允许的任意表达式。等式左右边的构成变量均来自模型。
例如:best condition :TEST INPUT: temperature = 3*initial temperature 3. 时间演进函数(Time Transition) 该函数的自变量是时间,而函数值是随时间变化的变量值。其一般表达式为: variable = TIME TRANSITION (X,… ,Y ,….)
其中X是时间,而函数值variable按一定的对应规则取相应的Y。在Y的列举中,可以有“-”,表示保持模型的值,而“*”表示采用模型的计算值。实际上,Y是我们对于模型行为模式随时间变化的一种假定的表示。 主要形式有以下几例: profit = TIME TRANSITION (0,30,80,100,20,50,50,15)
表示profit随时间变化的折线图。时间由0、30、80到100,profit由20斜线上升到50,保持50不变,然后斜线下降到15。 profit = TIME TRANSITION (30,80,100,-,50,*)
表示profit在时间30以前采用模型正常值A;在时间区间30-80,profit采用以(30,A)为起点,以(80,50)为终点直线上的值;在时间区间80-100,将采用模型的计算值。 profit = TIME TRANSITION (30,80,100,*,50,*)
表示在时间区间30-80,profit采用模型的计算值,在时间为80时值为50。
20
其余与上相同。
通过一个变量的时间演进函数与一个表达式的积,可以构造另一个变量的时间演进函数。其一般表达式为: variable = TIME TRANSITION (X,… ,Y ,…)*expression
例如:big workforce :TEST INPUT: Workforce = TIME TRANSITION(35,50,*,1)*
MAX WORKFORCE
又如:good profit :TEST INPUT: profit = TIME TRANSITION(0,30,80,100,1,0.7,0.8,0.9)
*(revenue-cost)
注意,“-”和“*”的使用有以下限制: ? 时间值必须是递增的。
? “-”不能在数字和另一个“-”后面出现。它只能在第一个Y的位置出
现,但“*”可以在其后面出现。
? 若一个数值后面有“*”,则“*”后不能再跟随其它的数值,但可以再
跟随一个“*”。
5. 约束的结构
一般的结构是:
name(名字) :THE CONDITION: condition(条件) :IMPLIES: consequence(结果)
其中“:THE CONDITION:”和“:IMPLIES:”是约束语句的关键词。而condition是约束语句的条件表达式部分,consequence是结果表达式部分,它们都是逻辑表达式。
逻辑表达式
逻辑表达式可以由“=,>,<,:AND:,:OR:,:NOT:”等构成。在其condition部分,应该尽量采用TEST INPUT变量,这样便于理解。若不采用,尽量避免使用复杂的逻辑关系。例如:
no capital no production :THE CONDITION: Capital = 0 :IMPLIES: Production = 0 big problem :THE CONDITION: Population > 8E9 :AND: (food ratio < 0.75 :OR:
Pollution > CRITICAL POLLUTION) :IMPLIES: Food <= TIME TRANSITION(50,100,-,1)
但是,在逻辑表达式中,一般除等式外,不允许出现代数运算。如下式是错误的。
pop lt cc :THE CONDITION: Population < Carrying Capacity *1.1 :IMPLIES: deaths
from crowding <1000
可用下式来代替以上:
pop lt cc :THE CONDITION: Population=Carrying Capacity *1.1 :IMPLIES: deaths
from crowding <1000
或先定义输入测试变量:
pop at cc plus 10 :TEST INPUT: Population=Carrying Capacity *1.1
然后再定义约束:
pop lt cc :THE CONDITION: pop at cc plus 10 :IMPLIES: deaths from crowding <1000
无条件约束
有时,约束的条件部分是空的。例如:
debt bounded : THE CONDITION: :IMPLIES: debt<4E6
它表示在任何条件下debt的最大值是4E6。在进行该约束时,Vensim将通
21
过模型模拟检验debt的值是否大于4E6。若大于,则报违反信息。 在结果表达式中的时间演进函数
例如:no birth no pop :THE CONDITION: births = TIME
TRANSITION(50,60,*,0) :IMPLIES: Population < TIME TRANSITION(150,160,*,0)
它表示,在停止出生100年后,人口将会为零。
在结果表达式中使用通配符
有时为了检验是否所有变量都满足同一条件,可在结果表达式中使用通配符“*”以代替所有变量。例如:
all peaceful :THE CONDITION: FINAL TIME = 101 :IMPLIES: *<1E9 :AND: *>-1E3
用于测试是否所有变量在-1E3和1E9之间。FINAL TIME=101对于检验进行限制,因为若使用无条件表达式,这一检验是很费时间的。
7.3将真实性检验键入模型
在Vensim标准版中,有三种方法将真实性检验加入模型。一种是利用Equation Editor,一种是利用Text Editor,一种是在流图上直接定义变量建立。但Vensim PLE的Equation Editor似乎不提供这一功能。虽然Vensim PLE未提供Text Editor,但我们可以利用其它的文本编辑器实现真实性检验的建立。流图法在Vensim PLE中可以实现。 1.流图法
在模型建立后,可以先利用模型建立工具定义真实性检验的变量,然后用因果关系箭头建立这些变量之间的联系(它们之间联系并不是真实的因果关系),最后在Equation Editor中写入与每个变量有关的表达式。其缺点是从外观上改变了模型的结构。容易造成混乱。例如:图示是建立的inven1.vmf模型。读者可以通过Equation Editor观察变量的定义。
INI INVENInventoryshipmentsproductionalways have stockfinal demand
fill orders when s 2.使用文本编辑器 一般的文本编辑器,如dos的Edit,win3.X的write,win95的Note book, note pad均可以用来编辑真实性检验。首先,画好模型流图,并输入模型部分的变量等式,然后将模型文件保存为以.mdl形式的文本文件。模型流图见下。然后在以上列举的文本编辑器下打开该文件,输入约束语句。对于inventory.mdl的情况,修改后文本文件内容如下。它包括四部分,第一部分是模型本身;第二部分模型运行时的控制参数;第三部分是增加的真实性检验参数;第四部分是模型流图表示的参数,它是用于在windows下显示流图的。
22
INI INVEN = 100
~ g
~ | Inventory = INTEG(production-shipments,INI INVEN)
~ g
~ | production = 30
~ g/Month ~ | shipments = 20
~ g/Month ~ | ******************************************************** ********************************************************~ .Control
Simulation Control Paramaters
| FINAL TIME ~ Month
= 100
~ The final time for the simulation. | INITIAL TIME = 0 ~ Month
~ The initial time for the simulation.
| SAVEPER =
TIME STEP ~ Month
~ The frequency with which output is stored. | TIME STEP ~ Month
= 1 ******************************************************** ~ The time step for the simulation. |
********************************************************~ .Constraints
| final demand = 20
~ g
always have stock :TEST INPUT: Inventory = 3* final demand ~ |
~
~
|
fill orders when stocked :THE CONDITION: always have stock :IMPLIES: shipments>=final demand ~ ~
|
\\\\\\---/// Sketch information - do not modify anything except names V160 *View 1
Do not put anything below this section - it will be ignored $Times New Roman|12||0-0-0|0-0-0|0-0-0
|0,Inventory,265,175,40,20,3,0,0,0,0,0,-1--1--1,-1--1--1 |1,INI INVEN,222,90,40,11,0,0,0,0,-1,0,-1--1--1,-1--1--1 |2,48,138,175,8,8,0,132,0,0,-1,0,-1--1--1,-1--1--1 |3,2,185,175,6,8,39,131,0,0,-1,0,1-1--1--1,-1--1--1
|4,production,185,194,35,11,32,0,0,0,0,0,-1--1--1,-1--1--1 |5,48,408,173,8,8,0,132,0,0,-1,0,-1--1--1,-1--1--1 |6,2,344,173,6,8,39,131,0,0,-1,0,1-1--1--1,-1--1--1
|7,shipments,344,192,32,11,32,0,0,0,0,0,-1--1--1,-1--1--1 >3,0,4,0,0,22,0,-1--1--1,1|(208,175)| >3,2,100,0,0,22,0,-1--1--1,1|(162,175)| >6,0,36,0,0,22,0,-1--1--1,1|(321,173)| >6,5,68,0,0,22,0,-1--1--1,1|(375,173)| >1,0,2,0,0,0,0,-1--1--1,1|(262,120)|
23
INI INVENInventoryshipmentsproduction
这样建立的模型真实性检验,不会在流图中出现,比较清晰易懂。
INI INVENInventoryproductionshipments
7.4真实性检验的运行
真实性检验的运行,是选择Windows菜单下的Reality Check实现的。例如对于yeast3模型的运行,会出现以下的对话框。
通过选择对于某些约束进行检验或者对于所有约束检验。在检验运行时,会将约束的条件部分嵌入模型,强制给模型中的相关变量赋输入测试值,通过vensim的运行,得到模型输出值,再与约束中的结果部分比较,得到违反或遵守的结论。该模型在选择Hungry from growth时,得到如下结果。共有六个约束,
24
有两个违反。
WARNING: At 0 Above \
At 0 Above \ WARNING:
WARNING: At 0 Above \
WARNING: At 0 Above \
Starting to test the constraint hunger from growth at time 0 Starting to test the constraint thirst from growth at time 0
WARNING: At 1 In \ WARNING: At 1 In \ WARNING: At 1 In \ WARNING: At 1 In \ The constraint hunger from growth violated at time 11 The constraint thirst from growth violated at time 11
25