常微分方程建模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函数探寻一个常微分方程的平衡点时,需要仔细设置初始解,并尝试多个不同的初始解,从而得到比较满意的结果。

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

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

相关文章

活动发布会邀请媒体6步走

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播&#xff0c;企业品牌建设有诸多的好处&#xff0c;今天就与大家分享下邀请媒体参加活动报道的6个步骤&#xff1a; 1. 策划与准备&#xff1a; -明…

【Flutter】【packages】simple_animations 简单的实现动画

package&#xff1a;simple_animations 导入包到项目中去 可以实现简单的动画&#xff0c; 快速实现&#xff0c;不需要自己过多的设置 有多种样式可以实现[ ] 功能&#xff1a; 简单的用例&#xff1a;具体需要详细可以去 pub 链接地址 1. PlayAnimationBuilder PlayAnima…

java多线程及

多线程使用 在java中&#xff0c;多线程得主要实现方式有四种&#xff1a;继承Thread类&#xff0c;实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程&#xff0c;使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执…

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考&#xff1a; 输入&#xff1a;数据是什么(数字、文本、图)&#xff1f;如何理解数据&#xff1f;如何清洗数据&#xff1f;(需要专业领域知识)输出&…

实习碎碎念

话说实习一周多了&#xff0c;学到的比自学一个月都多~~~加油狗子你最棒&#xff01;&#xff01;&#xff01; 环境搭建坑死了 SSM框架环境配置 Ideamavenjdktomcatnavicat https://www.cnblogs.com/seigann/p/14528551.htmlhttps://www.cnblogs.com/seigann/p/14528551.h…

模板初阶以及string类使用

模板初阶以及string类使用 模板的简单认识1.泛型编程2.函数模板模板的原理图函数模板格式函数模板实例化非模板函数和模板函数的匹配原则 3.类模板类模板的定义格式类模板的实例化 string1.string简介2.string常用的接口 题目练习1.字符串相加2.字符串里面最后一个单词的长度3.…

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库…

CVE漏洞复现-CVE-2021-3493 Linux 提权内核漏洞

CVE-2021-3493 Linux 提权内核漏洞 漏洞描述 CVE-2021-3493 用户漏洞是 Linux 内核中没有文件系统中的 layfs 中的 Ubuntu over 特定问题&#xff0c;在 Ubuntu 中正确验证有关名称空间文件系统的应用程序。buntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名…

kubernetes configmap 的data中的文件内容格式错乱

截取一段错乱的配置&#xff1a; kubectl -n monitoring get cm blackbox-exporter-configuration -o yaml apiVersion: v1 data:config.yml: "\"modules\":\n \"http_2xx\":\n \"http\":\n \"preferred_ip_protocol\"…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程&#xff0c;可以参考&#xff1a; 1. 确定需求和功能&#xff1a;首先要明确你想要的电影购票选座H5小程序的需求和功能&#xff0c;例如用户登录注册、电影列表展示、选座购票、订单…

【Java可执行命令】(二十一)线程快照生成工具 jstack:帮助开发人员分析和排查线程相关问题(死锁、死循环、线程阻塞...)

Java可执行命令之jstack 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 使用步骤及技巧3.3 使用案例 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 jstack 命令是 Java Development Kit&#xff08;JDK&#xff09;中提供的一项诊断工具&#xff0c;用于生成Java虚拟…

WHQL认证中HCK和HLK的区别

开发者或硬件制造商要通过WHQL认证获得微软数字签名或是Windows徽标的使用权限&#xff0c;就需要使用WHQL认证的测试工具&#xff08;HCK或HLK&#xff09;对硬件设备或驱动程序进行测试。HCK和HLK其实是一个系列的测试工具&#xff0c;HCK和HLK的主要区别是用于测试不同Windo…

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 命名方式灵活&#xff0c;不限于unittest的setup、teardown可以实现数据共享&#xff0c;多个模块跨文件共享前置后置可以实现多个模块跨…

JAVA SpringBoot 项目 多线程、线程池的使用。

1.1 线程&#xff1a; 线程就是进程中的单个顺序控制流&#xff0c;也可以理解成是一条执行路径 单线程&#xff1a;一个进程中包含一个顺序控制流&#xff08;一条执行路径&#xff09; 多线程&#xff1a;一个进程中包含多个顺序控制流&#xff08;多条执行路径&#xff0…

前端实习周记第三周周记

第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多&#xff0c;但是小的细节蛮多。 值得一提的是&#xff0c;第二周做的微信小程序&#xff0c;改了很多逻辑。改逻辑需要与后端进行联调&#xff0c;收获很大&#xff0c;思路也愈发清楚。 记录做了什么是好习…

天津农商银行智能加密锁管理工具常见问题

天津农商银行智能加密锁管理工具&#xff0c;在使用过程中&#xff0c;可能出现一些莫名的错误&#xff0c;针对亲身遇到的坑&#xff0c;分享给大家&#xff0c;以备不时之需。 一、转账业务导入文件中文汉字出现乱码&#xff0c;如下图。 原因是文件编码不正确&#xff0c;…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求&#xff1a; 创建基于Maven的Java项目&#xff0c;连接数据库&#xff0c;实现对站点信息的管理&#xff0c;即实现对站点的新增&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT N…

收钱吧与火山引擎VeDI合作一年后 有了哪些新变化?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 收钱吧正在和火山引擎数智平台&#xff08;VeDI&#xff09;跑出一条业务提效新通路。 相关数据显示&#xff0c;收钱吧的日服务人次就近5000万&#xff0c;累计服务…

测评HTTP代理的透明匿名?

在我们日常的网络冒险中&#xff0c;你是否曾听说过HTTP代理的透明匿名特性&#xff1f;这些神秘的工具就像是网络世界中的隐身斗士&#xff0c;让我们能够在互联网的迷雾中保护自己的身份和隐私。那么&#xff0c;让我们一起揭开HTTP代理的面纱&#xff0c;探索其中的奥秘吧&a…