大规模半连续生物模型的推荐语言/环境

计算科学 Python C++ 正则 r 开放模型
2021-11-26 23:58:52

我们有一个相当大(可能有 1000 个方程)的微分代数方程模型,它是用 ACSLX 编写的,ACSLX 是一种类似于 Modelica 的过时建模环境。该模型代表了生物系统随时间的演变,具有几个强迫函数,例如大气温度,这些函数通常在每日或次日时间步长上提供。ACSLX 将模型(包括 DAE 求解器)转换为 C,然后编译成 DLL。我们在一个有点复杂的 GUI 中运行这个 DLL,通常以包含约 100 年模拟年的批处理模式运行。我们在 Windows 中。

出于面向未来的原因,我们需要将此模型转换为新的语言/环境,并且正在讨论最佳选择。

  • 它应该是免费的(以避免与 Matlab 之类的东西相关的费用和许可痛苦)。
  • 它应该得到很好的支持并且比较流行
  • 模型代码应该能够被生物科学家轻松阅读
  • 如果它能够在 RStudio 或 Spyder 等开发环境中运行将是有利的
  • 它应该可以从我们的 GUI 中调用(例如作为 DLL)
  • 它应该很快
  • 它应该有助于模型校准、灵敏度分析等。

我们目前在各种其他项目中使用 C++、Fortran、Javascript、R、SmallTalk。其他选项似乎是 Modelica、Python、C、Java、C#。目前尚不清楚我们是否需要像 ODEPACK 这样强大的 DE 求解器,或者我们是否可以编写自己的简单时间步进器,因为强制函数往往会否定高效 ODE 求解器的好处。

我们有一个类似的模型,它用 Fortran 90 编写并编译为我们从 RStudio 运行/校准的 DLL。虽然很难获得 Fortran 专业知识并且调试起来有点困难,但这种方法效果很好。Spyder/Python 将允许双方用一种语言完成,包括调试,尽管性能损失可能是一个问题。尽管 Cython 或 Dask 可能会有所帮助。Modelica 似乎是另一种选择,尽管支持似乎不完整,而且运行起来可能很慢。

我们非常感谢 SO 社区的任何建议/想法/经验。

谢谢您的帮助。

2个回答

你应该考虑试试 Julia。让我解释一下你现在感兴趣的设计领域正在发生的事情。全面披露我是 JuliaDiffEq 的首席开发人员。

JuliaDiffEq 和DifferentialEquations.jl有一个大型特征集,专门用于有效地集成计算困难的微分方程。它具有使用日益流行的高级语言的简单高级界面,因此入门门槛低。它可以通过JunoVSCode等开发工具使用。Julia 编程语言具有您在低级语言中所期望的所有变异功能,以优化您的派生函数,使其不分配且快速以您无法使用更高级别的“矢量化代码”的方式。它编译您的所有代码(以及执行过程间优化和内联之类的操作),以使您获得标准(类型稳定)Julia 函数所期望的速度。

关键是堆栈非常深。您提到您想要访问 ODEPACK,这将使您可以访问许多 ODE 求解器许多 DAE 求解器,其中包括 Netlib 和 ODEPACK 项目,如DASKRLSODASundial例如,像Sundials.jl这样的组件是直接自动生成的直接连接到底层 C++ 库的接口,因此您可以直接将任何 IDA C++ 代码转换为 Julia 代码并使用它您可以使用它直接调用日晷的灵敏度分析和预处理器功能,或通过更高级别的接口使用它们。我们的生态系统包括高级功能,例如敏感性分析参数估计

那就是如果你想直接写微分方程。上面的步骤是对特征进行建模。在 JuliaDiffEq 组件之上构建了一些建模库。我们正在创建一个小型化学反应网络建模设置

但这可能不是您想要的。你想要的是像 Modelica 这样的东西,它被创建为Modia.jl可以在此视频中找到概述它建立在 Sundials 的 IDA 之上,并自动执行索引缩减等操作。事实上,Modelica 的开发人员正在开发它作为下一步的发展方向。它还没有发布,因为我们正在清理一些东西(比如将 KLU 稀疏线性求解器编译到我们自动生成的日晷二进制文件中,因为这些是该应用程序最有效的选择),但 IMO Hilding 的“新 Modelica”已经看起来太好了,所以我希望它可以尽快发布。

此外,Julia 是一种可以编译的语言。这还处于非常早期的阶段,但是像static-juliaPackageCompiler.jl这样的提前编译 (AOT) 工具显示了这一点。

最后,它完全免费,拥有一个活跃的社区以及聊天室(还有一个专门用于微分方程的社区)。团队很大:我们团队有 30 人,有10 名导师负责 6 个 Google Summer of Code 项目,这些项目专门与 Julia 中的微分方程相关。因此,虽然年轻,但与许多(大多数?)其他开源微分方程生态系统相比,这表明开发人员的支持和活动要多得多。任何缺少的东西都可以用 Julia 编写(并且速度很快等)。我认为这符合您的观点,但如果不是,您可以随时提出功能请求

我们决定使用 C++,因为它

  • 免费
  • 很快
  • 有一个免费可用且得到广泛支持的数值积分库(boost/odeint)
  • 易于与我们更大的仿真驱动程序/GUI 集成
  • 广为人知
  • 使生物科学家可以轻松使用独立模拟(因为他们可以通过 Rcpp 将 RStudio 用作交互式模拟环境)

除了 C++,Python 似乎是可能满足这些标准的另一个选择。

C#被拒绝了,因为没有合适的数值积分库,也没有交互式仿真环境。

我正在使用 R 脚本将 CSL 代码转换为 C++ 以解析 CSL 代码。事实证明,这非常有效。通过 Rcpp 运行模型也被证明是简单的。我已经在 Github 上发布了这个项目

https://github.com/woodwards/csl2cpp