Bootstrap

数学建模-Logistic模型


为了更好地理解Logistic模型,我们先看看Malthus模型

Malthus模型

这是英国神父Malthus通过对一百多年人口统计资料的分析之后提出的人口模型假设

模型假设

  1. 设x(t)表示t时刻的人口数,且x(t)连续可微.
  2. 人口的增长率r是常数(增长数=出生率-死亡率)
  3. 人口的数量的变化是封闭的,即人口数量的增加与减少只取决于人口中个体的生育和死亡,且每一个体都具有同样的生育能力与死亡率.

建模与求解

由假设,t时刻到t+△t时刻人口的增量为x(t+△)-x(t)=rx(t)△t.

​ 所以得到

在这里插入图片描述

import sympy as sp
from sympy import  diff,dsolve,simplify
x=sp.symbols('x',cls=sp.Function)
t=sp.symbols('t')
r=sp.symbols('r')
eq=diff(x(t),t)-(r*x(t))
x=dsolve(eq)
print(simplify(x))

所以其解为:

x ( t ) = x 0 e r t x(t)=x0e^rt x(t)=x0ert

模型评价

考虑二百多年来人口增长的实际情况,1961年世界人口总数为 3.06 × 1 0 9 3.06\times10^9 3.06×109,我们对人口自然增长率设置为2%.
so x ( t ) = 3.06 × 1 0 9 ⋅ e 0.02 ( t − 1961 ) x(t)=3.06\times10^9\cdot e^{0.02(t-1961)} x(t)=3.06×109e0.02(t1961)

这一模型符合1961年前的历史人口增长,但对于未来人口数量增长统计却存在一定的极端和不准确性,所以对于r是常数这个地方是值得商榷的.

Logistic模型

继上个模型,我们现在来对r进行修正,因为地球上的资源是有限的,所以随着人口数量的增加,自然资源和环境条件对于人口增长的限制作用将会逐渐显著.

所以,我们将r视为一个随着人口的增加而减小的量,即将增长率r表示为人口x(t)的函数r(x),且r(x)为x的减函数.

模型假设

  1. 设r(x)为x的线性函数,r(x)=r-sx(工程师原则,首先用线性).
  2. 自然资源与环境条件所能容纳的最大人口数$\chi_m $ 即当 χ = χ m \chi=\chi_m χ=χm时,增长率r( χ m \chi_m χm)=0.

建模与求解

​ 由假设(1),(2)可得 r ( x ) = r ( 1 − χ χ m ) r(x)=r(1-\frac{\chi}{\chi_m}) r(x)=r(1χmχ),则有
在这里插入图片描述

import sympy as sp
import math
from sympy import  diff,dsolve,simplify
x=sp.symbols('x',cls=sp.Function)
t=sp.symbols('t')
r=sp.symbols('r')
xm=sp.symbols('xm')
c1=sp.symbols('c1')
x0=sp.symbols('x0')
eq=diff(x(t),t)-r*(1-(x(t)/xm))*x(t)
x=dsolve(eq)
print(simplify(x))

求解方程得到 E q ( x ( t ) , − x m / ( e x p ( C 1 ∗ x m − r ∗ t ) − 1 ) ) Eq(x(t), -xm/(exp(C1*xm - r*t) - 1)) Eq(x(t),xm/(exp(C1xmrt)1))

其中因为C1较为复杂所以这里用python求解并不是一直好办法

我们直接用分离变量法求解 得到x(t)

x ( t ) = x m 1 + ( x m x 0 − 1 ) e − r ( t − t 0 ) x(t)=\frac{xm}{1+(\frac{xm}{x0}-1)e^{-r(t-t0)}} x(t)=1+(x0xm1)er(tt0)xm

我们用pyplot来使得x(t)函数可视化

import matplotlib.pyplot as plt
import numpy as np
import math
t=np.arange(1,200,0.5)
xm=14
x0=1 #防止除0错误
t0=1 #防止除0错误
r=0.02
plt.rc('font',size=16); plt.rc('font',family='SimHei')
y=xm/(1+(xm/x0-1)*pow(math.e,-r*(t-t0)))
plt.plot(t,y,'g',label='人口随时间的变化曲线')
plt.xlabel("时间序列")
plt.ylabel("人口数",rotation=0)
plt.legend()
plt.show()

在这里插入图片描述

可以看到用logistic模型解出的回归函数会更加科学

模型检验

d 2 x d t 2 = r 2 ( 1 − x x m ) ( 1 − 2 x x m ) x \frac{d^2x}{dt^2}=r^2(1-\frac{x}{xm})(1-\frac{2x}{xm})x dt2d2x=r2(1xmx)(1xm2x)x

所以人口总数x(t)有如下规律:

  1. lim ⁡ t → + ∞ χ ( t ) = χ m \lim_{t\rightarrow+\infty}{\chi(t)}=\chi_m limt+χ(t)=χm, 即无论人口初值 χ 0 \chi_0 χ0 如何,人口总数以 χ m \chi _m χm为极限。

  2. 0 < χ 0 < χ m 0<\chi_0<\chi_m 0<χ0<χm d x d t = r ( 1 − χ χ m ) x > 0 \frac{d_x}{d_t}=r(1-\frac{\chi}{\chi_m})x>0 dtdx=r(1χmχ)x>0 , 这说明x(t)是单调增加的。
    根据 d 2 x d t 2 = r 2 ( 1 − x x m ) ( 1 − 2 x x m ) x \frac{d^2x}{dt^2}=r^2(1-\frac{x}{xm})(1-\frac{2x}{xm})x dt2d2x=r2(1xmx)(1xm2x)x
    说明当 x < x m 2 x<\frac{x_m}{2} x<2xm时, d 2 x d t 2 > 0 \frac{d^2x}{dt^2}>0 dt2d2x>0 x=x(t)是一个凹函数

    而当 x < x m 2 x<\frac{x_m}{2} x<2xm的时候 d 2 x d t 2 < 0 \frac{d^2x}{dt^2}<0 dt2d2x<0 x=x(t)是一个凸函数

  3. 人口变化率 d x d t \frac{d_x}{d_t} dtdx x = x m 2 x=\frac{x_m}{2} x=2xm时取到最大值,即人口总数达到极限值一半以前是加速生长时期,经过这一点以后,增长速率会逐渐变小,最终达到零。

以上的结论都可以从上面我画的曲线中直观地看出.

;