问题标签 [desolve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
57 浏览

r - 在编译模型 (deSolve, Rcpp) 中设置 ODE 系统的初始(状态)值

在调用已编译的 ODE 以通过 R 包解决时,我正在努力解决一个可能很小的问题,'deSolve'并且我寻求更多专家用户的建议。

背景

我有几个需要解决的 ODE 系统'deSolve'。我已经在单独的 C++ 函数(每个模型一个)中定义了 ODE,我通过 R 结合'Rcpp'. 如果函数从另一个模型获取输入(所以基本上有级联),系统的初始值会发生变化。

这很好用,但是,对于一个模型,我必须为t < 2. 我尝试在 C++ 函数中执行此操作,但它似乎不起作用。

运行代码示例

输出读取(这里只有前两行):

以防万一:如何运行此代码示例?

我的示例使用RStudio进行了测试:

  • 将代码复制到以 *.cpp 结尾的文件中
  • 单击“来源”按钮(或<shift>+ <cmd>+ <s>

它在没有 RStudio 的情况下也应该可以工作,但是必须安装包'Rcpp''deSolve'编译它需要在 Windows 上使用 Rtools、在 Linux 上使用 GNU 编译器和在 macOS 上使用 Xcode 的代码。

问题

据我了解,ne应该是0for time = 1(或t < 2)。不幸的是,求解器似乎没有考虑我在 C++ 函数中提供的内容,除了 ODE。但是,如果我将stateR 更改为另一个值,它会起作用。不知何故,我在 C++ 中定义的 if 条件被忽略了,但我不明白为什么以及如何计算 C++ 而不是 R 中的初始值。

0 投票
1 回答
71 浏览

r - 使用 deSolve 包中的 ODE 的现实年龄结构化模型

我正在尝试使用 deSolve 包中的 ODE 模拟一个现实的年龄结构模型,其中所有个人都可以在时间步长结束时转移到下一个年龄组(而不是以给定的速率连续老化)。

例如,考虑具有易感 (S) 和传染 (I) 两个状态的模型,每个状态分为 4 个年龄组(S1、S2、S3、S4 和 I1、I2、I3、I4),S1 中的所有个体都应该在时间步结束时进入 S2,S2 中的应该进入 S3,依此类推。

我尝试分两步完成,第一步是求解 ODE,第二步是在时间步长结束时将个人转移到下一个年龄组,但没有成功。

以下是我的尝试之一:

任何指导将不胜感激,在此先感谢您!

0 投票
1 回答
77 浏览

r - 在 R 中用循环和 if else 解决 SIR 模型

我有一个简单的 SIR 模型,我正在尝试实施一种疫苗接种方法 (V),首先检查感染者是否高于阈值 (100),如果仍有足够的易感者 (50),它将接种疫苗每个时间步长一定数量(50)。

但是我想做的是,一旦满足条件,它应该接种 7 天(无论在这 7 天内感染者是否仍然高于阈值,例如,如果在第 4 天之后, I = 70它应该仍然继续,只有在 S < 50 时才应该停止。在 7 天结束后,它应该再次检查条件,或者重新开始 7 天,或者不重新开始。

到目前为止,如果有人帮助我实现该循环,我将不胜感激

0 投票
1 回答
41 浏览

r - lsoda 创造虚构价值?

我目前正在开发一个模型来整合微生物学和地球化学,该模型使用 lsoda 来求解大量微分方程。该模型太大了,无法在此处发布,因为它由几个模块组成,但我发生了一些非常奇怪的事情。

这些是我的初始值 在此处输入图像描述

我将它们初始化为零,因为我不想要任何种类的微生物,只是为了检查没有微生物的化学物质会如何变化。然而,经过 5 或 6 步后,我开始在一些微生物变量中看到不同于零的值: 在此处输入图像描述

我想知道 lsoda 是否正在做某种回合,这就是我得到这些值的原因,因为否则我无法解释这些值是从哪里冒出来的。如果是这种情况,有谁知道如何阻止这种围捕?

0 投票
1 回答
44 浏览

r - 循环参数以使用 deSolve 获得平衡

我直观地与循环作斗争。我有一个简单的消费者资源模型,我想遍历资源增长率的值g 以获得最终状态值,然后绘制平衡作为参数值的函数。这是我到目前为止所拥有的:

我想我一直在思考 ode 函数 - 在此之后我应该在哪里建立索引i?我希望这是有道理的。

0 投票
2 回答
52 浏览

r - R [Shiny]:如何制作显示动态系统模型的响应式闪亮应用程序?

我想构建一个反应式 Rshiny 应用程序,它显示由 deSolve 包解决的动态模型的结果。

示例代码复制自 Jim Duggans System Dynamics Modeling with R。

这是没有 R-Shiny 的代码,它是一个考虑资源消耗的经济模型:

我想在应用程序中显示的图

R-Shiny React 部分

现在我尝试将所有这些包装到一个非常基本的 R-Shiny 应用程序中,代码如下:

现在我很确定问题出在 auxs 变量的类型上:

你知道我是否可以在不改变函数的情况下实现反应性:模型或我必须做出反应性的函数/变量以及如何?

提前非常感谢。

0 投票
2 回答
165 浏览

r - 如何在 R 中求解具有时间相关参数的 ODE 系统?

我正在尝试通过 deSolve 求解这个 ODE 系统,dX/dt = -X*a + (YX) b + c 和 dY/dt = -Y a + (XY)*b 时间 [0,200], a=0.30 , b=0.2 但 c 在时间 [50,70] 时为 1,否则为 0。我一直在使用的代码是,

我已经省略了 c 参数的时变部分,因为我想不出一种方法来包含它并顺利运行它。我尝试将它包含在函数定义中,但无济于事。

0 投票
1 回答
45 浏览

r - 误差延迟微分方程 deSolve (dede)

我正在 deSolve (R) 中编写延迟微分方程,并且收到一条错误消息,我不确定如何求解。所以对于一些背景。我有一个包含 12 个微分方程的系统,其中 3 个有延迟。我在没有 deSolve 的情况下成功编写了系统,但我想使用 deSolve,因为它让我有机会轻松使用其他非固定步长欧拉的方法。但是,现在我把它放在 deSolve 中,并且我正在使用延迟微分方程的通用求解器 (dede),我得到一个错误。

这是误差所涉及的延迟和微分方程:

lag2=ifelse(t-tau2<0, 0, e2(lagvalue(t-tau2,3))*lagvalue(t-tau2,8))

dn9dt=lag2-IP2*ethaP2M*P2-mu2*sf0B(B2)*P2-DNB(N2,B2)*P2+DD*PD

第一个和第三个延迟微分方程与这个相同,似乎没有错误。错误是:

Error in lagvalue(t - tau2, 3) : illegal input in lagvalue - lag, 0, too large, at time = 15.945

需要注意的重要一点是,在这种情况下,延迟 (tau2) 为 16,并且错误发生在 time = 16 之前。

我已经尝试将 t-tau2<0 更改为 t-tau2<=0,但这并没有帮助,我尝试增加历史数组的大小 (control=list(mxhist = 1e6)),其中也没有帮助。我也尝试过几次重写延迟,但每次我得到同样的错误。

我已经尝试在网上搜索,但我在 deSolve 的 dede 上几乎找不到任何东西,所以我希望这里有人可以提供帮助。

0 投票
1 回答
27 浏览

r - 如何用 N 个方程和 N+m 个参数在 deSolve、R 中实现一个系统?

我在 R 的元种群中编写 SIR 模型,我想集成 systema,为此我使用 de deSolve 和 C 编译代码,我以前使用过这个,但在有几个参数的情况下,现在我会有 Nxm参数,其中 N 是系统的维度,所以我想要那个

这个参数是向量或矩阵 NxN 可能吗?

在 C 中,我的模型将采用以下形式:

通过这种方式,它不会将 S[i] 或其他变量识别为变量,而只是作为初始条件值。

我该怎么做才能将其识别为变量?

0 投票
1 回答
35 浏览

r - 使用 R 中的 deSolve::ode 对具有温度激活火焰的环进行热扩散

如果温度低于某个值,我正在尝试模拟一个在某一点加热的环。这是我的 R 代码:

这条线:if (v[50] < 25) dt[50] <- 100 - v[50]告诉模型如果低于 25°,则增加段 50 的温度。如果注释了此行,则模型可以正常工作。maxsteps如果该线处于活动状态,则模型会在达到 25° 时失败(要求增加)(直到该点它仍会输出结果)。如果求解方法切换到“ode45”,模型可以成功运行,但速度很慢,或者如果切换到像“euler”这样的显式方法,但它只能在 alpha 足够低时工作。

是否有正确的方法来实现它以便使用默认的隐式方法快速运行它,或者它只是 ode 无法管理的东西?