![](https://img-blog.csdnimg.cn/22cebc7421754b4fa9ca2aecd4eb1d04.gif#pic_center)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
人口增长模型
Malthus模型(指数模型)
最早的人口增长模型是 Malthus 于 1798 年提出的指数模型,基本假设是人口增长率 r
是常数。
N ( t ) = N 0 e r t N(t)=N_0e^{rt} N(t)=N0ert
这个模型的问题在于,它没有考虑到人口增长的阻滞因素,即人口增长的上限。因此,当预测时间 t
较短时,模型的预测结果是合理的,但是当预测时间 t
较长时,模型的预测结果就会出现较大的误差。
Logistic模型(阻滞增长模型)
由于人口不可能无限制的增长,当人口达到一定数量后,那么增长率就会下降。因此, Verhulst 于 1838 年提出了阻滞增长模型,基本假设是人口增长率 r
随着人口数量 N
的增加而减小。
人口增长率 r
是一个关于人口数量 N
的线性函数:
d
N
d
t
=
r
(
N
)
N
\frac{dN}{dt}=r(N)N
dtdN=r(N)N
人口增长率 r
的函数形式为:
r
(
N
)
=
r
−
s
N
,
(
r
,
s
>
0
)
r(N)=r-sN,(r,s>0)
r(N)=r−sN,(r,s>0)
其中, r
是人口增长率的最大值, s
是人口增长率的下降速率。
而人口增长率的下降速率与人口容量 K
有关,即:
s = r K s=\frac{r}{K} s=Kr
结合上述公式,得到人口的增长速度:
d N d t = r N ( 1 − N K ) \frac{dN}{dt}=rN(1-\frac{N}{K}) dtdN=rN(1−KN)
最后得出阻滞增长模型:
N ( t ) = K 1 + ( K N 0 − 1 ) e − r t N(t)=\frac{K}{1+(\frac{K}{N_0}-1)e^{-rt}} N(t)=1+(N0K−1)e−rtK
MATLAB 实现阻滞增长模型
function [t,N]=logistic(r,K,N0,t0,tf,dt)
%LOGISTIC 阻滞增长模型
% [t,N]=logistic(r,K,N0,t0,tf,dt)
% r:人口增长率的最大值
% K:人口容量
% N0:初始人口数量
% t0:初始时间
% tf:终止时间
% dt:时间步长
% t:时间序列
% N:人口数量序列
t=t0:dt:tf;
N=zeros(1,length(t));
N(1)=N0;
for i=2:length(t)
N(i)=N(i-1)+r*N(i-1)*(1-N(i-1)/K)*dt;
end
end
例
根据美国人口数据进行预测,美国人口数据如下:
年份 | 1790 | 1800 | 1810 | 1820 | 1830 | 1840 | 1850 | 1860 | 1870 | 1880 | 1890 |
---|---|---|---|---|---|---|---|---|---|---|---|
人口/百万 | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 | 38.6 | 50.2 | 62.9 |
年份 | 1900 | 1910 | 1920 | 1930 | 1940 | 1950 | 1960 | 1970 | 1980 | 1990 | 2000 |
---|---|---|---|---|---|---|---|---|---|---|---|
人口/百万 | 76.2 | 92.2 | 106.5 | 123.2 | 132.2 | 151.3 | 179.3 | 203.2 | 226.5 | 249.6 | 281.4 |
数据来源:美国人口数据
MATLAB 中提供了 nlinfit
函数,可以用来拟合非线性模型,其语法格式如下:
beta = nlinfit(X,Y,modelfun,beta0)
其中, X
是自变量, Y
是因变量, modelfun
是模型函数, beta0
是模型参数的初始值, beta
是模型参数的估计值。
使用 nlinfit
函数进行拟合:
% 原始数据
t=1790:10:2000;
N=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.2,92.2,106.5,123.2,132.2,151.3,179.3,203.2,226.5,249.6,281.4];
% 拟合
f=@(beta,t)beta(1)./(1+(beta(1)./N(1)-1).*exp(-beta(2).*t));
beta0=[300,0.5];
beta=nlinfit(t-t(1),N,f,beta0)
% 参数
K=beta(1)
r=beta(2)
得到参数估计值:
K =
340.0598
r =
0.0274
预测并绘图:
% 预测
[t_hat,N_hat]=logistic(r,K,N(1),t(1),t(end),1);
% 绘图
plot(t,N,'o',t_hat,N_hat,'-','LineWidth',2),grid on,legend('原始数据','预测结果'),xlabel('年份'),ylabel('人口/百万')
可以看出,预测结果与原始数据非常接近。
预测 2080 年的美国人口数量变化趋势:
% 预测
[t_hat,N_hat]=logistic(r,K,N(1),t(1),2080,1);
% 绘图
plot(t,N,'o',t_hat,N_hat,'-','LineWidth',2),grid on,legend('原始数据','预测结果'),xlabel('年份'),ylabel('人口/百万')