1. 程式人生 > >數學建模入門之MATLAB實現人口預測

數學建模入門之MATLAB實現人口預測

人口問題是我國最大社會問題之一,估計人口數量和發展趨勢是我們制定一系列相關政策的基礎。從人口統計年鑑,可查我國從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年人口數量