系统仿真与建模分析实验报告实验一生态平衡建模实验系统描述:在一个封闭的海岛上,设有两个群体:1.狐狸(FOXES);2.啮齿动物(RODENTS)情况是:1)狐狸出生后,需要八个月成长为成年狐狸,幼年狐狸每只(每月)要吃10只啮齿动物,若没有吃的就饿死,幼年狐狸的出生率为4,成年狐狸死亡因素有两个,一是每只狐狸每月要吃60只啮齿动物,若没有吃的就要饿死,二是从仿真时间算起,十年之后,每月要被猎人打死4只。2)啮齿动物RODY出生后,三个月即可长成为成年啮齿动物,啮齿动物的出生率为0.8,如果幼年啮齿动物的父母死亡,则以短缺扶养和保护而死亡。成年啮齿动物每月的死亡率有两个原因决定:一个是被狐狸吃掉,一个原因是总数超过100000(十万)只,则以水草不足而饿死。一、实验目的通过此实验了解系统动力学的仿真方法,学会用所学的建模理论来对实际问题进行建模,并对实际问题进行分析。对此生态平衡系统进行仿真实验,改变不同的控制参数,分析实验的结果,得出系统保持生态平衡的条件,为决策者决策提供理论分析基础。二.实验原理系统动力学(SystemDynamics)是美国麻省理工学院J.W福雷斯特(JayWForrester)教授创立的一门新兴学科。它按照自身独特的方法论建立系统的动态模型,并借助于计算机进行仿真,以处理行为随时间变化的系统的问题。系统动力学首先强调系统性的观点,以及联系、发展、运动的观点,是研究复杂系统,诸如:社会、经济、环境、人口、生态平衡、产业发展等的有效工具。系统动力学的研究对象主要是社会经济系统。社会经济系统的范围十分广泛,凡是涉及到人类的社会活动和经济活动的系统都属于社会系统。诸如本文要研究的人口系统、资源系统、环境系统、经济系统、科技系统、能源系统,都属于社会经济系统。系统动力学的基础是通过实验方法认识系统的行为,为管理决策者提供决策的依据。系统动力学仿真的基本步骤是:(1)明确建模目的一般来说,系统动力学对社会系统进行仿真实验的主要目的是认识和预测系统的结构和设计最佳参数,为制定合理的政策提供依据。这一步的工作包括观察系统、专家咨询、收集数据资料等,在涉及具体对象系统时,应根据其要求,仿真目的有所侧重。(2)确定系统边界系统动力学是将研究对象视为一个系统来处理的。系统是一个相对的概念,相对于所研究问题的实质和建模的目的而言。一旦所要研究的问题的实质和建模的目的已经确定,系统也就确定了,其边界应该是清晰的和唯一的。确定了系统边界之后,才能确定系统的内生变量和外生变量。内生变量是由系统内部反馈结构决定的变量,外生变量是由影响环境因素确定的变量。系统动力学认为系统的行为是基于系统内部的种种因素而产生的,并假定系统的外部因素不给系统的行为以本质的影响,也不受系统内部因素的控制。(3)因果关系分析通过因果关系分析,要明确系统内部各要素之间的因果关系,并用表示因果关系的反馈回路来描述。系统动力学认为反馈环是构造系统的第一层次,其多少是系统复杂程度的标志。观察实际系统获得的信息首先用于这一层次。任意两个系统要素从因果关系来看必然是正因果关系、负因果关系或无因果关系。由于决策是在一个或几个反馈回路中进行,而且由于各种回路的祸合,使系统的行为更加复杂化。(4)建立系统动力学模型进行因果关系分析属于系统动力学仿真的定性分析,要对系统进行定量分析还必须借助流图与构造方程式建立系统模型。所谓建模就是要确定各反馈环中的流位和流率。流位是系统的状态变量,它的变化可用来描述系统的动态特征:而流率是流位的变化速率,它控制着流位,流率变量是一个决策函数。当确定了流位和流率变化之后,就可以得到流图与构造方程式。(5)运行模型采用系统动力学仿真语言,将上一阶段建立的系统模型转换成系统仿真模型,并在计算机上模拟运行,得出结果。(6)结果分析通过对结果的分析,不仅可发现系统的构造错误和缺陷,而且还可以找出错误和缺陷的原因。根据结果分析情况,如果需要,就对模型进行修正,然后再做仿真试验,直至得到满意的结果为止。三、理论分析狐狸的数量在前120个月主要受其出生率和兔子的数量决定,当兔子数量足够时,出生率是影响狐狸数目的唯一因素,兔子的出生率即时它的纯增长率。兔子数量不足时,兔子的数量是限制狐狸数量的主要因素。在本实验中,简化了实验模型,假设当兔子数量不足狐狸数量的120倍(参照成年狐狸两个月的食量)时,狐狸就会出现饿死现象,且死亡的均为成年狐狸,狐狸总数量保持在兔子数的1/120倍。120个月后,猎人开始捕杀狐狸,每月捕杀4只。影响兔子数量的直接因素有兔子出生率、狐狸数量、水草不足、因父母死亡导致幼兔死亡四个因素影响。其中,出生率对兔子的数量起积极影响,其他三个因素对兔子的数量起消极影响。狐狸对兔子数量的影响分为幼狐对兔子数量的影响和成年狐狸对兔子数量的影响。幼狐每月吃10只兔子,成年狐狸每月吃60只狐狸。水草对兔子数量也有限制,最大的数量为100000,在本实验中,简化了实验模型,假设兔子数量达到最大值时,可保持不变。本实验还假设只有每成年母兔死后都有一只幼兔饿死,并假设被狐狸猎杀的兔子中有30%的为成年母兔。四、建模过程1.绘制因果关系图影响生物数量的两大因素是出生率和死亡率。出生率对生物物种数量起积极作用,死亡率对生物物种数量起消极作用。导致生物死亡的原因有很多。在本实验中,导致狐狸死亡的因素有兔子数量和模拟120个月后猎人对狐狸的猎杀。导致兔子死亡的因素有狐狸对兔子的捕食、水草不足、因父母死亡导致幼兔死亡这三个因素,猎人对狐狸的猎杀导致狐狸数量的减少,从而对兔子的数量会起到一个积极的影响。所以该系统的因果关系图为:图一.海岛生态系统因果关系图2.绘制系统流图根据因果关系图可以绘制出该海岛生态系统的流图。如图二所示:如图二所示F、R代表生态系统的两个流位变量;R1代表狐狸的出生率,R2代表狐狸的死亡率,同时也是兔子的增加率,R3代表兔子的死亡率。C1代表与狐狸死亡率有关的常数,C2代表与兔子增长率有关的常数,C3表示与兔子死亡率有关的常数。图二、海岛生态系统的SD图3.建立数学模型为简化模型,现做出以下假设:1.当兔子不足时,饿死的狐狸均为成年狐狸2.系统中狐狸的最大容量为兔子的1/120倍。3.系统初始时,兔子和狐狸均为成年的,没有幼崽。4.被狐狸吃掉的兔子中有30%为成年母兔。根据图二所示的海岛生态系统的SD图和上面的理论分析,我们可以等处该系统的数学模型。设模拟第n个月后,狐狸的数量为F(n),兔子的数量为R(n),第n个月新增的幼狐数量为F1(n),第n个月新增的幼兔为R1(n),第n个月死亡的狐狸数为F2(n)(不包括饿死的),第n个月死亡的兔子数为R2(n)(不包括因水草不足引起的饿死部分)。第n个月后的兔子数量应等于第n-1个月后的兔子数量加上第n个月新增的幼兔数,再减去第n个月死亡的兔子数量。即:R(n)=R(n-1)+R1(n)-R2(n)(1)若R(n)100000时,R(n)取100000。第n个月新增的幼兔为R1(n)等于兔子的出生率r乘以第n-1个月后的兔子数量。即:R1(n)=r*R(n-1)(2)第n个月死亡的兔子数为R2(n)等于成年狐狸吃掉兔子的数量加上幼年狐狸吃掉兔子的数量,以及因成年母兔别吃掉导致幼兔死亡的数目。设每一成年母兔死亡就会饿死一只幼兔,且狐狸吃掉的兔子中有30%的为成年母兔。即:R2[n]={[F1(n-1)+F1(n-2)+F1(n-3)+F1(n-4)+F1(n-5)+F1(n-6)+F1(n-7)+F1(n-8)]*10+[F(n-1)-F1(n-1)-F1(n-2)-F1(n-3)-F1(n-4)-F1(n-5)-F1(n-6)-F1(n-7)]*60}*1.3(3)当n8时,若n-i0,则取F1(n-i)为0.第n个月后的狐狸数量应等于第n-1个月后的狐狸数量加上第n个月新增的幼狐数,再减去第n个月死亡的狐狸数量。即:F(n)=F(n-1)+F1(n)-F2(n)(4)第n个月新增的幼狐为F1(n)等于狐狸的出生率k乘以第n-1个月后的狐狸数量。即:F1(n)=k*F(n-1)(5)当n=120时,第n个月死亡的兔子数为F2(n)为0,当n120时,第n个月死亡的兔子数为F2(n)为猎人猎杀的狐狸数。F2(n)=(6)4.编写仿真源程序根据上面建立的系统数学模型,使用C语言,编写出该系统数学模型的仿真源程序。具体仿真源程序如下:#includestdio.h#includemath.hvoidmain(){intR[200];intR1[200];intR2[200];intF[200];intF1[200];intF2[200];inti,j;floatr,k;FILE*p;//声明文件指针p=fopen(D:\\systemsimu.txt,w+);//新建文件,文件名自定,保存路径R[0]=50000;//附初始值R1[0]=0;R2[0]=0;F[0]=50;F1[0]=0;F2[0]=0;r=0.2;k=0.1;i=1;do{F1[i]=k*F[i-1];//第i-1月产下的幼狐if(i=120)//前十年没有狐狸死亡,后十年有捕猎{F2[i]=0;}else{F2[i]=16;}F[i]=F[i-1]+F1[i]-F2[i];//第i月狐狸数if(F[i]R[i-1]/120)//狐狸数目不能超过R[i]/120{F[i]=R[i-1]/120;}if(F[i]0){F[i]=0;}if(i==1)//i=1,2时F1[i-2],F1[i-3]没意义{R2[i]=F[0]*60;}elseif(i==2){R2[i]=(F1[1]+F1[0])*10+(F[0]-F1[0]-F1[1])*60;}elseif(i==3){R2[i]=(F1[i-1]+F1[i-2]+F1[i-3])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3])*60;}elseif(i==4){R2[i]=(F1[i-1]+F1[i-2]+F1[i-3]+F1[i-4])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3]-F1[i-4])*60;}elseif(i==5){R2[i]=(F1[i-1]+F1[i-2]+F1[i-3]+F1[i-4]+F1[i-5])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3]-F1[i-4]-F1[i-5])*60;}elseif(i==6){R2[i]=(F1[i-1]+F1[i-2]+F1[i-3]+F1[i-4]+F1[i-5]+F1[i-6])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3]-F1[i-4]-F1[i-5]-F1[i-6])*60;}elseif(i==7){R2[i]=(F1[i-1]+F1[i-2]+F1[i-3]+F1[i-4]+F1[i-5]+F1[i-6]+F1[i-7])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3]-F1[i-4]-F1[i-5]-F1[i-6]-F1[i-7])*60;}else//i=3时F1[i-2],F1[i-3]有意义{R2[i]=(F1[i-1]+F1[i-2]+F1[i-3]+F1[i-4]+F1[i-5]+F1[i-6]+F1[i-7]+F1[i-8])*10+(F[i-1]-F1[i-1]-F1[i-2]-F1[i-3]-F1[i-4]-F1[i-5]-F1[i-6]-F1[i-7]-F1[i-8])*60;}R1[i]=r*R[i-1];//第i-1月产下的幼兔R2[i]=R2[i]*1.3;//被狐狸吃掉的兔子,以及因成兔死亡幼兔也死亡R[i]=R[i-1]+R1[i]-R2[i];//第i月兔数if(R[i]100000)//兔子数目不能超过1000000{R[i]=100000;}if(R[i]0||R[i-1]==0){R[i]=0;}i++