【问题标题】:Non Negative ODE Solutions with functools in R?在 R 中使用 functools 的非负 ODE 解决方案?
【发布时间】:2019-10-30 01:06:18
【问题描述】:

我正在尝试实现一个处理非负 ODE 系统的 R 算法。我需要 MATLAB 中的 ode45 之类的东西来定义必须为非负数的状态。

我在 3 年前就讨论过这个问题,但没有真正的解决方案。 deSolve 仍然不是要走的路。我发现了一些看起来很有前途的 Python 代码。也许这在 R 中也是可能的。最后我必须定义一个函数包装器,作为python中的functools。它的作用非常简单。这是python包装器的代码:

def wrap(f):

        @wraps(f)

        def wrapper(t, y, *args, **kwargs):

            low = y < 0

            y = np.maximum(y, np.ones(np.shape(y))*0)

            result = f(t, y, *args, **kwargs)

            result[too_low]  = np.maximum(result[low], np.ones(low.sum())*0)


            return result

        return wrapper

    return wrap

我的意思是在 python 中这是直截了当的。包装器将在由

调用的集成的每个步骤中使用
solver = scipy.integrate.odeint(f, y0)
solution = solver.solve()

在 R 中是否也有可能?我知道还有一个 functools 包和 functools 函数。但我不知道这是否真的有效。我可以为此使用 deSolve 中的事件吗?

我现在在这个项目上工作了 5 年,但我没有想法。我使用了 MATLAB、C++ 和 Python 接口,但这一切都很慢,我在 R 中需要它。非常感谢您的帮助!

【问题讨论】:

  • 我没有看到minimal reproducible example。如果这个“被讨论过”,那么你应该提供一个链接。使用 Python 的外部包之一在 Python 中提供代码不会对 R 程序员提供特别丰富的信息。同样没有信息的是说 deSolve “不起作用”。
  • 您在求解稳态解吗? stode 和来自deSolvesteady.1Dpositive = TRUE 以确保解决方案是积极的。此外,ode45 被实现为deSolve 中的一个方法。如果您给我们提供了一个 R 示例,但它没有给出您想要的结果,那将会很有帮助,这样我们就可以修复它以获得您想要的结果。

标签: python r matlab ode functools


【解决方案1】:

deSolve 不支持自动非负约束是有充分理由的。我们过去曾多次遇到此类问题,但在所有这些情况下,结果都是负值的原因是模型规范不完整。典型的情况是从空池中导出某些内容。因为不需要的负值通常表明模型规范不充分,所以我们(目前)不考虑在未来添加“非负”约束。

示例:在以下等式中,X 可以通过模型设计变为负数:

dX/dt = -k

而以下不能:

dX/dt = -k * X

如果您需要“大多数时候”线性减少,在 X 变为零之前不久减少到零,您可以使用 Monod 类型的保护措施(或类似的东西):

dX/dt = -k*X / (k2 + X)

k2 的选择相对不挑剔。与求解器的数值精度相比,它应该足够小,不会影响整体行为,也不能太小。

另一种避免负值的方法是在对数变换空间中工作。以下是一些相关主题:

https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2010q2/000028.html

https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2013q3/000222.html

https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2016/000437.html

此外,当然也可以在R中编写自己的包装器。

希望对你有帮助

【讨论】:

  • 感谢您的回答。在这种情况下,我真的需要某种包装器。你知道如何实现吗?或者是否可以在 deSolve 的每个时间步调用事件函数?
  • 是否需要以及如何需要包装器,取决于特定的问题。您能否添加一个最小可重现示例,即 R 中的一个小模型,您认为负值是一个问题?
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 2022-01-11
  • 1970-01-01
  • 2016-12-22
  • 2018-09-23
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多