用 Python 以符号和数字方式开发 PDE

计算科学 pde 时间积分 龙格库塔 符号计算
2021-12-13 22:14:55

我想发表我博士论文中的一些以前的作品。我正在使用 Mathematica 通过符号空间泰勒展开为 2N 函数构建一个 2N 偏微分方程系统,然后将它们与NDSolve时间进行数值积分。

Mathematica 对于某些 N 阶有一个奇怪的行为,停止到一些我当时无法管理的明显数值奇点。此外,我可以使用不提供 Mathematica 的超级计算机。因此,我想用 Python 重建我的模型。

对于符号部分,我猜 SymPy 将轻松处理泰勒展开部分(请注意,在订单 2 或 3 之后,Mathematica 编写 PDE 系统的时间远远超过一整页,我应该要求它)。但是你如何在数值上(Runge-Kutta 或其他)解决来自 SymPy 的对象?

2个回答

但是你如何在数值上(Runge-Kutta 或其他)解决来自 SymPy 的对象?

这在很大程度上取决于您的具体问题以及您需要的优化级别。

  • 大多数 ODE 求解器(例如 SciPy 中包含的那些)都要求您为它们提供一个表示 ODE 右侧的 Python 函数。由于您不希望事情变得非常缓慢,因此您必须以某种方式处理矢量化:

    • 根据您的 PDE 的结构,这可能会使用lambdify带有 NumPy 后端的 SymPy。
    • 另一种选择是SymPy 的ufuncifyfunction
    • 最后,我编写了一个模块,该模块接受 SymPy 输入,对其进行编译,并将其输入到 SciPy 集成器中。这不需要矢量化结构,但也不能很好地利用它们(因为它是考虑到不可矢量化的问题)。

    无论哪种方式,他的意思是你必须在 SymPy 级别上处理空间离散化。您也将无法使用特定于 PDE 的优化技术,尤其是那些涉及 GPU 的优化技术;不过,您可能会获得多内核支持(如果这就是您想要使用超级计算机的方式)

  • 您可以将 SymPy 的结果转换为特定于 PDE 的 Python 工具所需的任何输入。这可能涉及某种元编程(编写代码的代码),但可能是无害的。请注意,SymPy 具有多个代码打印机和类似功能,可以帮助您完成此操作。

我想指出PyODESys是一个 Python 库,它完全符合您的要求:将 SymPy 表达式发送到 ODE 求解器。这很好,因为它链接到更多求解器,但@Wrzlprmft 的 JITCODE 可能更好,因为它编译结果表达式,并且用户函数的运行时对于有效求解 ODE 非常重要。