数学建模——人口增长模型的matlab实现以及对2010年人口预测
文章目錄
- 運行軟件:MATLAB R2012a
- 實驗數據
- 指數增長模型
- 指數增長模型:方法一
- 對2010年的人口預測
- 指數增長模型:方法二
- 對2010年人口預測
- 改進的指數增長模型
- 對2010人口預測
- 邏輯斯蒂(logistic)模型
- 邏輯斯蒂(logistic)模型:方法一
- 對2010預測
- 邏輯斯蒂(logistic)模型:方法二
- 對2010預測
運行軟件:MATLAB R2012a
實驗數據
| 人口/百萬 | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 |
| 增長率/10年 | 0.2949 | 0.3113 | 0.2986 | 0.2969 | 0.2907 | 0.3012 | 0.3082 | 0.2452 |
| 人口/百萬 | 38.6 | 50.2 | 62.9 | 76.0 | 92.0 | 105.7 | 122.8 | 131.7 |
| 增長率/10年 | 0.2435 | 0.2420 | 0.2051 | 0.1914 | 0.1614 | 0.1457 | 0.1059 | 0.1059 |
| 人口/百萬 | 150.7 | 179.3 | 203.2 | 226.5 | 248.7 | 281.4 | 308.7 |
| 增長率/10年 | 0.1579 | 0.1464 | 0.1161 | 0.1004 | 0.1104 | 0.1349 |
指數增長模型
滿足人口增長的微分方程和初始條件為:
利用函數dsolve()可得:
指數增長模型:方法一
根據已知數據對模型的參數進行估計又稱為數據擬合。
對下面的這個公式同時取對數
可得
t:代表年份1970取0,依次類推
x:人口數量,實驗數據已知
根據求出的公式可以求出y;然后利用polyfit()函數求出r,a的值;當a求出來時,根據上面求出的公式,可以求出x0;將r,x0帶入公式
可求出指數增長模型方法一的x值
代碼如下:
使用的是matlb函數
運行代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x);運行界面:
運行結果:第一列代表年份;第二列代表實際人口;第三列為指數增長模型:方法一的預估值
對2010年的人口預測
根據上面算出的結果,可以得到:r=0.2020 x0=6.0496
直接利用算出來的參數計算2020年的結果(t=22)
運行代碼:
運行結果:
指數增長模型:方法二
先對人口數據進行數值微分,再計算增長率并將其平均值作為 的估計; 直接取原始數據。
公式:
先求rk,再求出r,再根據公式
求出模型的預估值
代碼如下:
我是以函數文件運行:
運行代碼
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x);m(:,4)=method_2(x);運行界面:
運行結果:第一列代表年份;第二列代表實際人口;第三列為指數增長模型:方法一的預估值;第四列為指數增長模型:方法二的預估值
對2010年人口預測
已經求得r與x0代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; n=length(x); t=0:1:n-1; rk=zeros(1,n); rk(1)=(-3*x(1)+4*x(2)-x(3))/2; rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2; for i=2:n-1 rk(i)=(x(i+1)-x(i-1))/2; end rk=rk./x; r=sum(rk)/n; x2=zeros(n,1); x2(1)=x(1); >> t=22; >> x2(1)*exp(r*t)運行結果:
改進的指數增長模型
指數增長模型進行改進。改進為:
假設:
利用dsolve()函數可得:
已知t值,根據上面我們已經求過了rk,所以rk也是已知的,然后利用最小二乘法polyfit()函數計算出
中的r0和r1,x0=3.9,利用eval()函數求出結果
運行代碼:
函數:
運行代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x);m(:,5)=method_3(x);運行界面:
運行結果:第一列代表年份;第二列代表實際人口;第三列為指數增長模型:方法一的預估值;第四列為指數增長模型:方法二的預估值;第五列改進指數模型的預估值
對2010人口預測
>> x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> n=length(x); t=0:1:n-1; rk=zeros(1,n); rk(1)=(-3*x(1)+4*x(2)-x(3))/2; rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2; for i=2:n-1 rk(i)=(x(i+1)-x(i-1))/2; end rk=rk./x; p=polyfit(t,rk,1); r0=p(2); r1=-p(1); s=dsolve('Dx=(r0-r1*t)*x','x(0)=x0','t'); x0=3.9; >> t=22; >> eval(s)運行結果:
邏輯斯蒂(logistic)模型
xm:表示人口容量
有了人口容量的限制,當人口數量增加時,增長率r減小,用
表示。
邏輯斯蒂(logistic)模型:方法一
開勇函數dsolve()求解可得
代碼如下:函數
運行代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x); m(:,5)=method_3(x); m(:,6)=logistic_1(x);運行界面:
運行結果:第一列代表年份;第二列代表實際人口;第三列為指數增長模型:方法一的預估值;第四列為指數增長模型:方法二的預估值;第五列改進指數模型的預估值;第六列邏輯斯蒂方法一預估值
對2010預測
代碼:
>> x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> n=length(x); t=0:1:n-1; rk=zeros(1,n); rk(1)=(-3*x(1)+4*x(2)-x(3))/2; rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2; for i=2:n-1 rk(i)=(x(i+1)-x(i-1))/2; end rk=rk./x; p=polyfit(x,rk,1); b=p(1); a=p(2); r=a; xm=-r/b; s=dsolve('Dx=r*x*(1-x/xm)','x(0)=x0','t'); x0=3.9; >> t=22; >> eval(s)運行結果:如果出現結果有復數,對結果進行轉換,如下圖
邏輯斯蒂(logistic)模型:方法二
直接用數據和非線性最小而成估計參數:
運行代碼:
運行代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x); m(:,5)=method_3(x); m(:,6)=logistic_1(x); m(:,7)=logistic_2(x);運行界面:
運行結果:第一列代表年份;第二列代表實際人口;第三列為指數增長模型:方法一的預估值;第四列為指數增長模型:方法二的預估值;第五列改進指數模型的預估值;第六列邏輯斯蒂方法一預估值;第七列邏輯斯蒂方法二預估值
對2010預測
代碼:
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> n=length(x); t=0:1:n-1;f=@(a,t)a(1)./(1+(a(1)./a(2)-1).*exp(-a(3).*t));[A,cancha]=lsqcurvefit(f,[500,3.9,0.3],t,x);s=dsolve('Dx=r*x*(1-x/xm)','x(0)=x0','t'); r=A(3); x0=A(2); xm=A(1); >> t=22; >> eval(s)運行結果:
總結
以上是生活随笔為你收集整理的数学建模——人口增长模型的matlab实现以及对2010年人口预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Django的网上书城系统
- 下一篇: 主动轮廓模型——Snake分割算法 ma