问题标签 [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 投票
0 回答
30 浏览

r - 第一次忽略 R ode 求解器中的终端根

我在解决周期性差异 eq 模型时遇到问题。

模型的轨迹是循环的,我想在运行定义的循环时停止它。

为此,我在中运行以下根函数deSolve::ode

调用:

作为一个函数,detectChange当根被触发时给出系统的状态定义eventfun应该做什么。根有两个组件,当第一个为零时eventfun运行,而第二个为零时ode应该停止运行。

在输出中,我希望看到“退出”消息只出现一次,然后ode返回结果。

相反,我有以下输出:

(“eventfun”是在事件函数运行时警告我的标志,“turn_on”、“turn_off”、“recording_off”是由根的第一个组件触发的事件类型,而“exit”仅在以下情况下打印第二个分量为零。)

最后,我们可以看到两个“退出”消息,然后是一个抱怨两个连续根的错误。如果我在每个周期都打印根,则可以看到第二个根分量两次都为零。

为什么会这样?不应该ode在第二个元素的根第一次为零时停止?对于像 deSolve 这样的简单模型,我没有同样的问题:无法理解如何使用根函数提前停止 ode 求解器

我发现正确停止的一个技巧ode是强制两个“退出”状态由非退出根事件分隔。

0 投票
1 回答
27 浏览

r - 触发根函数时更改R的deSolve中的参数值

简洁版本

正如评论中所建议的,我将在此处留下一个总结的简短版本的问题。原始的完整解释可以在下面找到。

总之,我目前正在使用 deSolve 包,并且有兴趣实现响应根函数的事件。我知道我可以使用此类事件来引入模型状态变量的突然变化,但我也想修改模型的参数值以响应此类根函数。

这可能吗?

长版

我已经在 R 中实现了一个轨道数值传播器(一个在给定初始位置和速度状态的情况下计算空间卫星位置的函数)。这个问题被表述为一组 6 个 ODE(位置和速度的 X、Y 和 Z 分量)。我实现的模型计算任何给定时间的加速度,然后我使用 deSolve 包执行积分并计算轨迹。

进行此类计算时必须确定的一个关键参数是参考系的中心,该参考系的中心通常放置在对卫星施加最显着引力影响的天体的质心处。这是因为,尽管原则上可以使用任意参考系进行积分和计算轨迹,但实际上我们只有将坐标中心放在施加主要引力影响的天体上才能获得合理的结果(即,地球用于地球轨道卫星,月球用于月球轨道卫星,等等),如本 SE 问题中所述。

最初,我的实现使用了一个恒定的坐标中心,或者由用户提供,或者根据不同主要天体的影响范围自动确定。

然而,这不适用于模拟行星际空间任务,因为施加主要引力影响的天体在轨迹期间会发生变化。一个很好的例子是阿波罗任务,卫星从地球轨道开始,然后移动到月球轨道。

我已经设法检测到中央天体的这种变化何时发生,并将其作为积分器结果的一部分返回。然而,为了实际执行正确的建模,当检测到这些变化时,需要更改集成期间使用的中心体。这个“改变中心体”的过程涉及两个任务(注意只是坐标中心的移动,不涉及旋转):

  1. 从卫星坐标中减去要用作新坐标中心的天体坐标(通过这样做,卫星坐标现在称为新天体)。
  2. 修改指定传递给计算加速度的函数的中央天体的参数的值,这是提供给定义 ODE 模型的函数的参数列表的元素之一。

我相信任务 1 可以通过使用根激活事件轻松解决。为此,我在专门为此目的创建的环境中定义了一个变量,该变量存储自动计算的天体的值,该天体在积分器的每次迭代中施加主要的引力影响。在新的迭代中,计算一个新值,并与之前的值进行比较。如果相同,则不会发生任何事情。但如果不同,根函数将返回 0,从而触发事件函数。然后,事件函数将返回减去新中央天体坐标的位置。

但是,我不确定如何执行任务 2,因为这将涉及更改提供给 ODE 模型的初始参数之一。对此的任何想法将不胜感激!(要么是我的方法的延续,要么是完全不同的方法)。

我留下了所涉及代码的简化版本。

我的 main 函数被称为hpop,并且是传递初始状态向量和其他参数的用户级函数。它看起来像这样:

odeModelODE模型func的代码的简化版本ode是:

0 投票
1 回答
32 浏览

r - 在不使用根的情况下满足特定条件时过早停止 R 的 deSolve 中的积分

我知道 R 的 deSolve 中的提前终止可以通过使用根函数而不提供事件函数来实现,这将导致在找到根时终止积分。但是,通过使用此过程,我们仅限于应用具有寻根能力的求解器。

事实上,我正在处理一个与根的确切位置无关的问题。我需要引入状态变量的突然变化,但发生这种情况的确切时间并不重要。所以我可以在满足条件时停止积分,用引入的突变重新计算一个新的起始状态向量,然后重新开始积分。这仍然让我能够灵活地使用通过 deSolve 包提供的众多求解器中的任何一个。

有推荐的方法吗?

编辑

让我们考虑下面的简化示例。所表示的系统是一个在 1 维中以恒定速度 1 移动的对象。该对象从位置 x=0 开始,并沿该维的正方向移动。我们的目标是执行坐标原点的更改,例如当对象距离原点 10 或更高的距离时,相对于 x=10 的点来引用位置。这可以简化为从此时的位置减去 10。

使用根,这可以实现如下:

但是,出于上述原因,我试图在不使用根的情况下执行此操作。可以通过在输出中包含一些变量(必须是数字,否则 deSolve 不会接受它作为每个评估时间的输出)来跟踪条件是否已满足,然后检查积分结果确定何时满足条件,应用所需的更改,从该点重新进行集成,然后组合输出。使用与之前相同的示例:

但是,这会导致无用的计算,因为 time=10 之后的积分会执行两次。在满足条件后停止第一次积分,然后直接进行第二次积分会更有效。这就是为什么我要问是否有任何方法可以在满足某个条件时停止集成,并将结果返回到该点