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

这篇具有很好参考价值的文章主要介绍了常微分方程建模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)

常微分方程建模R包ecode(一)——构建常微分方程系统,r语言,开发语言,数学建模,算法
图中的横轴、纵轴分别代表模型变量 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

随后重新绘制系统的相速矢量场:
常微分方程建模R包ecode(一)——构建常微分方程系统,r语言,开发语言,数学建模,算法
可以发现,当相点较小时(例如 ( 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。文章来源地址https://www.toymoban.com/news/detail-604493.html

到了这里,关于常微分方程建模R包ecode(一)——构建常微分方程系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数学建模笔记(六):常微分方程及其应用

    前为数学摆方程,后为拉普拉斯方程 要确定每次积分后 C C C 的值 利用MATLAB求解 当 t t t 趋于正无穷大时, x ( t ) x(t) x ( t ) 趋于 x 0 x_0 x 0 ​ 使用泰勒展开,方程二为线性更易求解,使用变量分离法求解 预测长时间后的情况 效益最大点小于 r 2 frac{r}{2} 2 r ​ 拿 E s 1 E_{s1} E

    2024年02月02日
    浏览(33)
  • 【数学建模】《实战数学建模:例题与讲解》第五讲-微分方程建模(含Matlab代码)

    如果这篇文章对你有帮助,欢迎点赞与收藏~ 微分方程建模是数学建模中一种极其重要的方法,它在解决众多实际问题时发挥着关键作用。这些实际问题的数学表述通常会导致求解特定的微分方程。将各种实际问题转换为微分方程的定解问题主要包括以下几个步骤: 确定研究

    2024年03月18日
    浏览(57)
  • Python小白的数学建模课-11.偏微分方程数值解法

    偏微分方程可以描述各种自然和工程现象, 是构建科学、工程学和其他领域的数学模型主要手段。 偏微分方程主要有三类:椭圆方程,抛物方程和双曲方程。 本文采用有限差分法求解偏微分方程,通过案例讲解一维平流方程、一维热传导方程、二维双曲方程、二维抛物方程

    2024年02月14日
    浏览(43)
  • 美赛BOOM数学建模4-2微分方程传染病预测模型

    注明:本文根据数学建模BOOM网课简单整理,自用 ❑从最简单的指数传播模型说起 • 不同类型传染病的发病机理和传播途径各有特点 • 有的传染病,在得过一次后可获得 免疫力 ,但有的则不会 • 有的传染病具有 潜伏期 ,有的则没有 • 需要对不同类型的传染病建立相应

    2024年02月08日
    浏览(36)
  • 【数学建模\MATLAB】掌握用Matlab求解微分方程问题

    d y d t = a y 2 cfrac{dy}{dt}=ay^2 d t d y ​ = a y 2 结果 d 3 y d t 3 = b y cfrac{d^3y}{dt^3}=by d t 3 d 3 y ​ = b y 结果 x 2 + y + ( x − 2 y ) y ′ = 0 x^2+y+(x-2y)yprime=0 x 2 + y + ( x − 2 y ) y ′ = 0 结果: d 2 y d t 2 = a y , 初 始 条 件 为 y ( 0 ) = 5 , y ′ ( 0 ) = 1 cfrac{d^2y}{dt^2}=ay, text初始条件为y(0)=5,yprime(

    2024年02月03日
    浏览(29)
  • 【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现

    微分方程基本概念 微分方程在数学建模中的应用 微分方程常用模型(人口增长模型、传染病模型) 2022.06.19 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中

    2024年02月09日
    浏览(53)
  • matlab求解时变系统的Riccati矩阵微分方程

    对于代数Riccati方程的求解网上能找到很多的资源,matlab也有成熟的函数,但是对于时变系统的Riccati矩阵微分方程,能找到的资料还比较少。 可以在网上找到很多资料,如 https://blog.csdn.net/m0_62299908/article/details/127807014 matlab也有相应的一系列函数 lqr、icare等。 对于这些函数不

    2024年02月05日
    浏览(31)
  • 0702可分类变量的微分方程-微分方程

    本节至第四节我们学习的都是一阶微分方程 ​ y ′ = f ( x , y ) y^{\\\'}=f(x,y) y ′ = f ( x , y ) (2-1) 一阶微分方程对称形式 p ( x , y ) d x + Q ( x , y ) d y = 0 ( 2 − 2 ) p(x,y)dx+Q(x,y)dy=0qquad (2-2) p ( x , y ) d x + Q ( x , y ) d y = 0 ( 2 − 2 ) 若以x为自变量,y为因变量,则 d y d x = − P ( x , y ) Q (

    2024年02月04日
    浏览(38)
  • (矩阵)一阶微分方程和伯努利方程

    伯努利方程的标准形式: 伯努利方程解法: 方程两边同时除以y的n次, 做变量替换y-z: 转换为线性微分方程: 最后换回原来的变量即可得到伯努利方程。 一阶线性微分方程的标准形式: 当Q(x)=0,为齐次方程;当Q(x)≠0,为非齐次方程。 已知如下矩阵,求解一阶线性微分方

    2024年02月05日
    浏览(40)
  • 一阶常微分方程

    第一次写博客记录自己的学习过程,写的不好希望大家斧正。 讲的更多的是常微分方程的解法的理解,也是我在学习中遇到各种证明的关键点,希望通过记录博客深化对于证明的理解,建立起数学思维,而不是知其然而不知其所以然。因此阅读中需要读者有一定的基础,与实

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包