常微分方程建模R包ecode(一)——构建常微分方程系统

常微分方程在诸多研究领域中有着广泛应用,本文希望向大家介绍笔者于近期开发的R包ecode,该包采用简洁易懂的语法帮助大家在R环境中构建常微分方程,并便利地调用R图形接口,研究常微分方程系统的相速矢量场、平衡点、稳定点等解析性质,或进行数值模拟,进行敏感性分析等。

下载与安装

目前,ecode包只有测试版,并已挂载到了github平台上,详见HaoranPopEvo/ecode。安装步骤如下:

  1. 在网页中下载名为"ecode_0.0.0.9000.tar.gz"的压缩包。
  2. 在RStudio中单击“Tools > Install Packages…”,在弹出的对话框中选择Package Archive (.zip; .tar.gz),点击Browsing…按钮,在打开的文件浏览对话框中找到文件"ecode_0.0.0.9000.tar.gz",点击Install按钮,完成安装。

然后将ecode包载入到R环境中:

library(ecode)

构建模型

要构建一个常微分方程系统,首先要利用eode()函数。现考虑构建Lotka–Volterra竞争模型:
d x d t = ( r 1 − a 11 x − a 12 y ) x , ( 1 ) d y d t = ( r 2 − a 21 x − a 22 y ) y , ( 2 ) \frac{dx}{dt}=(r_1-a_{11}x-a_{12}y)x, \quad (1) \\ \frac{dy}{dt}=(r_2-a_{21}x-a_{22}y)y, \quad (2) dtdx=(r1a11xa12y)x,(1)dtdy=(r2a21xa22y)y,(2)
其中, x x x代表物种1的种群个体数, x x x代表物种2的种群个体数, r 1 , r 2 r_1, r_2 r1,r2为种群增长率, a 11 , a 12 , a 21 , a 22 a_{11},a_{12},a_{21},a_{22} a11,a12,a21,a22为两物种之间的竞争系数。

该模型中, x , y x,y x,y为模型变量, r 1 , r 2 , a 11 , a 12 , a 21 , a 22 r_1, r_2, a_{11},a_{12},a_{21},a_{22} r1,r2,a11,a12,a21,a22为模型参数。

要在ecode包中构建该模型,可以运行如下代码:

eq1 <- function(x, y, r1 = 4, a11 = 1, a12 = 2) (r1 - a11 * x - a12 * y) * x
eq2 <- function(x, y, r2 = 1, a21 = 2, a22 = 1) (r2 - a21 * x - a22 * y) * y
x <- eode(dxdt = eq1, dydt = eq2)
print(x)
### An ODE system: 2 equations
### equations:
###   dxdt = (r1 - a11 * x - a12 * y) * x 
###   dydt = (r2 - a21 * x - a22 * y) * y 
### variables: x y 
### parameters: r1 = 4, a11 = 1, a12 = 2, r2 = 1, a21 = 2, a22 = 1 
### constraints: x<1000 x>0 y<1000 y>0

其中,等式(1)被表示在R函数对象eq1中,等式(2)被表示在R函数对象eq2中。 x , y x,y x,y为模型变量,故函数eq1()eq2()的定义中,参数x, y都没有缺省值。 r 1 , r 2 , a 11 , a 12 , a 21 , a 22 r_1, r_2, a_{11},a_{12},a_{21},a_{22} r1,r2,a11,a12,a21,a22为模型参数,因此在函数eq1()eq2()的定义中,它们都被赋上了缺省值。本案例中,
r 1 = 4 , r 2 = 1 , a 11 = 1 , a 12 = 2 , a 21 = 2 , a 22 = 1 r_1=4,r_2=1, a_{11}=1, a_{12}=2,a_{21}=2, a_{22}=1 r1=4,r2=1,a11=1,a12=2,a21=2,a22=1

R语言中函数的语法
在R语言中,若需要自定义一个函数,其语法为:
fun <- function(x, y, a = 1, b = 2) { x = a + b + x; return(x + y) }
其中,fun为函数对象,function用于声明一个函数,()中的部分为函数头,{}中的内容为函数体。函数头被用于定义形式参数x, y, a, b,其中,形式参数x, y没有缺省值,形式参数a的缺省值为1,形式参数b的缺省值为2。函数体部分用于实施计算,并给出返回值。函数体中有多个语句时,可以分成多行来书写;当函数体只含有一行时,花括号{}可以省略不写。return()函数用于给出函数的返回值。当return()函数被省略时,函数的返回值为函数体中最后一个语句的计算结果。

定义好两个等式后,便可以通过eode()函数创建常微分方程系统。其语法为:

eode(dx1dt = eq1, dx2dt = eq2, ..., constraint = NULL)

其中,dx1dtdx2dt为等式的名称,eq1eq2是用于定义等式的函数对象。如果需要定义的常微分方程系统中不止有两个等式,可以在...部分继续添加其他变量。constraint变量用于定义模型变量的范围。若不指定constraint变量,则eode()函数会自动把所有模型变量的范围设置在(0, 1000)的范围内。例如,在上述代码中,调用print()函数打印x的值后,其输出内容含有:

### constraints: x<1000 x>0 y<1000 y>0

这表明,模型变量 x , y x, y x,y满足 0 < x < 1000 , 0 < y < 1000 0<x<1000, 0<y<1000 0<x<1000,0<y<1000。如果要限制 x , y x,y x,y在(0, 500)内,则可以使用:

x <- eode(dxdt = eq1, dydt = eq2, constraint = c("x<500", "y<500"))
x
### An ODE system: 2 equations
### equations:
###   dxdt = (r1 - a11 * x - a12 * y) * x 
###   dydt = (r2 - a21 * x - a22 * y) * y 
### variables: x y 
### parameters: r1 = 4, a11 = 1, a12 = 2, r2 = 1, a21 = 2, a22 = 1 
### constraints: x<500 x>0 y<500 y>0

如果要限制 x , y x,y x,y在[100, 500)内,则可以使用:

x <- eode(dxdt = eq1, dydt = eq2, constraint = c("x<500", "y<500", "x>=100", "y>=100"))
x
### An ODE system: 2 equations
### equations:
###   dxdt = (r1 - a11 * x - a12 * y) * x 
###   dydt = (r2 - a21 * x - a22 * y) * y 
### variables: x y 
### parameters: r1 = 4, a11 = 1, a12 = 2, r2 = 1, a21 = 2, a22 = 1 
### constraints: x<500 x>=100 y<500 y>=100

eode()函数的返回对象的类别是"eode"。这种类别的对象是ecode包中的核心对象。这种对象用于存放有关常微分方程系统的信息,并得以调用其他复杂的函数,来研究该常微分方程系统的性质。

class(x)
### [1] "eode"

相速矢量场

模型构建完成后,就可以简单地调用plot()函数,绘制模型的相速矢量场,

plot(x)

在这里插入图片描述
图中的横轴、纵轴分别代表模型变量 x , y x, y x,y的值,每个箭头代表系统在某一相点 ( x , y ) (x, y) (x,y)时的相速矢量。箭头的长短代表相速矢量的大小,箭头越长代表相速矢量的绝对值越大,即相点在该处的运动速度很快。箭头的方向代表相点在该处时的运动方向。该图表明,相点似乎无论如何都会沿着原点 ( 0 , 0 ) (0,0) (0,0)处运动。

修改模型变量的范围

我们可能需要进一步观察 x , y ∈ ( 0 , 2 ) x,y∈(0,2) x,y(0,2)时的相速矢量场。这时,我们可以通过eode_set_constraint()函数更改模型变量的限制条件:

x <- eode_set_constraint(x, c("x<2", "y<2"))
x
### An ODE system: 2 equations
### equations:
###   dxdt = (r1 - a11 * x - a12 * y) * x 
###   dydt = (r2 - a21 * x - a22 * y) * y 
### variables: x y 
### parameters: r1 = 4, a11 = 1, a12 = 2, r2 = 1, a21 = 2, a22 = 1 
### constraints: x<2 x>0 y<2 y>0

随后重新绘制系统的相速矢量场:
在这里插入图片描述
可以发现,当相点较小时(例如 ( x , y ) = ( 1 , 1 ) (x,y)=(1,1) (x,y)=(1,1)),相点并不会朝着 ( 0 , 0 ) (0,0) (0,0)点运动,而是沿着 x x x增大、 y y y减小的方向移动。

如何引用

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

原文见bioRxiv。

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

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

相关文章

AI面试官:LINQ和Lambda表达式(三)

AI面试官&#xff1a;LINQ和Lambda表达式&#xff08;三&#xff09; 当面试官面对C#中关于LINQ和Lambda表达式的面试题时&#xff0c;通常会涉及这两个主题的基本概念、用法、实际应用以及与其他相关技术的对比等。以下是一些可能的面试题目&#xff0c;附带简要解答和相关案…

视频内存过大如何压缩变小?这个压缩方法了解一下

在日常生活中&#xff0c;不管是日常随手拍的视频还是在工作中遇到的视频文件&#xff0c;在编辑处理的时候&#xff0c;如果视频的内存过大&#xff0c;不仅会占用很大的内存&#xff0c;在传送的时候也会花费很长时间&#xff0c;这时候将视频给压缩一下就可以很好的解决这一…

Feign远程调用如何携带form url

这是一个需要携带参数在form url上的请求&#xff0c;正常调用方式是这样的 响应&#xff1a; 在Feign中&#xff0c;应该怎么调用呢?? 定义OpenFeignClient接口 FeignClient(value "client-service", url "http://127.0.0.1/api") public interface…

代理模式来啦

一、代理模式 代理模式是我们工作中比较常用的设计模式之一了&#xff0c;主要用于隐藏具体实现类的实现细节或者对实现类的行为进行增强&#xff0c;即对具体实现的前后做些特殊逻辑。 既然说是代理&#xff0c;那就要对客户端隐藏真实实现&#xff0c;由代理来负责客户端的所…

Unity游戏源码分享-3d机器人推箱子游戏

Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏 工程地址&#xff1a;https://download.csdn.net/download/Highning0007/88098014

STM32CUBEMX配置 定时器中断 和 上升沿中断(实现检测1s以内的脉冲个数)

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

Redis简介、常用命令

目录 一、​​关系数据库​​与非关系型数据库概述 1.1 关系型数据库 1.2 非关系型数据库 二、关系数据库与非关系型数据库区别 2.1 数据存储方式不同 2.2 扩展方式不同 2.3 对事务性的支持不同 三、非关系型数据库产生背景 四、Redis简介 4.1 Redis的单线程模式 4.…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

网络超时导致namenode被kill的定位

交换机升级导致部分网络通信超时, 集群的namenode主从切换后,主namenode进程被杀死。 网络问题导致namenode与zk间的连接超时触发了hadoop集群的防脑裂机制而主动kill掉了超时的namenode进程。 日志分析发现zk和namenode之间的网络连接超时: 超时触发了namenode切换,并将超时…

linux 无桌面运行 GUI 程序(electron、arm)

操作 开发板事先连接好屏幕&#xff0c;并用串口连接开发板 apt install xorg dpkg-reconfigure x11-common # 允许任何用户连接到X11服务器 startx # 会在屏幕启动一个命令行终端将键盘连接到开发板&#xff0c;并在开发板上执行命令运行 GUI 应用即可 ./your_program如果是…

ES6基础知识七:你是怎么理解ES6中 Generator的?使用场景?

一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段&#xff1a; 回调函数promise 那么&#xff0c;上文我们提到promsie已经是一种比较流行的解决异步方案&#xff0c;那么为什么还出现Gen…

Flutter中如何取消任务

前言 在开发过程中&#xff0c;取消需求是很常见的&#xff0c;但很容易被忽略。然而&#xff0c;取消需求的好处也很大。例如&#xff0c;在页面中会发送很多请求。如果页面被切走并处于不可见状态&#xff0c;就需要取消未完成的请求任务。如果未及时取消&#xff0c;则可能…

linux系统more基本命令python源码分享

此贴python源码是linux系统more基本命令的实现。 实现linux中more的基本功能&#xff0c;当more后加一个文件名参数时候&#xff0c;分屏显示按空格换页&#xff0c;按回车换行,在左下角显示百分比&#xff1b; 以处理管道参数的输入&#xff0c;处理选项num:从指定行开始显示&…

crawlab爬虫python篇(保姆级图文教程)

文章目录 前言一、创建项目二、创建爬虫1.新建项目2.新建爬虫3. 上传文件总结资料解决方案记录前言 一个python刚到门槛水平的程序员是如何使用crawlab爬取网站,在这里做个图文教程记录下。 提示:这里做一个简单的网站爬取完整示例图文教程 一、创建项目 首先,我们将创建一…

Android平台GB28181设备接入模块之按需编码和双码流编码

技术背景 我们在做执法记录仪或指挥系统的时候&#xff0c;会遇到这样的情况&#xff0c;大多场景下&#xff0c;我们是不需要把设备端的数据&#xff0c;实时传给国标平台端的&#xff0c;默认只需要本地录像留底&#xff0c;如果指挥中心需要查看前端设备实时数据的时候&…

Python实现九宫格数独小游戏

1 问题 有1-9个数字&#xff0c;将他们填入一个3*3的九宫格中&#xff0c;使得他们的每行&#xff0c;每列&#xff0c;以及对角线上的和相等&#xff0c;且要求每个格子的数字不可以重复。使用python列出所有可能的组合。示例如下: 2 方法 每行&#xff0c;列&#xff0c;对角…

临时文档4

Redis有哪些数据类型 Redis主要有5种数据类型&#xff0c;包括String&#xff0c;List&#xff0c;Set&#xff0c;Zset&#xff0c;Hash&#xff0c;满足大部分的使用要求 Redis的应用场景 总结一 计数器 可以对 String 进行自增自减运算&#xff0c;从而实现计数器功能。…

uni-app优雅的实现时间戳转换日期格式

现在显示的格式如下图&#xff1a; 我期望统一格式&#xff0c;所以不妨前端处理一下&#xff0c;核心代码如下 filters: {// 时间戳处理formatDate: function(value, spe /) {value value * 1000let data new Date(value);let year data.getFullYear();let month data.…

API简意

API&#xff08;Application Programming Interface&#xff09;即应用程序接口&#xff0c;是一组定义的规则和协议&#xff0c;用于不同软件之间的交互和通信。它定义了软件组件之间如何相互访问和使用&#xff0c;简化了开发者的工作&#xff0c;提高了系统的可扩展性和灵活…

ubuntu上安装firefox geckodriver 实现爬虫

缘由&#xff1a;当时在windows 上运行chrom 的时候 发现要找到 浏览器和 webdirver 相匹配的 版本比较麻烦&#xff0c;当时搞了大半天才找到并安装好。 这次在ubuntu上尝试用firefox 实现爬虫 文章分为三个部分&#xff1a; 环境搭建浏览器弹窗输入用户名&#xff0c;密码的…