人口模型(Malthus+Logistic)附Matlab代码
目錄
- 一.Malthus模型(指數(shù)模型)
- (1)提出以及假設(shè)
- (2)影響人口增長的因素
- (3)建立模型
- (4)結(jié)論
- (5)舉例(Matlab代碼)
- 二.Logistic模型(阻滯增長模型)
- (1)背景
- (2)建立 r 的關(guān)系式
- (3)模型建立
- (4)結(jié)論
- (5)舉例(Matlab代碼)
- 三.總結(jié)
一.Malthus模型(指數(shù)模型)
(1)提出以及假設(shè)
指數(shù)增長模型,由馬爾薩斯在1798年提出
基本假設(shè):人口(相對)增長率r是常數(shù)(r很小)
相對增長率 = 出生率 - 死亡率
(2)影響人口增長的因素
人口的基數(shù)
出生率和死亡率
年齡結(jié)構(gòu)
性別比例
工農(nóng)業(yè)生產(chǎn)水平
醫(yī)療水平
政府出臺的政策
民族政策
…
(3)建立模型
我們用 x(t) 表示 t 時刻的人口
那么有 x(t+△t)?x(t)=rx(t)△tx(t+△t) - x(t) = rx(t)△t x(t+△t)?x(t)=rx(t)△t (其中x為人口基數(shù))
所以 (x(t+△t)?x(t))△t=rx(t)\frac{(x(t+△t) - x(t)) }{ △t} = rx(t) △t(x(t+△t)?x(t))?=rx(t)
根據(jù)高數(shù)知識,求得 dxdt=rx,x(0)=x0\frac{dx }{dt} = rx, x(0) = x_{0} dtdx?=rx,x(0)=x0?
求得:x(t)=x0ertx(t) = x_{0}e^{rt} x(t)=x0?ert
結(jié)論:隨著時間的增加,人口按指數(shù)規(guī)律無限增長
(4)結(jié)論
可以進(jìn)行短期的人口預(yù)測,較為符合
但是之后誤差就很大了
(5)舉例(Matlab代碼)
eg:已知一組數(shù)據(jù)如下:
t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
t為年份,p為對應(yīng)的人口數(shù)量,單位為:百萬
因為馬爾薩斯模型為指數(shù)函數(shù)為了線性擬合數(shù)據(jù),我們對其進(jìn)行如下操作:
兩邊同時取對數(shù):
可得:ln(x)=ln(x0)+rtln(x) = ln(x_{0}) + rtln(x)=ln(x0?)+rt
t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900]; p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0]; y = log(p); %求ln(p)函數(shù)值 a = polyfit(t,y,1) %用一次多項式對t和y進(jìn)行擬合 z = polyval(a,t); %求得以a為系數(shù)的多項式在t處的函數(shù)值 z1 = exp(z) r = a(1) plot(t,p,'bo',t,z1,'r') %分別畫出散點圖以及擬合曲線圖 xlabel('時間'); ylabel('人口數(shù)量'); legend('實際數(shù)據(jù)','理論曲線');作圖如下(短期內(nèi)基本吻合):
輸出結(jié)果如下:
當(dāng)我們用更多的數(shù)據(jù)進(jìn)行長期擬合是就會發(fā)現(xiàn)該方法做出來的差別較大!{\color{Red}當(dāng)我們用更多的數(shù)據(jù)進(jìn)行長期擬合是就會發(fā)現(xiàn)該方法做出來的差別較大!}當(dāng)我們用更多的數(shù)據(jù)進(jìn)行長期擬合是就會發(fā)現(xiàn)該方法做出來的差別較大!
二.Logistic模型(阻滯增長模型)
(1)背景
由于人口不可能無限制的增長,當(dāng)人口達(dá)到一定數(shù)量后,那么增長率就會下降。
我們要模擬這種增長率的變化
這里簡化的將增長率 r 看做是人口 x 的減函數(shù)
(2)建立 r 的關(guān)系式
假設(shè)r(x)=r?sx(r,s>0)r(x) = r - sx (r,s>0)r(x)=r?sx(r,s>0) 當(dāng)x很小時,r仍為固有增長率,s為待求系數(shù)
xm 是當(dāng)前環(huán)境可以容納的最大人口容量
r(xm)=0??>s=rxm??>r(x)=r(1?xxm)r(x_{m}) = 0 --> s = \frac{r }{ x_{m}} --> r(x) = r(1-\frac{x}{x_{m}}) r(xm?)=0??>s=xm?r???>r(x)=r(1?xm?x?)
(3)模型建立
指數(shù)增長模型:dxdt=rx\frac{dx }{ dt} = rx dtdx?=rx
所以 dxdt=r(x)x=rx(1?xxm)\frac{dx }{ dt} = r(x)x = rx(1-\frac{x}{x_{m}}) dtdx?=r(x)x=rx(1?xm?x?)
最終得到:x(t)=xm(1+(xmx0?1)e?rt)x(t) =\frac{x_{m}} {(1+(\frac{x_{m}}{x_{0}} - 1) e^{-rt})} x(t)=(1+(x0?xm???1)e?rt)xm??
(4)結(jié)論
最終得到 s 型增長曲線,x增長先快后慢,最終接近峰值 xm
該模型同樣可以用于種群數(shù)量中(魚群的捕撈要控制在 xm/2 附近,而害蟲的防治要遠(yuǎn)遠(yuǎn)低于 xm / 2)
(5)舉例(Matlab代碼)
已知一組數(shù)據(jù)同上:
t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
t為年份,p為對應(yīng)的人口數(shù)量,單位為:百萬
我們使用非線性擬合法來計算參數(shù)r以及xm{\color{Red}我們使用非線性擬合法來計算參數(shù) r 以及 x_{m}}我們使用非線性擬合法來計算參數(shù)r以及xm?
下面代碼由兩個文件構(gòu)成:
?\bullet? 主函數(shù)文件(腳本文件)
%代碼如下 t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990]; p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4]; t = t-1780; %整體減去1780 x0 = [150,0.15]; %待定參數(shù)x的初值(自己根據(jù)實際情況給出初值,之后再不斷調(diào)整;其中第一個參數(shù)為最大人口數(shù),第二個參數(shù)為人口增長率) x = lsqcurvefit('population',x0,t,p) %使用函數(shù)求得最終的(xm,r) p1 = population(x,t); plot(t+1780,p,'o',t+1780,p1,'-r*') title('Logistic模型擬合圖') xlabel('年'); ylabel('人口數(shù)'); legend('實際數(shù)據(jù)','理論數(shù)據(jù)')?\bullet? 函數(shù)m文件(注意文件名稱與函數(shù)名稱相同)
%population.m函數(shù)文件 function g = population(x,t) %UNTITLED2 此處顯示有關(guān)此函數(shù)的摘要 % 此處顯示詳細(xì)說明 g = x(1)./(1+(x(1)/3.9-1)*exp(-x(2)*t)); %這里的公式代入的是3.9,也就是初始數(shù)據(jù),根據(jù)自己的初值進(jìn)行修改 end如圖所示兩個文件:
作圖如下:{\color{Red}作圖如下:}作圖如下:
結(jié)果如下:{\color{Red}結(jié)果如下:}結(jié)果如下:
三.總結(jié)
Malthus 和 Logistic 均為宏觀模型,它們考慮的方面比較少。而且不考慮年齡分布。
以下的微觀模型考慮年齡結(jié)構(gòu)
?\bullet? Leslie差分方程模型
?\bullet? Verhulst偏微分方程模型
?\bullet? Pollard隨機(jī)方程模型
總結(jié)
以上是生活随笔為你收集整理的人口模型(Malthus+Logistic)附Matlab代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: smtp服务器组件,本机搭建虚拟SMTP
- 下一篇: 一个OpenMP的学习程序