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

news2024/11/28 8:34:37

常微分方程在诸多研究领域中有着广泛应用,本文希望向大家介绍笔者于近期开发的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.coloradmin.cn/o/779916.html

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

相关文章

基于linux下的高并发服务器开发(第二章)- 2.20 kill、raise、abort函数

03 / 信号的5种默认处理动作 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”&#…

X86设备启动过程

文章目录 一、电源自检二、BIOS自检三、引导设备选择四、主引导记录4.1 0x7c0 五、加载操作系统 x86计算机启动过程&#xff0c;主要分为这几个阶段&#xff1a;电源自检、BIOS自检、引导设备的选择、主引导记录、加载操作系统。 一、电源自检 当我们按下开关键后&#xff0c;…

消息队列总结(3)- RabbitMQ Kafka RocketMQ高可用方案

目录 1. 什么是高可用&#xff1f; 1.1 常见的高可用方法 1.2 消息队列的高可用 2. RabbitMQ的高可用方案 2.1 镜像队列 2.2 消息生产的确认机制 2.3 消息的持久化 3. Kafka的高可用方案 3.1 消息备份 3.2 ISR & IEO & HW 3.3 消息生产的确认机制 4. Rocke…

在虚拟机中安装anaconda和pytorch

首先我用的是VMware&#xff0c;ubuntu16.04. 首先建议安装anaconda,登录官网Free Download | Anaconda 下载完成后&#xff0c;来到安装文件目录处&#xff0c;打开终端&#xff0c; 然后在终端输入bash <anaconda文件名> 然后就一直enter和yes到底&#xff0c;直到安…

【后端面经】微服务构架 (1-3) | 熔断:熔断-恢复-熔断-恢复,抖来抖去怎么办?

文章目录 一、前置知识1、什么是熔断?2、什么是限流?3、什么是降级?4、怎么判断微服务出现了问题?A、指标有哪些?B、阈值如何选择?C、超过阈值之后,要不要持续一段时间才触发熔断?5、服务恢复正常二、面试环节1、面试准备2、面试基本思路三、总结 在微服务构架中…

【OC总结 面向对象 + 内存管理 + runtime】

文章目录 前言面向对象1.1 一个NSObject对象占用多少内存&#xff1f;1.2 iOS的继承链 & 对象的指针指向了哪里&#xff1f;1.3 OC的类的信息存放在哪里&#xff1f;-isa指针1.4 isMemberOfClass & isKindOfClass Runtime1.4 讲一下OC的消息机制1.5 消息转发机制流程1.…

React 中 {} 的应用

列表渲染&#xff1a; 1.使用数组的 map 方法&#xff08;因为map 可以映射&#xff09; 2、列表要添加 key 属性&#xff0c;值要唯一 // 导入 // 用来获取 dom元素 import { createRoot } from "react-dom/client";// 内容 const contentArr [{ id: 1, name: &…

Spring Cloud【分布式配置中心(Spring Cloud Config 、Config配置总控中心搭建、Config配置读取规则)】(九)

目录 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 分布式配置中心_Spring Cloud Config 分布式配置中心_Config配置总控中心搭建 分布式配置中心_Config配置读取规则 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 配置跳过验证路由 org:my:jwt…

C++笔记之函数对象functors与可调用对象

C笔记之函数对象functors与可调用对象 code review! 文章目录 C笔记之函数对象functors与可调用对象0.函数对象&#xff08;Function Objects&#xff09;&#xff0c;也称为functors1.函数对象与可调用对象的关系2.可调用对象几种形式2.1. 使用函数对象2.2. 使用普通函数指针…

Linux 打包Qt程序到无Qt环境Linux系统下运行,问题记录

Linux 环境下Qt开发的摄像头程序用到了opencv的库&#xff0c;需要跟Qt环境一起打包。 1.打包所有关联库用的是脚本程序。 #!/bin/bashLibDir$PWD"/lib" Target$1lib_array($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))$(m…

谈谈跨域?!

1.什么是跨域 跨域是一个网页脚本访问另外一个网页的内容&#xff0c;如果这两个网页的协议、端口&#xff0c;域名有一个不同就会产生跨域问题&#xff0c;浏览器具有一个同源策略&#xff0c;是一个安全策略&#xff0c;为了避免被恶意修改数据或者操作dom。 2.如何解决跨域…

为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、Spring是什么&#xff1f; 二、为什么要学习框架&#xff1f; 三、Spring核心概念 3.1 什么是容器&#xff1f; 3.2 什么是IOC&#xff1f; 四、再谈Spring中的 IOC 五…

高阶SQL语句

创建一个表一、按关键字排序1.1 单字段排序1.1.1 按分数排序&#xff0c;默认不指定是升序排列1.1.2 分数按降序排列1.1.3 结合where进行条件过滤&#xff0c;筛选地址是nanjing的学生按分数升序排列 1.2 多字段排序1.2.1 查询学生信息先按兴趣id降序排列&#xff0c;相同分数的…

C# List 详解三

目录 11.Equals(Object) 12.Exists(Predicate) 13.Find(Predicate) 14.FindAll(Predicate) 15.FindIndex(Int32, Int32, Predicate) 16.FindIndex(Int32, Predicate) 17.FindIndex(Predicate) C# List 详解一 1.Add(T)&#xff0c;2.AddRa…

信息管理系统---Servlet+javaBean+Druid+DButil

这里是学习了Servlet后结合数据库进行增删查改–登录等作为练手项目非常适合 准备工作&#xff1a; 1.数据准备 这张表是用户表&#xff0c;用于登录 CREATE TABLE users (id int NOT NULL AUTO_INCREMENT,username varchar(25) DEFAULT NULL,password varchar(20) DEFAULT…

【C++基础(四)】内联函数和auto关键字

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 内联函数 1. 前言2. 内联函数概念3. 内联函数的特性…

数字IC实践项目(7)—CNN加速器的设计和实现(付费项目)

数字IC实践项目&#xff08;7&#xff09;—基于Verilog的CNN加速器&#xff08;付费项目&#xff09; 写在前面的话项目整体框图神经网络框图完整电路框图 项目简介和学习目的软件环境要求 资源占用&板载功耗总结 写在前面的话 项目介绍&#xff1a; 卷积神经网络硬件加速…

基于深度学习的高精度六类海船检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度六类海船检测识别系统可用于日常生活中检测与定位海船目标&#xff08;散装货船&#xff08;bulk cargo carrier&#xff09;、集装箱船&#xff08;container ship&#xff09;、渔船&#xff08;fishing boat&#xff09;、普通货船&…

[golang gin框架] 41.Gin商城项目-微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)

上一节抽离了captcha验证码功能,集成了验证码微服务功能,这一节来看看后台Rbac功能,并抽离其中的用户登录,管理员管理,角色管理,权限管理等功能作为微服务来调用 一.引入 后台操作从登录到后台首页,然后其中的管理员管理,角色管理,权限管理等功能可以抽离出来作为 一个Rbac微服…

视频画面尺寸怎么裁剪?裁剪视频画面方法分享

如果我们的视频将在不同的平台或设备上播放&#xff0c;而这些设备具有不同的屏幕比例&#xff08;如16:9、4:3、1:1等&#xff09;&#xff0c;则可能需要裁剪来适应目标屏幕。这样观看起来会体验效果更佳&#xff0c;但是该怎么裁剪视频的画面呢&#xff1f;给大家分享几种裁…