常微分方程建模R包ecode(三)——探寻平衡点

这篇具有很好参考价值的文章主要介绍了常微分方程建模R包ecode(三)——探寻平衡点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在建立常微分方程后,我们常常会问的一个问题是: 这个常微分方程系统中是否存在平衡点?如果存在,这个平衡点是否稳定? 本节将展示如何通过ecode包来回答这个问题。

我们首先利用ecode包建立一个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为两物种之间的竞争系数。

library(ecode)

eq1 <- function(x, y, r1 = 1, 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)

一、数学原理

对任意一个常微分方程组,
d x 1 d t = f 1 ( x 1 , x 2 , . . . , x n ) , d x 2 d t = f 2 ( x 1 , x 2 , . . . , x n ) , . . . d x m d t = f n ( x 1 , x 2 , . . . , x n ) . \frac{dx_1}{dt}=f_1(x_1,x_2,...,x_n),\\ \frac{dx_2}{dt}=f_2(x_1,x_2,...,x_n),\\ ...\\ \frac{dx_m}{dt}=f_n(x_1,x_2,...,x_n). dtdx1=f1(x1,x2,...,xn),dtdx2=f2(x1,x2,...,xn),...dtdxm=fn(x1,x2,...,xn).
若要求出其平衡点 ( x 1 ∗ , x 2 ∗ , . . . , x n ∗ ) (x_1^*,x_2^*,...,x_n^*) (x1,x2,...,xn),则需令,
f 1 ( x 1 ∗ , x 2 ∗ , . . . , x n ∗ ) = 0 , f 2 ( x 1 ∗ , x 2 ∗ , . . . , x n ∗ ) = 0 , . . . f n ( x 1 ∗ , x 2 ∗ , . . . , x n ∗ ) = 0. f_1(x_1^*,x_2^*,...,x_n^*)=0,\\ f_2(x_1^*,x_2^*,...,x_n^*)=0,\\ ...\\ f_n(x_1^*,x_2^*,...,x_n^*)=0. f1(x1,x2,...,xn)=0,f2(x1,x2,...,xn)=0,...fn(x1,x2,...,xn)=0.
然后求解这个 n n n元方程组即可。

然而,在现实中, f 1 , f 2 , . . . , f n f_1,f_2,...,f_n f1,f2,...,fn可能是非常复杂的函数,导致很难得出该方程组的解析解。因而,我们常常采用数值方法对其进行求解。

ecode包目前采用Newton迭代法法来求解常微分方程的平衡点。

Newton迭代法
Newton迭代法是一种用于求解方程组的数值方法。如果要求解一个一元方程,
f ( x ) = 0 f(x)=0 f(x)=0
则首先随机猜测这个方程组的解是 x = x 0 x=x_0 x=x0,随后不断进行如下运算,
x n + 1 = x n − f ( x n ) f ′ ( x n ) , n ∈ N x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)},\quad n∈\textbf N xn+1=xnf(xn)f(xn),nN
此时 x n + 1 x_{n+1} xn+1相较于 x n x_n xn而言更接近于方程 f ( x ) = 0 f(x)=0 f(x)=0的真实解,因为 x n + 1 x_{n+1} xn+1 x n x_n xn的基础上沿着函数 f ( x ) f(x) f(x)的梯度下降。当 ∣ x n + 1 − x n ∣ |x_{n+1}-x_n| xn+1xn小于一个精度值 ε ε ε时,Newton迭代法停止, x n + 1 x_{n+1} xn+1为方程 f ( x ) = 0 f(x)=0 f(x)=0的近似解。
需要注意,Newton迭代法并不是总能求出方程 f ( x ) = 0 f(x)=0 f(x)=0的解。当 x 0 x_0 x0的值设定的不合适时,经过Newton迭代后, x n + 1 x_{n+1} xn+1可能陷入函数 f ( x ) f(x) f(x)的某个大于0的极小值中,或者落到 f ( x ) f(x) f(x)的定义域外。
f ( x ) \textbf f(\textbf x) f(x)是一个多元方程组时,需要求解的方程是
f ( x ) = 0 \textbf f(\textbf x)=0 f(x)=0
或者表达为,
f 1 ( x 1 , x 2 , . . . , x k ) = 0 f 2 ( x 1 , x 2 , . . . , x k ) = 0 . . . f k ( x 1 , x 2 , . . . , x k ) = 0 f_1(x_1,x_2,...,x_k)=0\\ f_2(x_1,x_2,...,x_k)=0\\...\\ f_k(x_1,x_2,...,x_k)=0 f1(x1,x2,...,xk)=0f2(x1,x2,...,xk)=0...fk(x1,x2,...,xk)=0
假设设定的初始解为 x 0 \textbf x_0 x0,那么随后就要不断进行如何运算,
x n + 1 = x n − J − 1 ( x n ) f ( x n ) \textbf x_{n+1}=\textbf x_n - \textbf J^{-1}(\textbf x_n)\textbf f(\textbf x_n) xn+1=xnJ1(xn)f(xn)
其中, J − 1 \textbf J^{-1} J1为多元函数 f ( x ) \textbf f(\textbf x) f(x)的Jacobian矩阵,
[ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 . . . ∂ f 1 ∂ x k ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 . . . ∂ f 2 ∂ x k . . . ∂ f k ∂ x 1 ∂ f k ∂ x 2 . . . ∂ f k ∂ x k ] \begin{bmatrix} \frac{∂f_1}{∂x_1} & \frac{∂f_1}{∂x_2} & ... & \frac{∂f_1}{∂x_k}\\ \frac{∂f_2}{∂x_1} & \frac{∂f_2}{∂x_2} & ... & \frac{∂f_2}{∂x_k}\\ ...\\ \frac{∂f_k}{∂x_1} & \frac{∂f_k}{∂x_2} & ... & \frac{∂f_k}{∂x_k} \end{bmatrix} x1f1x1f2...x1fkx2f1x2f2x2fk.........xkf1xkf2xkfk

二、pp对象

上一节中提到,**相点(phase point)**是相空间中的任意一点,用于描述一个常微分方程系统在某一时刻的状态。

ecode包中,有专门的pp对象来描述一个相点。若要创建一个pp对象,就需要调用其构造函数pp()

point <- pp(list(x = 1, y = 1))
point
## phase point:
## x = 1 
## y = 1 

该函数创造了一个相点对象point。该相点位于二维空间中,一个维度为 x x x,另一个维度是 y y y,该相点的值是 ( x , y ) = ( 1 , 1 ) (x,y)=(1,1) (x,y)=(1,1)

ecode包中提供相点的四则运算函数,例如

pp(list(x = 1, y = 1)) + pp(list(x = 2, y = 3))
## phase point:
## x = 3 
## y = 4

对两个位于同一空间内的相点施行加法运算,则运算后的结果也是同一空间内的相点,相点的坐标是原来两个相点坐标的和。同样,减法、乘法和除法的运算规则类似。

三、eode_get_cripoi函数

ecode包中提供eode_get_cripoi函数来获取一个常微分方程系统的平衡点。我们现在可以尝试获取常微分方程系统 ( 1 − 2 ) (1-2) (12)的平衡点,

eq_point <- eode_get_cripoi(x, init_value = pp(list(x = 0.5, y = 0.5)), 
                            eps = 0.001)
eq_point
## phase point:
## x = 0.3333333 
## y = 0.3333333 

函数eode_get_cripoi中各个参数的含义是,

  • x:常微分方程系统。一个eode对象。
  • init_value:初始解 x 0 \textbf x_0 x0。一个pp对象, 其中pp对象的维度要与常微分方程系统中模型变量的名字对应。如前所述,用户必须指定一个初始解,这样Newton迭代法才能开始运行。
  • eps:精度值 ε ε ε。当两个迭代前后的两个相点之间的距离小于精度值 ε ε ε时,Newton迭代法停止,该函数返回计算结果。该参数的默认值为0.001。

代码运行后的结果表明,当用户指定 ( 0.5 , 0.5 ) (0.5,0.5) (0.5,0.5)为初始解时,Newton迭代法能够顺利地找出模型 ( 1 − 2 ) (1-2) (12)的平衡点 ( 1 / 3 , 1 / 3 ) (1/3,1/3) (1/3,1/3)

然而,如果我们换一个初始解,

eq_point <- eode_get_cripoi(x, init_value = pp(list(x = 1, y = 5)), 
                            eps = 0.001)
## Fail to find an equilibrium point. The function will return iteration history
##               x         y
## 1             1         5
## 2     0.5049506  2.722774
## 3     0.2525784  1.610832
## 4     0.1155298  1.113498
## 5    0.03020005 0.9806953
## 6 -0.0002282437 0.9996615
## Error in eode_get_cripoi(x, init_value = pp(list(x = 1, y = 5)), eps = 0.001) : 
##   Fail to find an equilibrium point. Please try other initial values

这表明,如果以 ( 1 , 5 ) (1,5) (1,5)为起始解,Newton迭代法就无法找到平衡点。屏幕中显示了Newton迭代法的迭代过程。当迭代到第6步时,相点已经在 ( − 0.0002 , 0.9996 ) (-0.0002,0.9996) (0.0002,0.9996),这已经超出了模型变量的取值范围 0 < x , y < 1000 0<x,y<1000 0<x,y<1000,因而Newton迭代法失败。

由此可见,利用eode_get_cripoi函数探寻一个常微分方程的平衡点时,需要仔细设置初始解,并尝试多个不同的初始解,从而得到比较满意的结果。文章来源地址https://www.toymoban.com/news/detail-636206.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日
    浏览(81)
  • 【数学建模】《实战数学建模:例题与讲解》第五讲-微分方程建模(含Matlab代码)

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

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

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

    2024年02月14日
    浏览(103)
  • 【数学建模\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日
    浏览(45)
  • 美赛BOOM数学建模4-2微分方程传染病预测模型

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

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

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

    2024年02月09日
    浏览(67)
  • 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日
    浏览(52)
  • (矩阵)一阶微分方程和伯努利方程

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

    2024年02月05日
    浏览(58)
  • 高等数学(微分方程)

    x y ′ ′ ′ + ( y ′ ) 3 + y 4 xy\\\'\\\'\\\'+(y\\\')^3+y^4 x y ′′′ + ( y ′ ) 3 + y 4 quad quad 三阶 y ′ = 2 x y\\\'=2x y ′ = 2 x quad quad quad quad quad quad 一阶 d y = 2 x d x dy=2xdx d y = 2 x d x quad quad quad quad 一阶 ( y ′ ′ ) 5 + 2 y ′ = 3 (y\\\'\\\')^5+2y\\\'=3 ( y ′′ ) 5 + 2 y ′ = 3 quad quad quad 二阶 quad 例1: 已知

    2024年02月10日
    浏览(48)
  • matlab解微分方程

    f=@(变量) 表达式; x1为2 3 4 5;x2为3 4 5 6的情况下求解函数f的值 用“dsolve” step1: 申明自变量和因变量 syms y(x) step2:编程 得到: step1: 申明自变量和因变量 syms y(x) step2:编程 得到 step1.写函数文件 step2.主函数 相当于定义了一个新向量y,然后列 匿名函数 ,方程的 左边都是一阶

    2024年02月13日
    浏览(81)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包