您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 实验03-建立数学模型
第1页/共12页实验03建立数学模型3.1人口指数增长模型演示本实验不要求写实验报告。1.实验目的(1)学会人口指数增长模型的建模过程;(2)进一步掌握MATLAB软件的一些基本功能;(3)初步掌握用MATLAB软件对模型作分析检验;(4)学会使用MATLAB软件的help功能。2.实验内容(参考教材p10-12)利用表1,对人口指数增长模型作检验。表1美国1790-2000年人口统计数据(以百万为单位)年17901800181018201830184018501860187018801890人口3.95.37.29.612.917.123.231.438.650.262.9年19001910192019301940195019601970198019902000人口76.092.0106.5123.2131.7150.7179.3204.0226.5251.4281.43.实验步骤(1)模型假设人口增长率为常数r。(2)模型建立(微分方程模型)记时刻t的人口为x(t),为了利用微积分这一数学工具,将x(t)视为连续、可微函数。记初始时刻(t=0)的人口为x0。由模型假设人口增长率为常数r。考虑t到t+Δt时间内人口的增量,可得x(t+Δt)-x(t)=rx(t)Δtx(t+Δt)-x(t)——————————————=rx(t)Δt令Δt→0,得到x(t)满足微分方程dx————=rx(t)dtx(0)=x0用MATLAB求解该微分方程x=dsolve('Dx=r*x','x(0)=x0')x=x0*exp(r*t)得解为x(t)=x0ert第2页/共12页即为人口指数增长模型。(3)参数估计用表1的数据估计参数x0、r。将x(t)=x0ert两边对数,可得y=rt+a,y=lnx,a=lnx0采用线性最小二乘法进行数据拟合,用MATLAB软件计算。以下是MATLAB的一个脚本式文件:%分别用1790年至1900年的数据和全部数据(1790年至2000年)进行数据拟合求参数r,x0。%文件名:p10_ra.mclear;clc;x=[3.95.37.29.612.917.123.231.4...38.650.262.976.092.0106.5123.2131.7...150.7179.3204.0226.5251.4281.4];t=0:length(x)-1;y1=log(x(1:12));%取1790-1900年的数据ra1=polyfit(t(1:12),y1,1);%为数据数拟合多项式,用helpployfit查阅disp('用1790-1900年的数据估计的参数为:')disp(['r=',num2str(round(10000*ra1(1))/10000),...'x0=',num2str(exp(ra1(2)))])y2=log(x);%取1790-2000年的数据ra2=polyfit(t,y2,1);disp('用1790-2000年的数据估计的参数为:')disp(['r=',num2str(round(10000*ra2(1))/10000),...'x0=',num2str(exp(ra2(2)))])运行结果:用1790-1900年的数据估计的参数为:r=0.2743x0=4.1884用1790-2000年的数据估计的参数为:r=0.2022x0=6.045分别得到两个人口指数增长模型:x1(t)=4.1884e0.2743tx2(t)=6.0450e0.2022tx1(t),x2(t)是1790+10t年的人口数(以百万为单位),t=0,1,2,…。r为每10年的人口增长率(估计值)。x(0)=x0为1790年初始人口数(估计值)。(4)结果分析用以上模型计算出的结果与实际数据作比较。为了减少误差,把求模型参数和计算结果数据编写成一个MATLAB程序。以下是一个脚本式文件:第3页/共12页%分别用1790年至1900年和用1790年至2000年的数据建立人口指数增长模型,用模型计算人口数据。%文件名:p11_data.mclear;clc;formatcompact%输出中没有空行x=[3.95.37.29.612.917.123.231.4...38.650.262.976.092.0106.5123.2131.7...150.7179.3204.0226.5251.4281.4];t=0:length(x)-1;y1=log(x(1:12));ra1=polyfit(t(1:12),y1,1);y2=log(x);ra2=polyfit(t,y2,1);y=[ra1(1)*t+ra1(2);ra2(1)*t+ra2(2)];xx=exp(y);xx(1,13:22)=zeros(1,10);disp('指数增长模型拟合美国人口数据的结果')disp('第1行:年')disp('第2行:实际人口')disp('第3行:计算人口(1790年至1900年)')disp('第4行:计算人口(1790年至2000年)')formatshortg;%用helpformat查阅[1790+10*t;x;round(10*xx)/10]format;以上m文件的运行结果:指数增长模型拟合美国人口数据的结果第1行:年第2行:实际人口第3行:计算人口(1790年至1900年)第4行:计算人口(1790年至2000年)ans=Columns1through61790180018101820183018403.95.37.29.612.917.14.25.57.29.512.516.567.49.111.113.616.6Columns7through1218501860187018801890190023.231.438.650.262.97621.728.637.649.565.185.620.324.930.537.345.755.9Columns13through1819101920193019401950196092106.5123.2131.7150.7179.3第4页/共12页00000068.483.7102.5125.5153.6188Columns19through221970198019902000204226.5251.4281.40000230.1281.7344.8422.1以下是由数据和模型绘图的三个m文件,其中一个是脚本式文件,两个是函数式文件:%根据人口数据和人口指数增长模型绘制图形。%文件名:p11_fig.mclear;clc;x=[3.95.37.29.612.917.123.231.4...38.650.262.976.092.0106.5123.2131.7...150.7179.3204.0226.5251.4281.4];t=0:length(x)-1;plot(t(1:12),x(1:12),'b+');title('指数增长模型拟合图形(1790年至1900年)','FontSize',8);xlabel('t(1790+10t年)','FontSize',8);ylabel('x(百万人)','FontSize',8);holdon;fplot('p11_figfun1',[0,11],'r');%用helpfplot查阅axis([0,12,0,100]);legend('实际数据','计算结果',0);%用helplegend查阅holdoff;figure(2);plot(t,x,'b+');title('指数增长模型拟合图形(1790年至2000年)','FontSize',8);xlabel('t(1790+10t年)','FontSize',8);ylabel('x(百万人)','FontSize',8);holdon;fplot('p11_figfun2',[0length(x)-1],'r');axis([0,25,0,500]);%用help查阅legend('实际数据','计算结果',0);holdoff;下面是一个函数式文件:%用1790-1900年的人口数据得到的模型函数%文件名:p11_figfun1.mfunctionx=p11_figfun1(t)x=4.1884*exp(0.2743*t);下面是另一个函数式文件:%用1790-2000年的人口数据得到的模型函数%文件名:p11_figfun2.mfunctionx=p11_figfun2(t)第5页/共12页x=6.0450*exp(0.2022*t);执行p11_fig.m得到以下两个图形:可以看出,我们所求得的模型基本上能够描述十九世纪以前美国人口的增长,但是进入二十世纪后,美国人口增长明显变慢,这个模型就不合适了。第6页/共12页下面讨论人口增长率为常数r这个模型假设是否合理。以下是求每10年的各个人口增长率的脚本式文件:%用数值微分的三点公式计算美国人口增长率(/10年)%文件名:p12_r.mclear;clc;x=[3.95.37.29.612.917.123.231.4...38.650.262.976.092.0106.5123.2131.7...150.7179.3204.0226.5251.4281.4];t=0:length(x)-1;r=zeros(size(x));fori=1:length(x)%求数值微分ifi==1r(1)=(-3*x(1)+4*x(2)-x(3))/2;%x’(1)elseifi==length(x)r(i)=(x(i-2)-4*x(i-1)+3*x(i))/2;%x’(length(x))elser(i)=(x(i+1)-x(i-1))/2;%x’(i),1ilength(x)endendr=r./x;%求增长率(/10年)disp('第1行:年')disp('第2行:增长率(/10年)')formatshortg;[1790+10*t;round(10000*r)/10000]%输出数据plot(t,r,'ro-');holdon;plot([0,11],[0.2743,0.2743],':',[0,21],[0.2022,0.2022],'-.');xlabel('t(1790+10t年)','FontSize',8);ylabel('r(增长率/10年)','FontSize',8);legend('实际增长率','r=0.2743(1790-1900年)','r=0.2022(1790-2000年)');hold;以上m文件的执行结果:第1行:年第2行:增长率(/10年)ans=Columns1through61790180018101820183018400.29490.31130.29860.29690.29070.3012Columns7through121850186018701880189019000.30820.24520.24350.2420.20510.1914Columns13through18第7页/共12页1910192019301940195019600.16580.14650.10230.10440.15790.1486Columns19through2219701980199020000.11570.10460.10920.1157可见实际的增长率变化范围很大,必须修改指数增长模型关于人口增长率是常数这个基本假设。3.2人口指数增长模型检验本实验要求写实验报告。1.实验目的学会用MATLAB软件的功能检验模型。2.实验内容用1900年至2000年的数据拟合指数增长模型x(t)=x0*er*t,计算并作图,观察结果。具体任务如下:(1)参数估计r,x0;(2)结果分析。计算指数增长模型拟合美国人口数据的结果;绘制指数增长模型拟合图形(1900年至2000年)。3.3人口阻滞增长模型(Logistic模型)检验演示1.实验目的学会用MATLAB软件的功能检验模型。学会用h
本文标题:实验03-建立数学模型
链接地址:https://www.777doc.com/doc-5404029 .html