手搓传染病模型(SEIARW)
在传染病传播的研究中,水传播途径是一个重要的考量因素。SEAIRW 模型(易感者 S - 暴露者 E - 感染者 I - 无症状感染者 A - 康复者 R - 水中病原体 W)综合考虑了人与人接触传播以及水传播的双重机制,为分析此类传染病提供了全面的框架。图中的微分方程组清晰地定义了各变量的动态变化:
\(\begin{cases} \frac{dS}{dt} = -\beta S (I + kA) - \beta_w S W \\ \frac{dE}{dt} = \beta S (I + kA) + \beta_w S W - p\omega' E - (1 - p)\omega E \\ \frac{dI}{dt} = (1 - p)\omega E - \gamma I \\ \frac{dA}{dt} = p\omega' E - \gamma' A \\ \frac{dR}{dt} = \gamma I + \gamma' A \\ \frac{dW}{dt} = \mu I + \mu' A - \epsilon W \end{cases}\)
一、模型方程深度解析
- 易感者 S:\(\frac{dS}{dt} = -\beta S (I + kA) - \beta_w S W\),表示易感者因接触感染者 I、无症状感染者 A(传播概率 k)以及水中病原体 W(传播系数 \(\beta_w\))而减少。
- 暴露者 E:\(\frac{dE}{dt} = \beta S (I + kA) + \beta_w S W - p\omega' E - (1 - p)\omega E\),包含感染输入(来自 S 的感染)、向无症状感染者(\(p\omega' E\))和感染者(\((1 - p)\omega E\))的转化。
- 感染者 I:\(\frac{dI}{dt} = (1 - p)\omega E - \gamma I\),由暴露者转化而来(\((1 - p)\omega E\)),并以速率 \(\gamma\) 康复。
- 无症状感染者 A:\(\frac{dA}{dt} = p\omega' E - \gamma' A\),由暴露者转化(\(p\omega' E\)),并以速率 \(\gamma'\) 康复。
- 康复者 R:\(\frac{dR}{dt} = \gamma I + \gamma' A\),汇总感染者和无症状感染者的康复贡献。
- 水中病原体 W:\(\frac{dW}{dt} = \mu I + \mu' A - \epsilon W\),包含感染者和无症状感染者向水中释放病原体(\(\mu I + \mu' A\)),以及病原体的自然去除(\(\epsilon W\))。
二、MATLAB 代码实现细节
1. 参数与初始条件设置
md.b = 0.8; % 易感者与感染者接触率
md.bW = 0.5; % 易感者与水中病原体接触率
md.kappa = 0.05; % 无症状感染者向易感者传播的概率
md.p = 0.3; % 成为无症状感染者的概率
md.omega = 1; % 暴露者转为感染者的速率
md.omegap = 1; % 暴露者转为无症状感染者的速率
md.gamma = 1/3; % 感染者康复率
md.gammap = 0.03846; % 无症状感染者康复率
md.c = 0.48; % 无症状感染者向水中释放病原体的速率
md.epsilon = 0.1; % 水中病原体去除速率
t = 1:1:100; % 模拟100天% 初始比例
s0 = 798/800;
i0 = 2/800;
e0 = i0 / ((1-md.p) * md.omega);
a0 = 0;
r0 = 0;
w0 = 0;
N0 = 800;
X0 = [s0, e0, i0, a0, r0, w0];
- 详细设定传播、转化、康复等速率参数,以及初始时刻各仓室的比例和水中病原体浓度。
2. 干预措施与模拟循环
itimes = 4; % 增加感染者的时间点
iamounts = 6; % 增加的感染者数量
stimes = 5; % 增加易感者的时间点
samounts = 600; % 增加的易感者数量for idx = 1:length(t) currenttime = t(idx); if currenttime == itimes X0(3) = (X0(3)*N0 + iamounts)/N0; % 增加感染者比例X0(1) = (X0(1)*N0 - iamounts)/N0; % 减少易感者比例end if currenttime == stimes N0 = N0 + samounts; % 更新总人口X0=X0.*((N0 - samounts)/N0); % 调整各仓室比例X0(1) = X0(1) + samounts/N0; % 增加易感者比例end dXdt = SEAIRW_model(currenttime,X0, md);X0 = X0 + dXdt'; % 保存结果...
end
- 在特定时间点(第 4 天和第 5 天)实施干预,模拟现实中的疫情变化,如突发感染事件和人口流动。
3. 模型函数定义
function dXdt = SEAIRW_model(t, X, md) s = X(1); e = X(2); i = X(3); a = X(4); r = X(5); w = X(6); dsdt = -md.b * s * (i + md.kappa * a) - md.bW * s * w; dedt = -dsdt - (md.p * md.omegap + (1-md.p) * md.omega) * e; didt = (1-md.p) * md.omega * e - md.gamma * i; dadt = md.p * md.omegap * e - md.gammap * a; drdt = md.gamma * i + md.gammap * a; dwdt = (i + a * md.c) * md.epsilon - md.epsilon * w; dXdt = [dsdt; dedt; didt; dadt; drdt; dwdt];
end
- 严格按照模型方程计算各变量的导数,确保模拟的准确性。
三、结果可视化与分析
通过绘图展示各变量随时间的变化:
figure;
plot(S, 'k-', 'LineWidth', 1.5); hold on;
plot(E, 'g-', 'LineWidth', 1.5);
plot(I, 'r-', 'LineWidth', 1.5);
plot(A, 'm-', 'LineWidth', 1.5);
plot(R, 'c-', 'LineWidth', 1.5);
plot(W, 'b-', 'LineWidth', 1.5);
legend('S', 'E', 'I', 'A', 'R', 'W','Location','east');
xlabel('Time(Day)');
- 易感者 S 因感染逐渐减少,暴露者 E 先升后降,感染者 I 和无症状感染者 A 呈现动态变化,康复者 R 持续增加,水中病原体 W 随释放和去除机制波动。
四、模型应用与价值
SEAIRW 模型综合了接触传播和水传播途径,适用于霍乱、伤寒等水传播疾病的研究。通过 MATLAB 代码实现,能够模拟不同干预措施下的疫情发展,为公共卫生决策提供科学依据,如优化水源管理、制定隔离政策等。模型的灵活性和可扩展性使其成为分析复杂传染病传播的有力工具。
通过深入理解 SEAIRW 模型及其 MATLAB 实现,我们能够更有效地应对水传播传染病的挑战,为保障公众健康提供坚实的支持。快来尝试调整参数,探索不同场景下的疫情动态吧! 💻🦠
完整代码 (省流版)
close all; clear; clc;
% # Initial parameter settings
md.b = 0.8; % Contact rate between susceptible and infected individuals
md.bW = 0.5; % Contact rate between susceptible and infected in water
md.kappa = 0.05; % The probability of transmission from asymptomatic to susceptible
md.p = 0.3; % The probability of being asymptomatic
md.omega = 1; % Transition rate from exposed to infectious
md.omegap = 1; % Transition rate from exposed to asymptomatic
md.gamma = 1/3; % Recovery rate of infectious individuals
md.gammap = 0.03846; % Recovery rate of asymptomatic individuals
md.c = 0.48; % The rate of pathogens shedding into water by asymptomatic individuals
md.epsilon = 0.1; % The rate of pathogen removal from water
t = 1:1:100; % Time from day 1 to day 100 (100 days in total)% # Initialize variables
s0 = 798/800; Initial % proportion of susceptible individuals
i0 = 2/800; % Initial proportion of infectious individuals
e0 = i0 / ((1-md.p *) md.omega); % Initial proportion of exposed individuals
a0 = 0; % Initial proportion of asymptomatic individuals
r0 = 0; % Initial proportion of recovered individuals
w0 = 0; % Initial concentration of pathogens in water
N0 = 800; % Initial total population
% Initial state vector
X0 = [s0, e0, i0, a0, r0, w0]; %
% # Run SEAIRW model
% Pre-allocate result arrays
S = zeros(1, length(t)+ 1); % Array to store susceptible proportions
E = zeros(1, length(t)+ 1); % Array to store exposed proportions
I = zeros(1, length(t)+ 1); % Array to store infectious proportions
A = zeros(1, length(t)+ 1); % Array to store asymptomatic proportions
R = zeros(1, length(t)+ 1); % Array to store recovered proportions
W = zeros(1, length(t)+ 1); % Array to store pathogen concentrations in water% Initialize the state at the first time point
S(1) = s0;
E(1) = e0;
I(1) = i0;
A(1) = a0;
R(1) = r0;
W(1) = w0; % Define the time points and amounts for interventions
itimes = 4; % The time point (in days) to add infectious individuals
iamounts = 6; % The number of infectious individuals to add
stimes = 5; % The time point (in days) to add susceptible individuals
samounts = 600; % The number of susceptible individuals to add% Main simulation loop
for idx = 1:length(t) currenttime = t(idx); % Handle intervention eventsif currenttime == itimes X0(3) = (X0(3)*N0 + iamounts)/N0; % Increase the number of infectious individualsX0(1) = (X0(1)*N0 - iamou nts)/N0; % Decrease the number of susceptible individualsend if currenttime == stimes N0 = N0 + samounts; % Update the total populationX0=X0.*((N0 - samounts)/N0); % Adjust the proportions of all compartmentsX0(1) = X0(1) + samounts/N ;0 % Increase the proportion of susceptible individualsend % Calculate the derivatives at the current time pointdXdt = SEAIRW_model(currenttime,X0, md);% Update the state variablesX0 = X0 + dXdt'; % Save the resultsS(idx + 1) = X0(1); E(idx + 1) = X0(2); I(idx + 1) = X0(3); A(idx + 1) = X0(4); R(idx + 1) = X0(5); W(idx + 1) = X0(6);
end % # Plot results thefigure;
% Plot the curves of each variable
plot(S, 'k-', 'LineWidth', 1.5); % Black line for S
hold on;
plot( E, 'g-', 'LineWidth', 1.5); % Green line for E
plot( I, 'r-', 'LineWidth', 1.5); % Red line for I
plot( A, 'm-', 'LineWidth', 1.5); % Magenta line for A
plot( R, 'c-', 'LineWidth', .15); % Cyan line for R
plot( W, 'b-', 'LineWidth', 1.5); % Blue line for W
% Add legend
legend('S', 'E', 'I', 'A', 'R', 'W','Location','east');
xlabel('Time(Day)');% Define the SEAIRW model function
function dXdt = SEAIRW_model(t, X, md) s = X(1); % Proportion of susceptible individualse = X(2); % Proportion of exposed individualsi = X(3); % Proportion of infectious individualsa = X(4); % Proportion of asymptomatic individualsr = X(5); % Proportion of recovered individualsw = X(6); % Concentration of pathogens in water% SEAIRW model equationsdsdt = -md.b * s * (i + md.kappa * a) - md.bW * s * w; % Change rate of susceptible individualsdedt = -dsdt - (md.p * md.omegap + (1-md.p) * md.omega) * e; % Change rate of exposed individualsdidt = (1-md.p) * md.omega * e - md.gamma * i; % Change rate of infectious individualsdadt = md.p * md.omegap * e - md.gammap * a; % Change rate of asymptomatic individualsdrdt = md.gamma * i + md.gammap * a; % Change rate of recovered individualsdwdt = (i + a * md.c) * md.epsilon - md.epsilon * w; % Change rate of pathogens in waterdXdt = [dsdt; dedt; didt; dadt; drdt; dwdt]; % Combine all derivatives into a vector
end
相关文章:

手搓传染病模型(SEIARW)
在传染病传播的研究中,水传播途径是一个重要的考量因素。SEAIRW 模型(易感者 S - 暴露者 E - 感染者 I - 无症状感染者 A - 康复者 R - 水中病原体 W)综合考虑了人与人接触传播以及水传播的双重机制,为分析此类传染病提供了全面的…...

【Mac 从 0 到 1 保姆级配置教程 15】- Python 环境一键安装与配置,就是这么的丝滑
文章目录 前言安装 Python 环境VSCode 配置Python 环境NeoVim 配置 Python 环境(选看)1. Python LSP 配置2. 打开 python 语言支持 最后参考资料系列教程 Mac 从 0 到 1 保姆级配置教程目录,点击即可跳转对应文章: 【Mac 从 0 到 …...

【递归、搜索与回溯】专题一:递归(二)
📝前言说明: 本专栏主要记录本人递归,搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码…...

Spark缓存-cache
一、RDD持久化 1.什么时候该使用持久化(缓存) 2. RDD cache & persist 缓存 3. RDD CheckPoint 检查点 4. cache & persist & checkpoint 的特点和区别 特点 区别 二、cache & persist 的持久化级别及策略选择 Spark的几种持久化…...

记录算法笔记(2025.5.13)二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,null,2] …...

【Linux】简单设计libc库
📝前言: 经过之间两篇文章,【Linux】基础IO(一)和【Linux】基础IO(二)的学些,我们对文件的基础IO已经有了一定的理解。 这篇文章我们来简单设计一下libc库,来复习一下文…...

milvus+flask山寨《从零构建向量数据库》第7章case2
继续流水账完这本书,这个案例是打造文字形式的个人知识库雏形。 create_context_db: # Milvus Setup Arguments COLLECTION_NAME text_content_search DIMENSION 2048 MILVUS_HOST "localhost" MILVUS_PORT "19530"# Inference Arguments…...
岩土拉压试验机
岩土拉压试验机,专门用于检测黄土的在压缩、拉伸状态下的力学特性试验。主要由试验机主机、控制系统、控制软件三部分部分组成。 主要技术参数、配置如下: 主 要 技 术 指 标 及 参 数 最大试验力(kN) 5 试验精度等级 0.5级 …...
.Net HttpClient 使用准则
HttpClient 使用准则 System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应。 HttpClient 实例是应用于该实例执行的所有请求的设置集合,每个实例使用自身的连接池,该池将其请求与其他请求隔离开来。 从 .NET Core …...

【Canda】常用命令+虚拟环境创建到选择
目录 一、conda常用命令 二、conda 环境 2.1 创建虚拟环境 2.2 conda环境切换 2.3 查看conda环境 2.4 删除某个conda环境 2.5 克隆环境 三、依赖包管理 3.1 安装命令 3.2 更新包 3.3 卸载包 3.4 查看环境中所有包 3.5 查看某个包的版本信息 3.6 搜索包 四、环境…...
Lighthouse Core Web Vitals 指标详解与优化指南
vLighthouse Core Web Vitals 指标详解与优化指南 一、Core Web Vitals 概述 Google 在 2020 年推出的 Core Web Vitals(核心网页指标)是衡量用户体验质量的关键指标集合,现已成为搜索引擎排名的重要因素。Lighthouse 作为 Google 官方的网页质量评估工具,提供了对这些指…...
Qt进阶开发:QTcpServer的详解
文章目录 一、QTcpServer 简介二、常用成员函数的使用三、信号函数的使用四、虚函数的使用五、连接多客户端-服务端示例一、QTcpServer 简介 QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过…...
Leetcode 3544. Subtree Inversion Sum
Leetcode 3544. Subtree Inversion Sum 1. 解题思路2. 代码实现 题目链接:3544. Subtree Inversion Sum 1. 解题思路 这一题我的思路上就是一个动态规划的思路,因为原则上我们只需要遍历一下所有的状态即可,但是这样显然时间复杂度过高&am…...
物理:由基本粒子组成的个体能否提炼和重组?
个体差异源于基本粒子组合的复杂性与随机性,这一假设若成立,确实可能为生物医学带来革命性突破——但需要突破技术、理论与系统层级的多重壁垒。以下从科学逻辑与技术路径展开分析: 一、随机组合中的共性与稳定结构 1. 自然界的自组织规律 涌现性(Emergence):尽管粒子组…...
信息学奥赛一本通 1535:【例 1】数列操作
【题目链接】 ybt 1535:【例 1】数列操作 【题目考点】 1. 树状数组 【解题思路】 本题为树状数组模板题,维护区间和,进行单点修改,区间查询。 详细讲解见:洛谷 P3374 【模板】树状数组 1(树状数组解法…...

【登录认证】JWT令牌
一、概述 JWT全称:**JSON Web Token **(https://jwt.io/)定义了一种简洁的、自包含的格式,用于通信双方以json数据格式安全的传输信息。组成: ①第一部分:Header(头),记录令牌类型、签名算法等。例如: (“alg”:" HS256"," type":“…...
手撕算法(定制整理版2)
最长无重复子字符串 class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if not s:return 0max_len 0tp []for a in s:while a in tp:del tp[0]tp.append(a)if len(tp) > max_len:max_len len(…...

python3:文件与异常
本来这篇教程是打算在base python数据类型之后出的,但是计划赶不上变化,反正最后都要融会贯通,今日有时间、今天遇到了类似的问题,就今天做这一模块的整理,顺序不是重点。 参考我的上一篇博客:https://blo…...

【兽医电子处方软件】佳易王宠物医院电子处方管理系统:宠物医院诊所用什么软件?一键导入配方模板软件程序实操教程 #操作简单 #宠物医院软件下载安装
一、概述 软件试用版资源文件下载方法: 【进入头像主页第一篇文章最后 卡片按钮 可点击了解详细资料 或左上角本博客主页 右侧按钮了解具体资料信息】 本实例以 佳易王宠物医院电子处方管理系统软件 为例说明,其他版本可参考本实例。试用版软…...
centos7.x下,使用宝塔进行主从复制的原理和实践
操作原理: 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件(路径根据实际系统可能不同) vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID,主库设置为 1 log-bin mysql-bin …...
langchain学习
无门槛免费申请OpenAI ChatGPT API搭建自己的ChatGPT聊天工具 https://nuowa.net/872 基本概念 LangChain 能解决大模型的两个痛点,包括模型接口复杂、输入长度受限离不开自己精心设计的模块。根据LangChain 的最新文档,目前在 LangChain 中一共有六大…...
从“听不懂”到“能对话”,声网AI让语音交互不再难用
人们谁懂啊!做智能客服系统的真的被传统语音机器整怕了!以前那些基于规则的 IVR 系统,“卡顿感” 拉满还总答非所问,用户说啥都像在对牛弹琴。不能打断、没有上下文、流程死板到离谱,动不动就来句 “请再说一遍”&…...
VSCode设置SSH免密登录
引言 2025年05月13日20:21:14 原来一直用的PyCharn来完成代码在远程服务器上的运行,但是PyCharm时不时同步代码会有问题。因此,尝试用VSCode来完成代码SSH远程运行。由于VSCode每次进行SSH连接的时候都要手动输入密码,为了解决这个问题在本…...
Windows Java gRPC 示例
gRPC是一个开源高性能远程过程调用(RPC)框架,因为这个框架最早是由Goolge开发的,这里的g 代表的也即是Google。 关于gRPC更多的概念介绍可以参考: gRPC 基本介绍 本篇快速介绍在Windows环境下使用 Java 语言如何实现 gRPC 的服务端和客户端调用。 1. 环境准备 JDK 21Ma…...

问题及解决02-处理后的图像在坐标轴外显示
一、问题 在使用matlab的appdesigner工具来设计界面,可以通过点击处理按钮来处理图像,并将处理后的图像显示在坐标轴上,但是图像超出了指定的坐标轴,即处理后的图像在坐标轴外显示。 问题图如下图所示。 原来的坐标轴如下图所…...

EasyX开发——绘制跟随鼠标移动的小球
游戏主循环: #include<graphics.h>int main() {initgraph(1280, 720);while (true){}return 0; } peekmessage函数:如果成功拉取到了消息,函数就会返回true,反之就会返回false 使用另外一个循环来不断地从消息队列当中拉取…...

【Qt开发】信号与槽
目录 1,信号与槽的介绍 2,信号与槽的运用 3,自定义信号 1,信号与槽的介绍 在Qt框架中,信号与槽机制是一种用于对象间通信的强大工具。它是在Qt中实现事件处理和回调函数的主要方法。 信号:窗口中&#x…...
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)
APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)是一种基于供应链管理和约束理论的智能生产管理工具,旨在通过动态优化资源分配和生产流程,解决制造业中的复杂计划问题。以下是其核心要点解析&…...

使用聊天模型和提示模板构建一个简单的 LLM 应用程序
官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…...

探索 C++23 的 views::cartesian_product
文章目录 一、背景与动机二、基本概念与语法三、使用示例四、特点与优势五、性能与优化六、与 P2374R4 的关系七、编译器支持八、总结 C23 为我们带来了一系列令人兴奋的新特性,其中 views::cartesian_product 是一个非常实用且强大的功能,它允许我们轻…...