人口問題の続き。
ズレが出てきたので、数学モデルの作り方の過程に戻って修正する。
マルサス法でイケイケドンドンかとおもいきや、やはりずれてくるようだ。
x <- 0:14 # 年度 y <- c(3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6, 50.2, 62.9, 76, 92, 106.5, 123.2)*10^6 # 実際の人口 z <- c(NA, NA, NA, 10, 13.7, 18.7, 25.6, 35, 47.8, 65.5, 89.6, 122.5, 167.6, 229.3, 313.7)*10^6 # モデル予測値 cbind(1790+x*10,y/10^6,z/10^6) [,1] [,2] [,3] [1,] 1790 3.9 NA [2,] 1800 5.3 NA [3,] 1810 7.2 NA [4,] 1820 9.6 10.0 [5,] 1830 12.9 13.7 [6,] 1840 17.1 18.7 [7,] 1850 23.2 25.6 [8,] 1860 31.4 35.0 [9,] 1870 38.6 47.8 [10,] 1880 50.2 65.5 [11,] 1890 62.9 89.6 [12,] 1900 76.0 122.5 [13,] 1910 92.0 167.6 [14,] 1920 106.5 229.3 [15,] 1930 123.2 313.7
何がこれを引き起こしたかを考えてみる。
本では、とりあえずイケイケドンドンで増え続ける、というのは無茶があっただろう、と考えている。
そこで、何か頭打ちになる要素を取り入れた(ヴェアフルスト)。
人口が上限を超えないものとし、人口の増え方は
- :現在の人口
- :未利用の人口資源に対する比
に比例するとすると、微分方程式
これを頑張って解くと
差分でRを使ってプロットしてみる。
# 20年間のシミュレーションを想定。 time <- seq(from=0, to=30, length=20) # 数値は本から。 gamma <- 0.3134 N_0 <- 3.9*10^6 Ninf <- 197*10^6 # 地味に計算する場合 N <- matrix(0, nr=length(gamma), nc=length(time)) N[, 1] <- N_0 for(j in 1:length(gamma)){ for(i in 2:length(time)){ N[j, i] <- N[j, i-1] + gamma[j] * N[j, i-1] } } Nv <- matrix(0, nr=length(gamma), nc=length(time)) Nv[, 1] <- N_0 for(j in 1:length(gamma)){ for(i in 2:length(time)){ Nv[j, i] <- Nv[j, i-1] + gamma[j] * Nv[j, i-1]*(1-Nv[j, i-1]/Ninf) } } ylim <- range(N, Nv) matplot(t(N), type="l", lty=1, ylim=ylim) par(new=TRUE) matplot(t(Nv), type="l", lty=1, ylim=ylim, col=2) abline(h=Ninf, lty=2) legend(1, max(N, Nv), c("unlimited model", "limited model"), col=1:2, lwd=3)
これは長年受け入れられてきた手法らしい。
ただ、アメリカを例に取ったが、上限1.97億の人口は既に超えている。
人口の増減に大影響を与えるような、例えば、大災害や戦争や大移民とか、そういうのは想定していない、というのがある。