【问题标题】:Lisp, OCaml or what for Runge Kutta?Lisp、OCaml 还是 Runge Kutta 的什么?
【发布时间】:2011-02-23 21:04:20
【问题描述】:

您建议使用哪种语言来解决系统问题:

  • 一阶微分方程
  • 复杂变量
  • N 维

使用 4 阶 Runge Kutta 等。

速度很重要很多,但会牺牲:

  • 优雅(简洁)的代码
  • 灵活性 + 可扩展性

我主要介于 Lisp 和 OCaml 之间,但欢迎任何其他建议。

谢谢!

【问题讨论】:

    标签: lisp ocaml numerical-methods


    【解决方案1】:

    下面是 RK 在 Common Lisp 中的实现:

    http://github.com/bld/bld-ode/blob/master/rk.lisp

    Common Lisp 的好处在于,您可以从简单而优雅的代码开始,然后让关键位快速运行(例如,通过从主要功能性计算切换到有状态计算,或通过声明类型)。

    SBCL 拥有出色的原生代码编译器。

    【讨论】:

    • 我也喜欢 CL 原生的 bignum 功能。
    • CL 不符合非 IEEE 754 标准吗?
    【解决方案2】:

    RK4 是一个非常基础的方法,已经编写了很多优秀的实现。使用其中之一,然后将精力花在项目的其他方面。

    【讨论】:

    • 实际上,我已经用 C 实现了所有内容,但现在我想扩展项目,所以我正在权衡我的选择......
    【解决方案3】:

    我不熟悉 Runge Kutta,但 OCaml 总体上可以提供良好的速度和可读性,至少如果你有点小心的话。然后,您就可以在应用程序的其余部分使用健壮的静态类型系统。

    【讨论】:

    • 我不熟悉 OCaml ;),但 Runge-Kutta (en.wikipedia.org/wiki/Runge_kutta) 指的是一类用于数值求解微分方程组的算法。一阶 Runge_Kutta 算法 (RK1) 也称为欧拉方法 (en.wikipedia.org/wiki/Euler_method),但它往往会迅速失去准确性。对于许多应用,四阶龙格库塔算法 (RK4) 提供了良好的准确性和时间性能。
    【解决方案4】:

    除此之外,您还可以将 ocaml 绑定写入现有的 C runge-kutta 求解器。

    【讨论】:

      【解决方案5】:

      很难说哪种语言最简单,有lispC++C# 等库来实现这一点,如果它与个人喜好有关,那就很多了。我推测 Matlab 是专门针对这些类型的任务最量身定制和最优雅的解决方案,它有很多 built in support for ODEs... Lisp 可能比较慢...而且我不能代表 OCaml。

      【讨论】:

      • * 感谢您推荐 GSLL! * 不幸的是,matlab 对我来说太慢了
      【解决方案6】:

      我建议使用 python+numpy+scipy,一般的数学和数值支持(超级多维数组)非常好。无论如何,这取决于具体需求。

      【讨论】:

      • 你说得对,python 也很擅长这个,可惜太慢了。
      • 研究 PyDSTool 可能是值得的。尽管它是一个更通用的工具,但它可以动态地从更面向数学的 ODE 规范生成 C 求解器。额外奖励:Poincare 部分(活动;))。
      【解决方案7】:

      Fortran 或 C,可能需要查看 NAG routines。 C 会更灵活,更容易理解,但 Fortran 通常被认为是最适合数字的。

      【讨论】:

      • C 的数字模型,尤其是 C99,实际上比 Fortran 的要好。 Fortran 用于这类事情是因为它易于编写并且人们熟悉它,而不是因为它提供了更好的数字环境。
      • @Stephen - 请不要在没有提供确凿证据支持的情况下给出这种“火焰战争开始”的意见。
      • @Idigas:好的,我会备份它。一个简单的例子:当输入位于几个复杂函数(尤其是平方根和对数)的分支切割上时,Fortran 选择了“错误”的零符号作为结果。有关 Fortran 选择不如 C 标准(遵循 Kahan 的建议)的示例,请参阅 Kahan 的优秀论文“复杂基本函数的分支切割,或者,无事生非的符号位”。更一般地说,Fortran 允许许多性能优化,这些优化可能会对数值稳定性产生负面影响,而 C 语言默认不允许这样做。
      • 我还要指出,您的评论真的应该针对 James,因为“Fortran 通常被认为最适合数字”=)
      • @Idigas:回应您的评论,即 Fortran 的约定“通常仅与计算机科学家习惯的不同”:我是受过训练的数学家,而不是计算机科学家。我引用的作者威廉·卡汉(William Kahan)(因其在数字方面的工作而获得图灵奖)也是一位数学家。 Fortran 对复杂算术中零符号的约定、算术重新关联以及其他在 C 中被正确称为“不安全”的优化与严格的数值编程相反。对性能很好,但对再现性和正确性不利。
      猜你喜欢
      • 2015-03-19
      • 2023-02-18
      • 2016-05-17
      • 2014-03-11
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多