數學建模入門之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年人口數量