数学建模入门之MATLAB实现人口预测

版权声明:华南理工大学陈艺荣所有 https://blog.csdn.net/m0_37201243/article/details/84537115

人口问题是我国最大社会问题之一,估计人口数量和发展趋势是我们制定一系列相关政策的基础。从人口统计年鉴,可查我国从1990年至2010年人口数据资料如下,试根据表中数据,分析人口增长的规律,并以此预测2011年和2012年的人口数量,然后与实际人口数量做对比,评价模型的优劣,并对我国人口政策提出建议。

表 1 不同年份我国的人口数量(万)

年份

1990

1991

1992

1993

1994

1995

1996

1997

数量

114333

115823

117171

118517

119850

121121

122389

123626

年份

1998

1999

2000

2001

2002

2003

2004

2005

数量

124761

125786

126743

127627

128453

129227

129988

130756

年份

2006

2007

2008

2009

2010

 

 

 

数量

131448

132129

132802

133450

134091

 

 

 

  

    本问题要求我们利用已知的人口数据建立相应的人口增长模型,并利用该模型计算2011年和2012年我国的人口数量。

在MATLAB中以多项式为目标函数作数据拟合的函数是polyfit,它的基本使用格式为:

函数:polyfit(x,y,n),其中参数n为指定多项式的阶。

polyfit函数进行2阶多项式拟合、4阶多项式拟合、5阶多项式拟合,用R=dot(y-polyval(p,t),y-polyval(p,t)) 计算拟合残差,再用polyval函数预测2011和2012年的人口。

    其中,人口数据存放在一个命名为renkoushuju.txt的文件当中,设定1990年为第0年,如下列数据所示。在matlab中使用fopen函数和textsan函数获取相关数据。

renkoushuju.txt文件数据如下

0 114333
1 115823
2 117171
3 118517
4 119850
5 121121
6 122389
7 123626
8 124761
9 125786
10 126743
11 127627
12 128453
13 129227
14 129988
15 130756
16 131448
17 132129
18 132802
19 133450
20 134091

代码如下

%renkouyuce.m     我国人口增长规律观测
%           C    年份和人口数据矩阵
%         year    年份
%         num    人口
%           a    2011年预测人口数
%           b    2012年预测人口数
 
%Chen Yirong 修改于2017年04月05日
 
clc;clear all           %清除所有
%提取1990年到2010年的人口数据,数据存储在renkoushuju.txt文件中
renkou=fopen('renkoushuju.txt');  %打开数据总文件
A=textscan(renkou,'%f %f');       %把每一列的数据读入到读入到单元数组A中
C=[A{1} A{2}];                    %从单元数组R中提取每列数据赋值给矩阵C
n=max(size(C));                   %确定读入数据的年份数目
year=C(:,1);num=C(:,2);           %赋值
 
%进行2阶、4阶、5阶拟合
p2= polyfit(year,num,2)        %2阶拟合
p4= polyfit(year,num,4)        %4阶拟合
p5= polyfit(year,num,5)        %5阶拟合
R5= dot(num-polyval(p5,year),num-polyval(p5,year)) %计算拟合残差
R4= dot(num-polyval(p4,year),num-polyval(p4,year)) %计算拟合残差
R2= dot(num-polyval(p2,year),num-polyval(p2,year)) %计算拟合残差

%绘制原始数据和拟合曲线图
hold on;
xlabel('year','color','b');     %设置横坐标名
ylabel('num','color','b');      %设置纵坐标名
title('1990-2010人口增长曲线','color','m');   %设置标题
grid on      %网格线
plot(year,num,'r*',year,polyval(p2,year),year,polyval(p4,year),year,polyval(p5,year)) 
legend('我国人口数量','2阶拟合', '4阶拟合','5阶拟合')

%人口预测
a=polyval(p5,21)    %预测2011年人口数量
b=polyval(p5,22)    %预测2012年人口数量

 

猜你喜欢

转载自blog.csdn.net/m0_37201243/article/details/84537115