matlab曲线拟合人口增长模型及其数量预测

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验目的

[1] 学习由实际问题去建立数学模型的全过程;

[2] 训练综合应用数学模型、微分方程、函数拟合和预测的知识分析和解决实际问题; [3] 应用matlab 软件求解微分方程、作图、函数拟合等功能,设计matlab 程序来求解

其中的数学模型;

[4] 提高论文写作、文字处理、排版等方面的能力;

通过完成该实验,学习和实践由简单到复杂,逐步求精的建模思想,学习如何建立反映人口增长规律的数学模型,学习在求解最小二乘拟合问题不收敛时,如何调整初值,变换函数和数据使优化迭代过程收敛。

应用实验(或综合实验)

一、实验内容

从1790—1980年间美国每隔10年的人口记录如表综2.1所示:

表综2.1

用以上数据检验马尔萨斯(Malthus)人口指数增长模型,根据检验结果进一步讨论马尔萨斯人口模型的改进,并利用至少两种模型来预测美国2010年的人口数量。

二、问题分析

1:Malthus 模型的基本假设是:人口的增长率为常数,记为 r 。记时刻t 的人口为x (t ),(即x (t )为模型的状态变量)且初始时刻的人口为x 0,于是得到如下微分方程:

⎪⎩⎪⎨⎧==0

)0(d d x x rx

t

x 2:阻滞增长模型(或Logistic 模型) 由于资源、环境等因素对人口增长的阻滞作用,人

口增长到一定数量后,增长率会下降,假设人口的增长率为x 的减函数,如设r(x)=r(1-x/x m ),其中r 为固有增长率(x 很小时),x m 为人口容量(资源、环境能容纳的最大数量),于是得到如下微分方程:

⎪⎩

⎪⎨⎧=-=0)0()1(d d x

x x x rx t x

m

三、数学模型的建立与求解

根据Malthus 模型的基本假设,和Logistic 模型,我们可以分别求得微分方程的

解析解,

y1=x0*exp(r*x);

y2= xm/(1+x0*exp(-r*x))

对于1790—1980年间美国每隔10年的人口记录,分别用matlab 工具箱中非线性拟合函数的命令作一般的最小二乘曲线拟合,可利用已有程序lsqcurvefit 进行拟合,检验结果进一步讨论模型的改进,预测美国2010年的人口数量。

四、实验结果及分析

对于Malthus 模型 作一般的最小二乘曲线拟合,可利用已有程序lsqcurvefit 得到拟合函数为y=(3.54e-011)*exp(0.0149*x), 当x=2010时,预测的人口为359.4916

由于资源、环境等因素对人口增长的阻滞作用,人口增长到一定数量后,增长率会下降,运用Logistic 模型对微分方程的解进行拟合,得到y2= 360.4/(1+53.11 *exp(-0.02342*(x-1790)))

到2010年时,预计人口数量为y2 = 275.6894,

作图可以看出两条曲线拟合程度较高相比基本模型,改进模型更接近实际。

1780

1800

1820

1840

1860

1880

1900

1920

1940

1960

1980

0 50

100

150

200

250

x

y

五、附录(程序等)

Malthus 模型 1、

编写拟合函数的文件fitful2.m function y=fitful2(a,x)

y=a(1).*exp(a(2).*x);

2、 运行的脚本文件

clc,clear a0=[50,0.02];

xdata=[1790:10:1980];

ydata=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5];

x

y

[a,resnorm,residual,flag,output]=lsqcurvefit('fitful2',a0,xdata,ydata )

xi=[1790:10:1980];

yi=fitful2(a,xdata)

plot(xdata,ydata,'r-o',xi,yi,'b-+')

xlabel('x'),ylabel('y=f(x)');

Logistic模型

程序:

x=[1790:10:1980]';

y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5]';

st_ = [500 30 0.2 ];

ft_ = fittype('a/(1+b*exp(-k*(x-1790)))',...

'dependent',{'y'},'independent',{'x'},...

'coefficients',{'a', 'b','k'});

cf_ = fit(x,y,ft_,'Startpoint',st_)

plot(cf_,'fit',0.95);hold on,plot(x,y,'*')

相关文档
最新文档