与 Mathematica 8.0 NDSolve 相比,用 C 语言编写的 ODE 求解器是否可能使用 GSL 库具有显着的速度优势?在准确性方面如何公平?
我的理解是编译代码原则上可以更快,但是这些天 NDSolve 本身已经以某种方式使用了很多编译代码?
还有任何选项可以使用 MathLink 或 Mathematica 的 compile 函数来加快求解 ODE 的速度吗?
与 Mathematica 8.0 NDSolve 相比,用 C 语言编写的 ODE 求解器是否可能使用 GSL 库具有显着的速度优势?在准确性方面如何公平?
我的理解是编译代码原则上可以更快,但是这些天 NDSolve 本身已经以某种方式使用了很多编译代码?
还有任何选项可以使用 MathLink 或 Mathematica 的 compile 函数来加快求解 ODE 的速度吗?
Mathematica 中的 NDSolve 和其他数值函数会自动将您的操作数(例如 ODE 的 RHS)编译为中间“字节码”语言(与 Compile 函数使用的语言相同)。如果您愿意,您可以指定CompilationTarget -> "C",并且该函数将一直编译为 C 代码并链接回 Mathematica ... 您可以在 Mathematica Stack Exchange 上的上一个问题中自己查看生成的 C 代码:
当然,原则上总是可以手写一个更快的算法……但是有很多事情需要优化,Mathematica 会自动完成。例如,您可能不想负责手动优化优化问题中偏导数的稀疏矩阵的计算。
Mathematica 的重点是可用性。他们确实使用数字库。所以速度将与最好的可用库相同或更糟(几乎在所有情况下)。例如,我听说他们使用 eigen 作为矩阵的东西。
您应该考虑的另一件事是,尽管它们优化了它们提供的功能,但您自己的功能并未优化。因此,您在每一步计算的导数在 c 中会更快。
对于在mathematica 和c++ 之间做出选择的朋友,我告诉他们选择mathematica,因为他们应该专注于快速获得结果,而不是构建最快的代码。