问题标签 [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 回答
53 浏览

r - deSolve:具有两个连续动力学的微分方程

我正在模拟一个带有流动水和温度梯度的环形管,使用deSolve::ode(). 环被建模为一个向量,其中每个元素都有一个温度值和位置。

我正在模拟热扩散公式:

1)热扩散

但我也在努力让水沿着环移动。从理论上讲,它只是将管向量中元素i处的温度替换为之前元素s处的温度。由于s可能不是整数,因此可以将其分为整数部分(n)和小数部分(p):s=n+p。因此,由于水的移动引起的温度变化变为:

2)水流

问题是s等于在 ode 求解器的每次迭代中评估的dt的水流速度v 。

我的想法是将这些现象视为加法,即首先计算 (1),然后计算 (2),最后将它们相加。我害怕时间的影响。带有隐式方法的 ode 求解器自动决定时间步长,并线性按比例缩小酉变化增量。

我的问题是仅在导数函数中返回 (1) + (2) 是否正确,或者我是否应该将这两个过程分开并分别计算导数。在第二种情况下,建议的方法是什么?

编辑:根据@tpetzoldt 的建议,我尝试使用ReacTran::advection.1D(). 我的模型有多种温度变化源:自发对称热扩散;水流;如果传感器(放置在热源之前)附近的温度低于下限阈值时打开,如果高于上限阈值则关闭热源;由周期性外部温度确定的恒定热扩散。

在“动水”部分下面仍然是我以前版本的代码,现在替换为ReacTran::advection.1D(). 该plot_type参数允许可视化水管(“管道”)中温度的时间序列,或传感器(加热器之前和之后)的温度序列。

有趣的是,设置更高的分段数 ( L = 500) 和高速 ( vel = 2) 可以观察到后加热传感器中的尖峰序列。此外,处理时间急剧增加,但更多的是速度增加的影响,而不是管道分辨率的增加。

在此处输入图像描述

我现在最大的疑问是ReacTran::advection.1D()在我的上下文中是否有意义,因为我正在模拟水温,而这个函数似乎与流动水中的溶质浓度更相关。

0 投票
0 回答
21 浏览

r - 使用 deSolve 和 ReacTran 模拟管道中流动的水的温度

我正在模拟一个带有流动水和温度梯度的环形管,使用deSolve::ode(). 环被建模为一个向量,其中每个元素都有一个温度值和位置。

我正在通过以下方式对热扩散进行建模:

热扩散

它使用局部温度曲率来定义时间梯度。

正如这里所建议的deSolve:具有两个连续动力学的微分方程,我ReacTran用来解决水的运动,但我对参数化感到困惑。
作为第一次尝试,我尝试了:

模拟温度,因为它是溶质的浓度。这里v表示将管道细分为L带温度的段v[i]vel以每个时间步长定义的速度扩散dx(我对此不确定100%,所以如果有人可以对此发表评论,请+1)。我将返回的dC(浓度增量)等同于每个时间步长的温度变化dT 。

最终,在定义沿每个管段的总温度变化时,将由于热扩散引起的dT与热运动的 dT 相加。

我想知道我的方法是否正确,特别是:

  • advection.1D() 可以用来模拟温度流动,因为它是一种浓度吗?
  • 简单地将由于热扩散的dT添加到与水运动相关的 dT 是否正确,即两者是否相加?

型号详情:

我的模型有多种温度变化源:自发对称热扩散;水流;如果传感器(放置在热源之前)附近的温度低于下限阈值时打开,如果高于上限阈值则关闭热源;由周期性外部温度确定的恒定热扩散。

plot_type参数允许可视化水管(“管道”)中温度的时间序列,或传感器(加热器之前和之后)的温度序列。

这是 50000 个时间点的模型图。每个子图的最后一点显示加热是打开还是关闭以及它的温度;两条水平线定义了打开/关闭加热的温度阈值。时间/空间的趋势似乎很现实,但我不确定它是否具有物理意义。

管道图

0 投票
1 回答
50 浏览

r - deSolve:无法理解如何使用根函数提前停止 ode 求解器

当满足特定条件时,我对如何停止求解器感到困惑。我准备了一个虚拟 SIR 模型,一旦 I 隔室达到某个值,它就会停止。但在我的代码中,求解器只是继续:

如果根计算为 2,求解器应该停止,如果计算为 0,则触发一个事件,并在所有其他情况下继续。但是根为 2 并不能阻止它。

0 投票
3 回答
57 浏览

r - 参数值作为另一个向量的函数。解解

我希望建立一个人口动态模型,其中每个参数值对应于当天的温度。例如

简单模型

我现在想使用一系列每日温度 DailyTemperature<-floor(runif(50,0,40))

并使参数值成为温度的函数

因此,对于迭代的每个时间步,它都会查看每日温度,然后在参数数据框中找到相应的温度值。

回顾档案,我看到if/else想要在特定时间步更改单个参数和使用强制函数时使用的语句,但我认为它们不适用于这里。

我希望这是有道理的,我对如何使它起作用的想法很感兴趣。到目前为止,我还尝试使用 afor loop来遍历每日温度列表,然后使用match函数来识别值,但这并没有利用每日时间步长。

0 投票
1 回答
24 浏览

r - ODE 中的潜在索引问题?

遵循@tpetzoldt 的建议,我在前面的讨论(参数值作为另一个向量的函数。deSolve)之后将其作为一个问题打开。

我想要实现的是能够在每个时间步上将模型集成到一个向量上DailyTemperature,然后每天的相应参数值是来自其他温度输出的数据帧的值的函数。

我实际上开始认为这是参数值而不是代码的问题。无论如何,我很想知道我的索引是否正确?

0 投票
1 回答
37 浏览

r - 在 DeSolve 中随着时间步长的变化在特定时间涌入

我正在使用方法 lsoda 在 DeSolve 中使用 ODE 和 DDE 制作人口分布模型。在这个模型中,我希望在特定时间(特定日期)有大量人口涌入。一个非常简单的例子:

dn1dt=influx - mortality

涌入 (x) 需要在时间 (t) = y(以天为单位)发生。如果不是第 y 天,我不想要大量涌入。目前我已将涌入编写为influx=function(t,y,x){ifelse((t==y), x, 0)),但由于我使用的方法(lsoda),我遇到了时间步长变化的问题。由于时间步长的变化,我不会达到触发流入的具体时间(y)。我刚刚开始使用不断变化的时间步长,所以我不确定如何处理这个问题。如果有任何不清楚的地方,请告诉我。

0 投票
0 回答
17 浏览

r - 在 deSolve 中访问根函数和事件函数中的内部时变和固定参数

我正在使用 R+desolve 对海藻生长进行建模,并希望实现一个函数,在给定模型内部变量的阈值的情况下收获海藻(即不是状态变量,因此不能通过 (t , y, 参数))。我还希望阈值由我可以在 parms 中传递给模型的变量控制。一些(简化的)示例代码

然后我想在g_E达到阈值时触发一个事件函数

和事件

收获参数被添加到传递给 ode 调用的参数中

desolve 事件的所有示例都对模型的状态变量(例如,在上面的示例中可以访问 y['N_s'])而不是模型的内部变量进行根评估。上面 rootfunc 中写的 g_E 显然不起作用,但我不知道如果可能的话如何访问它。用模型的状态变量替换 g_E(在科学上没有用,但对测试有好处)我得到错误:找不到对象'threshold_value',所以看起来根函数甚至无法访问参数。

我确定我在这里错过了一些基本的东西。非常感谢您的帮助!

0 投票
1 回答
33 浏览

r - 编写具有用户定义函数的模块化 ODE 求解器

我正在为硕士生写一个练习,我希望他们能够输入一个 ODE 系统并使用 deSolve 自动评估它。

我现在遇到的问题是根据用户输入定义要在 R 中动态评估的函数。假设我想从文本文件 ODE.txt 中读取数据,该文件包含 ODE 系统,其语法与我直接在其中写入时使用的语法相同:

ODE.txt 文件:

(它包含我开始使用的示例系统,我已经编写了处理它的函数)

和错误:

无论我尝试什么,错误都非常相似(我尝试了 eval(parse(, evaluate等的组合......

有谁知道如何构建这个东西?无论如何谢谢!

0 投票
1 回答
37 浏览

r - 如何使用 R 求解和绘制 ODE 系统?

我有一个颂歌系统,

方程

我想根据时间 t 绘制 V1 和 V2。我的代码是

我做对了吗?还有一种方法可以让我绘制1/t改变的值mue吗?这两者都通过第一颂相关联。

0 投票
1 回答
37 浏览

r - 在 R desolve 中结合根和非根事件函数

我正在使用 R 和 desolve 包来实现一个模型,其中包含在特定时间发生的事件和在某些条件为真时发生的事件(即根事件)。

正如这里的一些背景代码演示了使用满足条件时触发的根事件,而这里的代码演示了使用多个非根事件。

正如预期的那样,如果使用根事件,则时间步长将不是触发器,反之亦然,如果使用时间触发器,则根不会触发。

我考虑使用当模型时间与事件时间匹配时返回 0 的根。我已经在下面实现了它,它似乎可以正常工作,但是我的理解是,在构建模型时,我们不应该假设模型时间会发生(实际上我理解这是使用事件背后的全部原因)。因此,我不确定这是否是好的做法,或者是否有更好的方法来做到这一点。

扩展 -
如果这是解决方案,我预计同时发生的事件我可能会继续遇到多个事件同时发生的问题,但从实验来看,提供相同的参数似乎不会被多个同时发生的事件修改,这不是一个问题。我认为处理这些实例的正确方法是记录优先级顺序,理想情况下,打印/记录已发生的警告(显然对于时间触发事件,可以在模型运行之前进行检查,但根触发器只会在运行过程中被发现)。