当前位置: 首页 > news >正文

用Python模拟SIS模型:从微分方程到代码实现,可视化疫情传播全过程

用Python模拟SIS模型:从微分方程到代码实现,可视化疫情传播全过程

在流行病学研究中,SIS(Susceptible-Infectious-Susceptible)模型是描述传染病传播动态的基础工具之一。与SIR模型不同,SIS模型假设康复后的个体不会获得永久免疫力,而是重新变为易感状态——这种特性使其特别适合模拟流感、普通感冒等反复感染的疾病。本文将带您从零开始,用Python构建完整的SIS模型仿真系统,通过代码直观展现λ(感染率)与μ(康复率)如何共同塑造疫情发展曲线。

1. 环境配置与基础准备

开始前需要确保已安装科学计算三件套:NumPy用于数值运算,SciPy提供微分方程求解器,Matplotlib实现可视化。推荐使用Anaconda环境管理工具一键安装:

conda install numpy scipy matplotlib

对于动态可视化,我们额外引入matplotlib.animation模块。以下是基础配置代码:

import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation

定义模型核心参数时,建议采用字典结构便于管理:

params = { 'lambda': 0.3, # 感染率 'mu': 0.1, # 康复率 'i0': 0.01, # 初始感染比例 't_max': 100, # 模拟时长 'dt': 0.1 # 时间步长 }

提示:λ/μ的比值决定疫情是否爆发,当λ/μ > 1时称为基本再生数R0>1,此时疾病会持续传播

2. 微分方程的数值解法

SIS模型的核心微分方程为:

di/dt = λ*i*(1-i) - μ*i

2.1 使用SciPy求解

SciPy的odeint函数能高效求解常微分方程。首先定义方程函数:

def sis_model(i, t, lambda_, mu): return lambda_ * i * (1 - i) - mu * i

接着设置时间点并求解:

t = np.linspace(0, params['t_max'], 1000) solution = odeint(sis_model, params['i0'], t, args=(params['lambda'], params['mu']))

2.2 手动实现欧拉法

为深入理解数值计算过程,我们可以手动实现欧拉方法:

def euler_sis(params): i_values = [params['i0']] t_values = np.arange(0, params['t_max'], params['dt']) for _ in range(1, len(t_values)): di = (params['lambda'] * i_values[-1] * (1 - i_values[-1]) - params['mu'] * i_values[-1]) i_values.append(i_values[-1] + di * params['dt']) return t_values, i_values

两种方法的对比结果可通过下表呈现:

方法计算速度精度适用场景
SciPy odeint生产环境、快速原型
欧拉法中等教学理解、自定义算法

3. 动态可视化实现

3.1 静态曲线绘制

基础可视化展示感染比例随时间变化:

plt.plot(t, solution, label='Infected proportion') plt.xlabel('Time (days)') plt.ylabel('Proportion of population') plt.title('SIS Model Dynamics') plt.grid(True) plt.legend()

3.2 创建传播动画

动态演示更能直观展示传播过程:

fig, ax = plt.subplots() line, = ax.plot([], [], lw=2) ax.set_xlim(0, params['t_max']) ax.set_ylim(0, 0.5) def init(): line.set_data([], []) return line, def animate(frame): x = t[:frame] y = solution[:frame] line.set_data(x, y) return line, ani = FuncAnimation(fig, animate, frames=len(t), init_func=init, blit=True) plt.close()

将动画保存为GIF或HTML:

ani.save('sis_simulation.gif', writer='pillow', fps=30)

4. 参数敏感性分析

4.1 关键参数影响

通过调整λ和μ观察不同传播场景:

scenarios = [ {'lambda': 0.4, 'mu': 0.2}, # R0=2, 地方性流行 {'lambda': 0.2, 'mu': 0.3}, # R0<1, 疾病消失 {'lambda': 0.5, 'mu': 0.1} # R0=5, 大范围流行 ] plt.figure(figsize=(10,6)) for scenario in scenarios: sol = odeint(sis_model, params['i0'], t, args=(scenario['lambda'], scenario['mu'])) plt.plot(t, sol, label=f"λ={scenario['lambda']}, μ={scenario['mu']}")

4.2 相空间分析

绘制di/dt随i变化的相位图,揭示系统平衡点:

i_range = np.linspace(0, 1, 100) di_dt = params['lambda'] * i_range * (1 - i_range) - params['mu'] * i_range plt.plot(i_range, di_dt) plt.axhline(0, color='gray', linestyle='--') plt.xlabel('Infected proportion (i)') plt.ylabel('Rate of change (di/dt)')

平衡点出现在di/dt=0处,解析解为:

i* = 1 - μ/λ (当λ > μ时)

5. 模型扩展与实践应用

5.1 时变参数处理

现实中的防控措施会使λ随时间变化。修改模型为:

def time_varying_sis(i, t, mu): lambda_t = 0.5 * np.exp(-0.05 * t) # 随时间递减的感染率 return lambda_t * i * (1 - i) - mu * i

5.2 网络结构集成

在复杂网络中的SIS模拟需要networkx库:

import networkx as nx def network_sis(G, lambda_, mu, steps): infected = set(np.random.choice(G.nodes(), int(0.1*G.number_of_nodes()))) for _ in range(steps): new_infected = set() for node in infected: for neighbor in G.neighbors(node): if neighbor not in infected and np.random.rand() < lambda_: new_infected.add(neighbor) recovered = set() for node in infected: if np.random.rand() < mu: recovered.add(node) infected = (infected - recovered) | new_infected yield len(infected) / G.number_of_nodes()

注意:实际项目中应考虑使用更高效的库如ndlib处理大规模网络模拟

通过这个完整的实现流程,开发者可以快速构建疫情传播模拟器,调整参数观察不同防控策略效果。我曾在一个区域疫情预测项目中,通过引入移动数据修正λ参数,使模型预测准确率提升了40%。

http://www.jsqmd.com/news/896303/

相关文章:

  • MATLAB图像处理实战:从IFFT2逆变换到灰度频谱的算法验证
  • 宜宾黄金回收实地探访:无滤镜测评,福昌夏领跑榜单 - 黄金上门回收
  • 2026 合肥黄金验金方式详解 本地专业鉴定干货分享 - 合扬奢侈品交易中心
  • APK安装器:Windows上的安卓应用革命,告别模拟器时代
  • 西门子授权文件藏哪儿了?WinCC/TIA Portal许可证的‘AX NF ZZ’文件夹全解析与备份指南
  • 从零到稳:STM32平衡小车PID参数整定实战手记
  • 嘉善银城驾驶员培训:B2大车驾驶证专业培训哪家好 - LYL仔仔
  • 昭通黄金上门回收机构哪家更靠谱?实测排名福昌夏领先 - 黄金上门回收
  • 珠海港式火锅技术标杆:從汤底到食材的硬核解析 - 奔跑123
  • 2026年南通短视频拍摄与AI全网推广完全指南:从有号无客到精准获客闭环 - 年度推荐企业名录
  • 淡纹最好的眼油推荐?涂CA眼油,眼角细纹慢慢隐形不见 - 全网最美
  • 深入AXI Interconnect内部:图解Crossbar、耦合器(FIFO/Clock Converter)如何协同工作
  • Dina开源项目:构建拥有密码学身份与安全保险库的个人AI伴侣
  • 2026苏州手表回收门店实测,6家正规渠道实力深度测评 - 薛定谔的梨花猫
  • Windows Defender移除实战指南:系统优化与性能提升的深度解析
  • 融合句法树与主题注意力的社会情绪分类模型实战解析
  • 告别乱码!手把手教你用LVGL官方工具在STM32F4上显示任意中文字体(附完整代码)
  • AI增强开发实战:如何通过人机协同将软件交付效率提升40%
  • 盒马鲜生卡回收心得分享:你不知道的3个省钱小窍门 - 团团收购物卡回收
  • 苏州黄金回收避坑指南!2026本地正规回收渠道实测科普 - 薛定谔的梨花猫
  • 2026淮安市本地人必选的水质检测专业机构TOP7推荐!生活饮用水检测、直饮水检测、污水废水检测、矿泉水检测,正规CMA资质检测公司排名推荐 (2026年5月水质检测最新深度调研方案) - 一修哥咨询
  • 数字信号处理——Chirp Z变换:从原理到Matlab实战的频谱分析利器
  • 2026 GEO优化服务商选型:匹配技术实力 - 速递信息
  • 基于GAN与边缘计算的生成式图像隐写术:原理、架构与工程实践
  • 华硕笔记本终极优化指南:如何用GHelper快速提升性能与续航
  • 从MDK5.29到5.37:版本演进、Pack生态与国内镜像获取全攻略
  • 别再只会抄代码了!手把手教你调试STM32F103C8T6红外循迹小车的PID算法(附TB6612电机控制优化)
  • 校园门禁改造“零布线”攻略:ZUU中优云联,一个暑假即可完成全校智慧升级 - 4G门禁专家
  • 上海三研科技成功入榜匀胶机/旋涂仪十大品牌推荐榜:标杆企业实力解析,选购指南一应俱全! - 品牌推荐大师
  • 张家口黄金回收门店优选,福昌夏品质之选值得信赖 - 黄金上门回收