人口增长问题的数学建模:指数增长模型与阻滞增长模型
人口增长问题的数学建模:指数增长模型与阻滞增长模型
人口增长问题是数学建模中的经典案例,通过建立合适的数学模型可以预测未来人口数量的变化趋势。本文将介绍两种常用的人口增长模型:指数增长模型和阻滞增长模型,并通过具体的数据和代码实现来展示模型的构建和检验过程。
问题描述
利用下表人口数据做一个人口数量预测模型:
年份 | 1790 | 1800 | 1810 | 1820 | 1830 | 1840 | 1850 | 1860 | 1870 | 1880 |
---|---|---|---|---|---|---|---|---|---|---|
人口数量 | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 | 38.6 | 50.2 |
年份 | 1890 | 1900 | 1910 | 1920 | 1930 | 1940 | 1950 | 1960 | 1970 | 1980 | 1990 |
---|---|---|---|---|---|---|---|---|---|---|---|
人口数量 | 62.9 | 76 | 92 | 105.7 | 122.8 | 131.7 | 150.7 | 179.3 | 203.2 | 226.5 | 248.7 |
年份 | 2000 | 2010 |
---|---|---|
人口数量 | 281.4 | 308.7 |
指数增长模型
问题分析
首先对数据进行可视化分析,我们以10年为间隔取一次人口数量,如果我们取样间隔过短可能会导致数值太过密集,导致不容易看出人口数量随时间的分布情况。通过对时间和人口数量作图得到下图。
图1:人口数量随时间变化的散点图
通过此图可以看出,人口数量和时间之间存在着指数关系,我们可以利用指数模型来预测人口。
模型假设
- 设$x(t)$为$t$时刻人口数量,且$x(t)$连续可微。
- 人口增长率$r$为常量
模型实现
记初始时刻($t=0$时)人口数量为$x_0$,在$dt$时间内人口增长$dx = r x dt$。通过上述条件可以得到一个微分方程组:
$$
\begin{cases}
\frac{dx}{dt}=rx\
x(0) = x_0
\end{cases}
$$
通过解上述微分方程得到$x(t) = x_0 e^{rt}$,接下来通过最小二乘法对参数$r, x_0$进行估计,将上面$x$与$t$的关系两边取对数得到
$$
y = rt + a, \quad y = \ln x, \quad a = \ln x_0
$$
根据人口数据(因为指数模型并不适合预测较长时期的人口,所以将1970年作为$t=0$),编程计算得到$r = 0.0196, x_0 = 6.049$,代码如下:
plot(t,x,'o');
xlabel('时间/年')
ylabel('人口数量/亿')
n=size(t,1);
c = zeros(n,1)+1;
t0 = [c,t];
y = log(x);
B = inv(t0'*t0)*t0'*y;
r=B(2);
x0=exp(B(1));
f = @(t) x0*exp(r*t);
hold on;
fplot(f,[0,220]);
得到结果图为
图2:指数增长模型拟合结果
模型检验
计算MSE得到$MSE = 2.1 \times 10^3$,计算代码如下:
x_hat = f(t);
mse = (x - x_hat)'*(x - x_hat)/n;
计算得到MSE较大,因为我们所使用的数据数值较大,所以计算某一年预测值的相对误差的结果更有说服力。计算在2000年的相对误差
$$
error = \frac{|x_{hat}(2000) - x(2000)|}{x(2000)} = 0.38
$$
可以看出普通指数模型不是特别好。
阻滞增长模型
问题分析
观察图2可以发现,人口的变化率$r$并不是不变的,因为资源受限等问题,人口变化率$r$随着人口数量的增加而减少,成反比例关系,这说明我们在上面的假设中出现了错误,所以要更改假设内容。
问题假设
- 人口变化率$r$与人口数量$x$成反比例变化关系,即$r = r_0 - kx$
- 人口数量受环境影响,人口最大承受量为$x_m$
- 设$x(t)$为$t$时刻人口数量,且$x(t)$连续可微。
模型实现
由假设可知$x = x_m$时,$r = r_0 - kx_m = 0$解出$k = \frac{r_0}{x_m}$,可以得到下列方程组:
$$
\begin{cases}
\frac{dx}{dt}=rx(1-\frac{x}{x_m})\
x(0)=x_0
\end{cases}
$$
参数估计
一、非线性最小二乘估计
通过解上述微分方程得到
$$
x(t) = \frac{x_m}{1+\left( \frac{x_m}{x_0}-1 \right) e^{-rt}}
$$
利用matlab拟合工具箱拟合得到$r = 0.02681, x_m = 370$。结果如下图
图3:非线性最小二乘估计拟合结果
可以观察到结果与指数增长模型比较啊v的了较好效果。
二、线性最小二乘估计
对上面的微分方程进行变换得到
$$
\frac{1}{x}\frac{dx}{dt}=r-\frac{r}{x_m}x
$$
为线性关系,可以利用线性最小二乘法拟合。利用matlab拟合得到$r = 0.0288, x_m = 299.439$,代码如下:
figure(2);
plot(t,x,'o');
xlabel('时间/年')
ylabel('人口数量/亿')
hold on;
dx = diff(x)/10;
y = dx./x(2:end);
t = t(2:end);
c = zeros(n-1,1)+1;
t0 = [c,t];
B = inv(t0'*t0)*t0'*y;
r=B(1);
xm = -B(1)/B(2);
f2 = @(z) xm/(1+(xm/3.9-1)*exp(-r*z));
fplot(f2,[0,220]);
结果图:
图4:线性最小二乘估计拟合结果
通过观察图3和图4可以看出图3的效果要好于图4的效果,因为图4在计算微分时并不是实际的微分而是利用以10年为间隔的差分。所以拟合效果较差。
模型检验
在模型检验时利用非线性最小二乘估计的参数作为最终的参数。还是和模型一一样利用2000年的人口数量进行检验。得到相对误差为$1.6%$。可以看出解出的模型效果不错。