数学建模:微分方程模型— SIR 传染病模型

模型假设

  1. 被研究人群是封闭的, 总人为 N N N,病人、健康人和移出者 (有免疫能力, 移出感染系统的人, 病人治愈后为移出者) 的比例分别为 i ( t ) , s ( t ) , r ( t ) i (t ), s (t ), r (t ) i(t),s(t),r(t)

  2. 病人的日接触率 λ \lambda λ , 日治愈率 μ \mu μ, 接触数 σ = λ μ \sigma = \displaystyle{\frac{\lambda}{\mu}} σ=μλ

模型建立

s ( t ) + i ( t ) + r ( t ) = 1 , ( 1 ) s (t ) + i(t ) + r (t ) = 1, \quad (1) s(t)+i(t)+r(t)=1,(1)

N [ i ( t + Δ t ) − i ( t ) ] = λ N s ( t ) i ( t ) Δ t − μ N i ( t ) Δ t , ( 2 ) N[i(t+\Delta t)-i(t)]=\lambda N s(t) i(t) \Delta t-\mu N i(t) \Delta t, \quad (2) N[i(t+Δt)i(t)]=λNs(t)i(t)ΔtμNi(t)Δt,(2)

N [ s ( t + Δ t ) − s ( t ) ] = − λ N s ( t ) i ( t ) Δ t , ( 3 ) N[s(t+\Delta t)-s(t)]=-\lambda N s(t) i(t) \Delta t, \quad (3) N[s(t+Δt)s(t)]=λNs(t)i(t)Δt,(3)

⟹ \Longrightarrow

{ d i d t = λ s i − μ i d s d t = − λ s i i ( 0 ) = i 0 ,   s ( 0 ) = s 0 i 0 + s 0 ≈ 1 (  通常  r ( 0 ) = r 0  很小  ) \begin{cases} {\frac{d i}{d t}}=\lambda s i-\mu i \\ {\frac{d s}{d t}}=-\lambda s i \\ i(0)=i_{0}, \ s(0)=s_{0} \\ i_{0}+s_{0} \approx 1\left(\text { 通常 } r(0)=r_{0} \text { 很小 }\right) \end{cases} dtdi=λsiμidtds=λsii(0)=i0, s(0)=s0i0+s01( 通常 r(0)=r0 很小 )

无法求出 i ( t ) , s ( t ) i(t ), s(t ) i(t),s(t) 的解析解, 在相平面 s − t s-t st 上研究解的性质.

相轨线 i ( s ) i ( s ) i(s) 及其分析

消去 d t d t dt, σ = λ μ \sigma=\displaystyle{\frac{\lambda}{\mu}} σ=μλ, ⟹ \Longrightarrow
{ d i d s = 1 σ ⋅ s − 1 i ∣ s = s 0 = i 0 \begin{cases} \displaystyle{\frac{d i}{d s}=\frac{1}{\sigma \cdot s}-1} \\ \left.i\right|_{s=s_{0}}=i_{0} \end{cases} dsdi=σs11is=s0=i0

⟹ \Longrightarrow 相轨线:
i ( s ) = ( s 0 + i 0 ) − s + 1 σ ln ⁡ s s 0 i(s)=\left(s_{0}+i_{0}\right)-s+\frac{1}{\sigma} \ln \frac{s}{s_{0}} i(s)=(s0+i0)s+σ1lns0s

定义域 D = { ( s , i ) ∣ s ≥ 0 , i ≥ 0 , s + i ≤ 1 } D=\{(s, i) \mid s \geq 0, i \geq 0, s+i \leq 1\} D={(s,i)s0,i0,s+i1}

2022-03-22-18-41-45

s ( t ) s(t) s(t) 单调减. t → ∞ t \rightarrow \infty t 时, i → 0 i \rightarrow 0 i0. ⟹ \Longrightarrow t → ∞ t \rightarrow \infty t
s 0 + i 0 − s ∞ + 1 σ ln ⁡ s ∞ s 0 = 0 s_{0}+i_{0}-s_{\infty}+\frac{1}{\sigma} \ln \frac{s_{\infty}}{s_{0}}=0 s0+i0s+σ1lns0s=0

P 1 : s 0 > 1 σ P_{1}: s_{0}>\displaystyle{\frac{1}{\sigma}} P1:s0>σ1 ⟹ i ( t ) \Longrightarrow i(t) i(t) 先升后降至 0 0 0 ⟹ \Longrightarrow 传染病蔓延;
P 2 : s 0 < 1 σ P_{2}: s_{0}<\displaystyle{\frac{1}{\sigma}} P2:s0<σ1 ⟹ i ( t ) \Longrightarrow i(t) i(t) 单调降至 0 0 0 ⟹ \Longrightarrow 传染病不蔓延.

1 σ \displaystyle{\frac{1}{\sigma}} σ1 —— 阈值

预防传染病蔓延的手段

  • 提高阈值 1 σ ⟹ \displaystyle{\frac{1}{\sigma }}\Longrightarrow σ1 降低 σ ( = λ μ ) ⟹ λ ↓ ,   μ ↑ \sigma \left(=\displaystyle{\frac{\lambda}{\mu }} \right) \Longrightarrow \lambda \downarrow, \ \mu \uparrow σ(=μλ)λ, μ
    • λ \lambda λ (日接触率) ↓   ⟹ \downarrow \ \Longrightarrow   卫生水平 ↑ \uparrow
    • μ \mu μ (日治愈率) ↑ \uparrow ⟹ \Longrightarrow 医疗水平 ↑ \uparrow
  • 降低 s 0 s_{0} s0 ⇒ s 0 + i 0 + r 0 = 1 \displaystyle{\xRightarrow{s_{0}+i_{0}+r_{0}=1}} s0+i0+r0=1 提高 r 0 r_{0} r0 ⟹ \Longrightarrow 群体免疫

σ \sigma σ 的估计

s 0 + i 0 − s ∞ + 1 σ ln ⁡ s ∞ S 0 = 0 \displaystyle{s_{0}+i_{0}-s_{\infty}+\frac{1}{\sigma} \ln \frac{s_{\infty}}{S_{0}}=0} s0+i0s+σ1lnS0s=0, 忽略 i 0 i_0 i0 ⟹ \Longrightarrow
σ = ln ⁡ s 0 − ln ⁡ s ∞ s 0 − s ∞ \sigma=\frac{\ln s_{0}-\ln s_{\infty}}{s_{0}-s_{\infty}} σ=s0slns0lns

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的SIR传染病模型的Python代码及注释: ```python import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # 定义SIR模型的微分方程 def sir_model(y, t, beta, gamma): S, I, R = y dSdt = -beta * S * I dIdt = beta * S * I - gamma * I dRdt = gamma * I return [dSdt, dIdt, dRdt] # 定义初始状态和参数 S0 = 0.99 # 初始易感人群比例 I0 = 0.01 # 初始感染人群比例 R0 = 0 # 初始恢复人群比例 beta = 0.2 # 接触率,表示一个人每天接触到的人数 gamma = 0.1 # 恢复率,表示一个人每天从感染状态转变为恢复状态的概率 t = np.linspace(0, 100, 1000) # 时间范围和间隔 # 解微分方程 solution = odeint(sir_model, [S0, I0, R0], t, args=(beta, gamma)) S, I, R = solution.T # 绘制结果 fig = plt.figure(figsize=(10,6)) plt.plot(t, S, label='Susceptible') plt.plot(t, I, label='Infected') plt.plot(t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Proportion of population') plt.title('SIR Model') plt.legend() plt.show() ``` 注释: - `import numpy as np` 和 `from scipy.integrate import odeint` 导入Numpy和Scipy库中的 `odeint` 函数,用于解微分方程。 - `def sir_model(y, t, beta, gamma)` 定义一个函数,它接受当前状态 `y`、时间 `t`、接触率 `beta` 和恢复率 `gamma` 作为参数,并返回下一个状态的导数。 - `S0 = 0.99`, `I0 = 0.01`, `R0 = 0`, `beta = 0.2`, `gamma = 0.1` 和 `t = np.linspace(0, 100, 1000)` 定义初始状态和模型参数。在本例中,我们假设有一个人口总数为1的社区,其中99%的人是易感人群,1%的人是感染人群,没有恢复人群。我们还假设每个感染人群每天会接触到2个人,每天有10%的感染人群会恢复。我们将模型运行100天,每天计算一次。 - `solution = odeint(sir_model, [S0, I0, R0], t, args=(beta, gamma))` 调用 `odeint` 函数解微分方程。它接受初始状态 `[S0, I0, R0]`、时间范围 `t`、微分方程函数 `sir_model` 和其他参数 `args=(beta, gamma)` 作为输入,然后返回解的数组 `solution`。 - `S, I, R = solution.T` 将解数组 `solution` 转置,然后将每个状态的数组分配给 `S`、`I` 和 `R` 变量。 - `fig = plt.figure(figsize=(10,6))`, `plt.plot(t, S, label='Susceptible')`, `plt.plot(t, I, label='Infected')`, `plt.plot(t, R, label='Recovered')`, `plt.xlabel('Time (days)')`, `plt.ylabel('Proportion of population')`, `plt.title('SIR Model')`, `plt.legend()`, `plt.show()` 绘制结果。我们创建一个10x6英寸的图形窗口,然后使用 `plt.plot` 函数绘制每个状态的曲线。我们还添加了一些标签和标题,最后使用 `plt.show` 函数显示图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值