最近在学习人口数量的预测时,除了用 Malthus 和 Logistic 这两种方法进行拟合之外,还有一个新的方法——Leslie矩阵模型。
首先先讲讲 Malthus 拟合,这是由英国的人口学家 Malthus 提出,用于预测人口增长状况的一种方法;令时刻 t 的人口数为 x(t) ,不妨将 x(t) 看作是个连续的、可微的函数。时刻 t = 0,的人口数为 x0 ,假设人口增长率为常数 r ,则在 时间内人口的增量可以表示为:
若 ,则可以得到:
clear;
clc;
syms x0;
dsolve('Dx = r*x','x(0) = x0','t')
这里增加两个概念
1、人口平均增长速率:
2、人口平均相对增长速率:
一般来说人口平均相对增长率是稳定的,与人口基数无关。
参考了大多数资料后发现大多数都是用下方公式近似求解
不妨对(4)式的近似两边同时取对数,可以得到:
一般数据会给出多个年份的人口数,也就是 x(t) 、x0 和 t 都已知,可利用线性拟合,拟合出上述公式,求出增长率 r ,进而预测未来的人口数。
优点:参数少,计算简单,在数据没有较大的异常或者误差时,可以得到比较好的预测结果。
缺点:当时间趋向无穷大时,预测的结果也会趋向无穷大,这明显不符合现实,也就是这个模型没有考虑人口数增长受到多方面的控制,比如:自然资源有限、政府政策等等。
% 美国人口数的计算
clear;
clc;
Y = [1900:10:2000]; % 年份
pp = [76 92 106.5 123.2 131.7 150.7 179.3 204 226.5 251.4 281.4]; % 人口数/百万population
Y = input('请输入年份');
pp = input('请输入对应年份的人口数');
y = log(pp);
x = Y-Y(1); % 转化为 0,1,2,3……
P = polyfit(x,y,1);
r = exp(P(1))-1
x0 = exp(P(2)) % Y(1)时候的人口数
plot(Y,pp,'*');
hold on;
xi = x(end)+(x(2)-x(1)).*[1:5]; % 预测后面5年的人口数
xn = [x xi];
Yn = xn + Y(1);
yn = polyval(P,xn);
ppn = exp(yn);
plot(Yn,ppn)
上面例子得到的结果如下:
过点时间再接着写 Logistic 模型和 Leslie 矩阵模型
参考:《数学建模竞赛入门与提高》周凯,宋军全,邬学军