常微分方程建模R包ecode(二)——绘制相速矢量场

本节中我们考虑一个更为复杂的常微分方程模型,
d X C d t = ν ( X A + Y A ) − β ⋅ X C ⋅ ( Y C + Y A ) − ( μ + g ) ⋅ X C , ( 1 ) d Y C d t = β ⋅ X C ⋅ ( Y C + Y A ) − ( μ + g + ρ ) ⋅ Y C , ( 2 ) d X A d t = g ⋅ X C − β ⋅ X A ⋅ ( Y C + Y A ) , ( 3 ) d Y A d t = β ⋅ X A ∗ ( Y C + Y A ) + g ∗ Y C − ρ ∗ Y A ( 4 ) \frac{dX_C}{dt} = \nu (X_A + Y_A) - \beta · X_C · (Y_C + Y_A) - (\mu + g) · X_C, \quad(1) \\ \frac{dY_C}{dt} = \beta · X_C · (Y_C + Y_A) - (\mu + g + \rho) · Y_C, \quad(2)\\ \frac{dX_A}{dt} = g · X_C - \beta · X_A · (Y_C + Y_A), \quad (3) \\ \frac{dY_A}{dt} = \beta · X_A * (Y_C + Y_A) + g * Y_C - \rho * Y_A \quad(4) dtdXC=ν(XA+YA)βXC(YC+YA)(μ+g)XC,(1)dtdYC=βXC(YC+YA)(μ+g+ρ)YC,(2)dtdXA=gXCβXA(YC+YA),(3)dtdYA=βXA(YC+YA)+gYCρYA(4)
该常微分方程系统用于模拟一种树木传染病动态,其中 X C X_C XC代表易感树苗(susceptible sapling)的个体数, Y C Y_C YC代表感病树苗(infected sapling)的个体数, X A X_A XA代表易感成年树木的个体数(susceptible adult), Y A Y_A YA代表感病成年树木(infected adult)的个体数。显然 X C , Y C , X A , Y A ≥ 0 X_C,Y_C,X_A,Y_A≥0 XC,YC,XA,YA0

( 1 ) (1) (1)式中, ν ( X A + Y A ) \nu (X_A + Y_A) ν(XA+YA)代表繁殖产生新树苗的速率,其中 ν \nu ν是繁殖速率。 − β ⋅ X C ⋅ ( Y C + Y A ) -\beta · X_C · (Y_C + Y_A) βXC(YC+YA)指的是由于疾病传染,导致易感树苗转化为感病树苗的速率,其中 β \beta β为传染率。 − ( μ + g ) ⋅ X C , - (\mu + g) · X_C, (μ+g)XC,是指由于自然死亡及树木成长,导致易感树苗被移除,或是进入到易感成年树木的速率,其中 μ \mu μ为自然死亡率, g g g为树木生长率。

( 2 ) (2) (2)式中, β ⋅ X C ⋅ ( Y C + Y A ) \beta · X_C · (Y_C + Y_A) βXC(YC+YA)代表由易感树苗被传染而转化为感病树苗的速率, − ( μ + g + ρ ) ⋅ Y C - (\mu + g + \rho) · Y_C (μ+g+ρ)YC则包含自然死亡、树木成长、因疾病感染而死亡这三个过程,其中 ρ \rho ρ代表由于传染病而导致的死亡率。

( 3 ) (3) (3)式中, g ⋅ X C g · X_C gXC代表由于树木生长而使易感树苗转换为易感成年树木的速率, − β ⋅ X A ⋅ ( Y C + Y A ) - \beta · X_A · (Y_C + Y_A) βXA(YC+YA)代表由于疾病传染,使易感成年大树转换为感病成年大树的速率。

( 4 ) (4) (4)式中, β ⋅ X A ∗ ( Y C + Y A ) \beta · X_A * (Y_C + Y_A) βXA(YC+YA)对应于疾病传染过程, g ∗ Y C g * Y_C gYC对应于树木生长过程, − ρ ∗ Y A -\rho * Y_A ρYA对应于疾病导致的死亡过程。

研究一个常微分方程系统,最为直接的方法是研究其相速矢量场(phase velocity vector filed)。下面我们回顾一下与相速矢量场相关的几个重要概念,

常微分方程中的几个重要概念
相空间(phase space):是指所有模型变量的所有可能取值的组合构成的空间。在本节案例中,相空间为 { ( X C , Y C , X A , Y A ) ∣ X C , Y C , X A , Y A ≥ 0 } \{(X_C,Y_C,X_A,Y_A)| X_C,Y_C,X_A,Y_A≥0\} {(XC,YC,XA,YA)XC,YC,XA,YA0}
相点(phase point):相空间中的任意一个点称为相点。相点用于描述系统的状态。在本节案例中,相点 ( X C , Y C , X A , Y A ) = ( 10 , 60 , 20 , 100 ) (X_C,Y_C,X_A,Y_A)=(10,60,20,100) (XC,YC,XA,YA)=(10,60,20,100)代表系统中有10棵易感树苗、60棵感病树苗、20棵易感成树、100棵感病成树。
相速矢量(phase velocity vector):系统位于某一相点时,其速度大小和方向构成的矢量,叫做该相点所对应的相速矢量。在本节案例中,针对相点 ( X C , Y C , X A , Y A ) = ( 10 , 60 , 20 , 100 ) (X_C,Y_C,X_A,Y_A)=(10,60,20,100) (XC,YC,XA,YA)=(10,60,20,100),将 X C , Y C , X A , Y A X_C,Y_C,X_A,Y_A XC,YC,XA,YA的值代入式 ( 1 − 4 ) (1-4) (14),求出 ( d X C d t , d Y C d t , d X A d t , d Y A d t ) (\frac{dX_C}{dt}, \frac{dY_C}{dt} , \frac{dX_A}{dt} , \frac{dY_A}{dt}) (dtdXC,dtdYC,dtdXA,dtdYA),其值便是该相点所对应的相速矢量。相速矢量描述了系统位于某一相点时的运动方向和快慢。
相速矢量场(phase velocity vector field):相空间中所有相速矢量组成的集合。
相位曲线(phase curve):相点沿相速矢量场移动所形成的运动轨迹。

ecode包中,当函数plot作用于eode类的对象时,plot函数会自动绘制出某个常微分方程系统的相速矢量场,或相速矢量。在上一节中,我们介绍了当常微分方程系统中含有两个模型变量时,plot函数的用法。

本节所关注的模型含有四个模型变量 X C , Y C , X A , Y A X_C,Y_C,X_A,Y_A XC,YC,XA,YA,因而将介绍含有多个模型变量时,plot函数的行为。

一、绘制相速矢量场

首先我们在ecode包中构建上述模型(式 ( 1 − 4 ) (1-4) (14)):

library(ecode)dX_Cdt <- function(X_C, Y_C, X_A, Y_A, nu = 0.15, beta = 0.1, mu = 0.15, g = 0.04)nu * (X_A + Y_A) - beta * X_C * (Y_C + Y_A) - (mu + g) * X_CdY_Cdt <- function(X_C, Y_C, Y_A, beta = 0.1, mu = 0.15, g = 0.04, rho = 0.2)beta * X_C * (Y_C + Y_A) - (mu + g + rho) * Y_CdX_Adt <- function(X_C, Y_C, X_A, Y_A, beta = 0.1, g = 0.04)g * X_C - beta * X_A * (Y_C + Y_A)dY_Adt <- function(X_A, Y_C, Y_A, beta = 0.1, g = 0.04, rho = 0.2)beta * X_A * (Y_C + Y_A) + g * Y_C - rho * Y_Ax <- eode(dX_Cdt = dX_Cdt, dY_Cdt = dY_Cdt, dX_Adt = dX_Adt, dY_Adt = dY_Adt)
x
### An ODE system: 4 equations
### equations:
###   dX_Cdt = nu * (X_A + Y_A) - beta * X_C * (Y_C + Y_A) - (mu + g) * X_C 
###   dY_Cdt = beta * X_C * (Y_C + Y_A) - (mu + g + rho) * Y_C 
###   dX_Adt = g * X_C - beta * X_A * (Y_C + Y_A) 
###   dY_Adt = beta * X_A * (Y_C + Y_A) + g * Y_C - rho * Y_A 
### variables: X_C Y_C X_A Y_A 
### parameters: nu = 0.15, beta = 0.1, mu = 0.15, g = 0.04, rho = 0.2 
### constraints: X_A<1000 X_A>0 X_C<1000 X_C>0 Y_A<1000 Y_A>0 Y_C<1000 Y_C>0

由于我们没有在模型中指定模型变量的范围,ecode包自动将变量范围设置在 ( 0 , 1000 ) (0,1000) (0,1000)内。此时调用plot函数,

plot(x)
### Set X_A = 500, Y_A = 500 for mapping in two axis

在这里插入图片描述
输出结果如图所示。plot函数自动限制了 X A = 500 , Y A = 500 X_A = 500, Y_A = 500 XA=500,YA=500,并以 X C , Y C X_C, Y_C XC,YC为横、纵坐标系绘制相速矢量场。需要注意的是,该相速矢量图仅仅表示 X A , Y A X_A,Y_A XA,YA为固定值时的相速矢量场,该矢量场位于相空间内部的一个平面。

当常微分方程组含有多个模型变量时,如果不给plot任何参数,则plot函数默认会以常微分方程中前两个变量为坐标轴绘制相速矢量场,而其余变量将会被赋上一个固定值,其值等于该模型变量范围的中值。

二、自定义模型变量的值

如果不希望以 X A = 500 , Y A = 500 X_A = 500, Y_A = 500 XA=500,YA=500为限制条件,则可以在plot函数中添加set_covar参数,

plot(x, set_covar = list(X_A = 10, Y_A = 20))

在这里插入图片描述此时,plot函数给出的是 X A = 10 , Y A = 20 X_A=10, Y_A=20 XA=10,YA=20株时,以 X C , Y C X_C,Y_C XC,YC为坐标轴作出的相速矢量场。

如果想要固定 X C , Y C X_C, Y_C XC,YC,以 X A , Y A X_A, Y_A XA,YA为坐标轴作相速矢量场,则

plot(x, set_covar = list(X_C = 10, Y_C = 20))

在这里插入图片描述
此为 X C = 10 , Y C = 20 X_C=10, Y_C=20 XC=10,YC=20时,以 X A , Y A X_A, Y_A XA,YA为坐标轴的相速矢量场。

三、自定义模型变量的范围

上一节中已经提到,可以采用eode_set_constraint重新设置模型变量的范围。例如,以下代码将 X C , Y C , X A , Y A X_C, Y_C, X_A, Y_A XC,YC,XA,YA的范围位置为 ( 0 , 5 ) (0,5) (0,5)

x <- eode_set_constraint(x, new_constraint = c("X_C<5","Y_C<5","X_A<5","Y_A<5"))
x
### An ODE system: 4 equations
### equations:
###   dX_Cdt = nu * (X_A + Y_A) - beta * X_C * (Y_C + Y_A) - (mu + g) * X_C 
###   dY_Cdt = beta * X_C * (Y_C + Y_A) - (mu + g + rho) * Y_C 
###   dX_Adt = g * X_C - beta * X_A * (Y_C + Y_A) 
###   dY_Adt = beta * X_A * (Y_C + Y_A) + g * Y_C - rho * Y_A 
### variables: X_C Y_C X_A Y_A 
### parameters: nu = 0.15, beta = 0.1, mu = 0.15, g = 0.04, rho = 0.2 
### constraints: X_A<5 X_A>0 X_C<5 X_C>0 Y_A<5 Y_A>0 Y_C<5 Y_C>0

接下来,我们尝试固定 X A = 2 , Y A = 2 X_A = 2, Y_A = 2 XA=2,YA=2,以 X C , Y C X_C, Y_C XC,YC为坐标轴,绘制相速矢量场,

plot(x, set_covar = list(X_A = 2, Y_A = 2))

在这里插入图片描述
可以看到,该常微分方程组似乎在 X C , Y C X_C, Y_C XC,YC的值很小时存在使 d X C / d t , d Y C / d t = 0 dX_C/dt, dY_C/dt=0 dXC/dt,dYC/dt=0的点。

四、一维相速矢量场

如果一个常微分方程只有一个模型变量,或者在含有 n n n个模型变量的常微分方程组中,有 ( n − 1 ) (n-1) (n1)个变量的值都被固定了,那么plot函数就会绘制一维的相速矢量场。

现在我们尝试固定 X A = 2 , Y A = 2 , X C = 2 X_A = 2, Y_A = 2, X_C = 2 XA=2,YA=2,XC=2。这样,只剩下模型变量 X A X_A XA的值没有被固定。plot函数将以 X A X_A XA为唯一的坐标轴,绘制一维的相速矢量场,

plot(x, set_covar = list(X_A = 2, Y_A = 2, X_C = 2))

在这里插入图片描述
其中,每个相速矢量的值代表的是 d Y C / d t dY_C/dt dYC/dt在某一相点的对应值。

五、相速矢量

当所有模型变量都被赋值时,plot函数将会作出某一相点所对应的相速矢量。在相空间中,相速矢量的起点在其对应的相点,长度代表相点在相点在该处运动的速率。例如,在本节案例中,位于相点 ( X C 0 , Y C 0 , X A 0 , Y A 0 ) (X_{C0},Y_{C0},X_{A0},Y_{A0}) (XC0,YC0,XA0,YA0)的相速矢量的值为,
( d X C / d t , d Y A / d t , d X A / d t , d Y A / d t ) ∣ X C = X C 0 , Y C = Y C 0 , X A = X A 0 , Y A = Y A 0 (dX_C/dt,dY_A/dt,dX_A/dt,dY_A/dt)|_{X_{C}=X_{C0}, Y_{C}=Y_{C0}, X_{A}=X_{A0}, Y_{A}=Y_{A0}} (dXC/dt,dYA/dt,dXA/dt,dYA/dt)XC=XC0,YC=YC0,XA=XA0,YA=YA0
调用plot时,plot函数会画出相速矢量在各个维度上的值,

plot(x, set_covar = list(X_A = 2, Y_A = 2, X_C = 2, Y_C = 2))

在这里插入图片描述
该图给出了相点 ( 2 , 2 , 2 , 2 ) (2,2,2,2) (2,2,2,2)所对应的相速矢量,其中横坐标的每一个标签代表相速矢量在某一维度上的分解值,即 d X C / d t ∣ X C = 2 , d Y C / d t ∣ Y C = 2 , d X A / d t ∣ X A = 2 , d Y A / d t ∣ Y A = 2 dX_C/dt|_{X_C=2}, dY_C/dt|_{Y_C=2}, dX_A/dt|_{X_A=2}, dY_A/dt|_{Y_A=2} dXC/dtXC=2,dYC/dtYC=2,dXA/dtXA=2,dYA/dtYA=2

如何引用

Wu, H. (2023). ecode: An R package to investigate community dynamics in ordinary differential equation systems. bioRxiv, 2023-06.

原文见bioRxiv。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/76857.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…

selenium官网文档阅读总结(day 2)

1.selenium元素定位方法 1.1selenium命令 当我们使用chormdriver打开网页后&#xff0c;接下来就要用python操作元素&#xff0c;模拟用户会作出的操作&#xff0c;这些操作元素的方法就是命令。比如 (1) click&#xff1a;点击&#xff08;按钮&#xff0c;单选框&#xff…

【Java】UWB高精度工业人员安全定位系统源码

基于VueSpring boot前后端分离架构开发的一套UWB技术高精度定位系统源码。 UWB高精度人员定位系统提供实时定位、电子围栏、轨迹回放等基础功能以及各种拓展功能,用户可根据实际需要任意选择搭配拓展功能。该系统简易部署&#xff0c;方便使用&#xff0c;实时响应。UWB高精度定…

skywalking全链路追踪

文章目录 一、介绍二、全链路追踪1. 测试1 - 正常请求2. 测试2 - 异常请求 三、过滤非业务请求链路1. 链路忽略插件2. 配置3. 测试 一、介绍 在上一篇文章skywalking安装教程中我们介绍了skywalking的作用以及如何将其集成到我们的微服务项目中。本篇文章我们介绍在微服务架构…

张量Tensor 深度学习

1 张量的定义 张量tensor理论是数学的一个分支学科&#xff0c;在力学中有重要的应用。张量这一术语源于力学&#xff0c;最初是用来表示弹性介质中各点应力状态的&#xff0c;后来张量理论发展成为力学和物理学的一个有力数学工具。 张量&#xff08;Tensor&#xff09;是一个…

基于总线加锁和缓存锁(CPU实现原子操作的两种方式)

总线锁 总线锁就是使用处理器提供的一个LOCK#信号&#xff0c;当一个处理器在总线上输出此信号时&#xff0c;其他处理器的请求将被阻塞住&#xff0c;那么该处理器可以独占共享内存。 CPU和内存之间的通信被锁&#xff01;&#xff01; 如果多个处理器同时对共享变量进行读写…

解决一个Sqoop抽数慢的问题,yarn的ATSv2嵌入式HBASE崩溃引起

新搭建的一个Hadoop环境&#xff0c;用Sqoop批量抽数的时候发现特别慢&#xff0c;我们正常情况下是一个表一分钟左右&#xff0c;批量抽十几个表&#xff0c;也就是10分钟的样子&#xff0c;结果发现用了2个小时&#xff1a; 查看yarn日志 发现有如下情况&#xff1a; 主要有两…

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()&#xff1f;HashSet通过反序列化间接执行equals()方法如何使hash相等&#xff1f; 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值&#xff1f; 【java安全】…

C++二叉搜索树剖析

目录 &#x1f347;二叉搜索树概念&#x1f348;二叉搜索树查找&#x1f349;二叉搜索树的插入&#x1f34a;二叉搜索树的删除&#x1f34d;二叉搜索树的查找、插入、删除实现&#x1f34b;二叉搜索树的应用&#x1f96d;二叉搜索树的性能分析&#x1f353;总结 &#x1f347;二…

爬虫教程1_Xpath 入门教程

Xpath 入门教程 在编写爬虫程序的过程中提取信息是非常重要的环节&#xff0c;但是有时使用正则表达式无法匹配到想要的信息&#xff0c;或者书写起来非常麻烦&#xff0c;此时就需要用另外一种数据解析方法&#xff0c;也就是本节要介绍的 Xpath 表达式。 Xpath表达式 XPath…

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

【Linux 网络】 传输层协议之TCP协议 TCP的三次握手和四次挥手

TCP协议 TCP协议段格式谈谈什么是 “可靠” 和 “不可靠”TCP协议段——序号与确认序号TCP协议段——窗口大小TCP协议段 —— 六个标志位确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制TCP 的三次握手四次挥手TCP三次握手四次挥手总结图 滑动窗口流量控制拥…

【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka&#xff1f;二、为什么要有服务注册发现中心&#xff1f;三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

Node.js之express框架学习心得

Node.js&#xff1a;颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时&#xff0c;它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求&#xff0c;通过单线程和异步机制&#xff0c;实现高效的并发处理。这意味着在Node.js中…

【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天来填一个埋了好久的坑&#xff0c;在暑假之前就预告过这个系列&#xff0c;但由于各种原因&#xff08;主要是有点懒&#xff09;今天才开坑。我们这个系列主要是…

1310. 数三角形

题目链接&#xff1a;https://www.acwing.com/problem/content/1312/ 首先不考虑三点共线的情况一共有 种&#xff0c;现在来计算三点共线的情况 1.三点在一条直线上 2.三点在一条竖线上 3.三点在一条斜线上&#xff0c;正反斜线对称&#xff0c;仅需考虑一边的情况 如果…

视频汇聚平台EasyCVR视频广场侧边栏支持拖拽

为了提升用户体验以及让平台的操作更加符合用户使用习惯&#xff0c;我们在EasyCVR v3.3版本中&#xff0c;支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序&#xff0c;并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…

服务器运行python程序的使用说明

服务器的使用与说明 文章目录 服务器的使用与说明1.登录2.Python的使用2.1 服务器已安装python32.2 往自己的用户目录安装python31.首先下载安装包2.解压缩3.编译与安装 2.3 新建环境变量2.4 测试 3 创建PBS作业并提交 1.登录 windowsr打开运行命令窗口&#xff0c;在运行框中…

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

前言&#xff1a;在最近的实际开发的过程中&#xff0c;遇到了在多数据源的情况下要保证原子性的问题&#xff0c;这个问题当时遇到了也是思考了一段时间&#xff0c;后来通过搜集大量资料与学习&#xff0c;最后是采用了分布式事务来解决这个问题&#xff0c;在讲解之前&#…