问题标签 [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.
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
应该是0
for time = 1
(或t < 2
)。不幸的是,求解器似乎没有考虑我在 C++ 函数中提供的内容,除了 ODE。但是,如果我将state
R 更改为另一个值,它会起作用。不知何故,我在 C++ 中定义的 if 条件被忽略了,但我不明白为什么以及如何计算 C++ 而不是 R 中的初始值。
r - 使用 deSolve 包中的 ODE 的现实年龄结构化模型
我正在尝试使用 deSolve 包中的 ODE 模拟一个现实的年龄结构模型,其中所有个人都可以在时间步长结束时转移到下一个年龄组(而不是以给定的速率连续老化)。
例如,考虑具有易感 (S) 和传染 (I) 两个状态的模型,每个状态分为 4 个年龄组(S1、S2、S3、S4 和 I1、I2、I3、I4),S1 中的所有个体都应该在时间步结束时进入 S2,S2 中的应该进入 S3,依此类推。
我尝试分两步完成,第一步是求解 ODE,第二步是在时间步长结束时将个人转移到下一个年龄组,但没有成功。
以下是我的尝试之一:
任何指导将不胜感激,在此先感谢您!
r - 在 R 中用循环和 if else 解决 SIR 模型
我有一个简单的 SIR 模型,我正在尝试实施一种疫苗接种方法 (V),首先检查感染者是否高于阈值 (100),如果仍有足够的易感者 (50),它将接种疫苗每个时间步长一定数量(50)。
但是我想做的是,一旦满足条件,它应该接种 7 天(无论在这 7 天内感染者是否仍然高于阈值,例如,如果在第 4 天之后, I = 70它应该仍然继续,只有在 S < 50 时才应该停止。在 7 天结束后,它应该再次检查条件,或者重新开始 7 天,或者不重新开始。
到目前为止,如果有人帮助我实现该循环,我将不胜感激
r - 循环参数以使用 deSolve 获得平衡
我直观地与循环作斗争。我有一个简单的消费者资源模型,我想遍历资源增长率的值g
以获得最终状态值,然后绘制平衡作为参数值的函数。这是我到目前为止所拥有的:
我想我一直在思考 ode 函数 - 在此之后我应该在哪里建立索引i
?我希望这是有道理的。
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 参数的时变部分,因为我想不出一种方法来包含它并顺利运行它。我尝试将它包含在函数定义中,但无济于事。
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 上几乎找不到任何东西,所以我希望这里有人可以提供帮助。
r - 如何用 N 个方程和 N+m 个参数在 deSolve、R 中实现一个系统?
我在 R 的元种群中编写 SIR 模型,我想集成 systema,为此我使用 de deSolve 和 C 编译代码,我以前使用过这个,但在有几个参数的情况下,现在我会有 Nxm参数,其中 N 是系统的维度,所以我想要那个
这个参数是向量或矩阵 NxN 可能吗?
在 C 中,我的模型将采用以下形式:
通过这种方式,它不会将 S[i] 或其他变量识别为变量,而只是作为初始条件值。
我该怎么做才能将其识别为变量?
r - 使用 R 中的 deSolve::ode 对具有温度激活火焰的环进行热扩散
如果温度低于某个值,我正在尝试模拟一个在某一点加热的环。这是我的 R 代码:
这条线:if (v[50] < 25) dt[50] <- 100 - v[50]
告诉模型如果低于 25°,则增加段 50 的温度。如果注释了此行,则模型可以正常工作。maxsteps
如果该线处于活动状态,则模型会在达到 25° 时失败(要求增加)(直到该点它仍会输出结果)。如果求解方法切换到“ode45”,模型可以成功运行,但速度很慢,或者如果切换到像“euler”这样的显式方法,但它只能在 alpha 足够低时工作。
是否有正确的方法来实现它以便使用默认的隐式方法快速运行它,或者它只是 ode 无法管理的东西?