数学建模:人口增长模型
模型目标:
通过给定的一组人口增长数据,预测后续的人口增长情况.
一、指数增长模型
假设增长率不变:
若已知人口年增长率为r,今年人口为 ,预测k年后的人口可以用简单的公式得到:
*以美国人口为例,数据点取下表:
用matlab输入好数据:
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4];
该公式得到的人口增长模型如下图(matlab作图):
选取的增长率0.2与实际的人口数据点贴合度差,于是进一步建立模型,找到偏差更小的增长率r
精确化增长率r
把人口看作关于时间的可微函数 ,记
即为单位时间 的增长量
所以得到微分方程:
解得:
上述公式即位指数增长模型
数据拟合:
接下来对指数增长模型的参数进行估计,即数据拟合
·法一
用人口数据和线性最小二乘法,对上式取对数:
用matlab进行编程拟合:
%取1790年为t=0,数据点取到2000年
t=0:10:210;
lnp = log(p);
cftools
解得:
带入得
·法2
对人口数据做数值微分,计算平均值r‘,x0直接选用原始数据.
函数在各点的近似导数值为(数值微分中点公式):
那么增长率为:
*公式相关推导可参考数值计算方法 第六章 数值积分和数值微分
增长率 再取平均值得到r = 0.0205
改进的指数增长模型
上述模型对于增长率r不变的假设导致预测曲线与实际偏差较大
所以改进模型中假设 r 为 t 的函数 , 根据上述法2的
r=[];
for i=1:22
if i == 1
r(i)=(4*p(i+1)-3*p(i)-p(i+2))/(20*p(i));
elseif i == 22
r(i)=(-4*p(i-1)+3*p(i)+p(i-2))/(20*p(i));
else
r(i)=(p(i+1)-p(i-1))/(20*p(i));
end
end
plot(t,r,'.','MarkerSize',20);
ylim ([0.005,0.04]);
xlabel('t');
ylabel('增长率r');
根据散点图假设的线性函数,用最小二乘法线性拟合得到:
根据微分方程:
把拟合后的参数带入:
xt2 = 3.9.*exp(0.03252.*t-0.0001143.*t.^2./2);
plot(t,xt2,'LineWidth',1);
最终根据改进模型预测的2010年人口为290million,与实际数据281.4吻合度较高.显然改进后的模型优于前两者.
二、logistic模型
改进的指数增长模型中增长率线性下降,但没有体现其下降的相关影响因素,只是以时间为变量.logistic模型考虑了自然资源,环境等对人口增长的阻滞作用.
未完…