Lisp,OCaml还是Runge Kutta?

Lisp,OCaml还是Runge Kutta?,lisp,ocaml,numerical-methods,Lisp,Ocaml,Numerical Methods,您建议使用哪种语言来解决系统: 一阶微分方程 复变量 N维 使用四阶龙格库塔或类似方法 速度非常重要,但会牺牲: 优雅(简洁而简短)的代码 灵活性+可扩展性 我基本上处于Lisp和OCaml之间,但欢迎任何其他建议 谢谢 Fortran或C,可能需要研究。C语言会更灵活,更容易理解,但Fortran通常被认为是最适合数字运算的语言。很难说哪种语言最容易,有、、等库来实现这一点,如果这与个人偏好有关,那么很多都是如此。我想Matlab是专门为这类任务量身定做的最优雅的解决方案,它有很多。。

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

  • 一阶微分方程
  • 复变量
  • N维
使用四阶龙格库塔或类似方法

速度非常重要,但会牺牲:

  • 优雅(简洁而简短)的代码
  • 灵活性+可扩展性
我基本上处于Lisp和OCaml之间,但欢迎任何其他建议


谢谢

Fortran或C,可能需要研究。C语言会更灵活,更容易理解,但Fortran通常被认为是最适合数字运算的语言。

很难说哪种语言最容易,有、、等库来实现这一点,如果这与个人偏好有关,那么很多都是如此。我想Matlab是专门为这类任务量身定做的最优雅的解决方案,它有很多。。。Lisp可能有点慢。。。我不能为OCaml说话。

RK4是一种非常基本的方法,并且已经编写了许多优秀的实现。使用其中一个,并将精力花在项目的其他方面。

以下是RK在Common Lisp中的一个实现:

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


SBCL有一个优秀的本机代码编译器。

我不熟悉Runge Kutta,但OCaml通常可以提供良好的速度和可读性,至少如果您稍微小心一点的话。然后,对于应用程序的其余部分,您可以使用健壮的静态类型系统。

除此之外,您还可以为现有的C runge kutta解算器编写ocaml绑定。

我建议使用python+numpy+scipy,通用数学和数字支持(superbe多维数组)非常出色。无论如何,这取决于具体的需求。

C的数字模型,尤其是C99,实际上比Fortran的要好。Fortran用于这类事情是因为它易于编写,人们也熟悉它,而不是因为它提供了更好的数字环境。@Stephen-请不要在没有提供确凿证据支持的情况下给出这种“火焰战争开始”的观点。@Idigas:好的,我会支持它。一个简单的例子:当输入位于多个复杂函数(特别是平方根和对数)的分支上时,Fortran会选择“错误”的零符号作为结果。参见Kahan的优秀论文“复杂初等函数的分支切割,或者,关于无符号位的许多麻烦”,以了解Fortran选择低于C标准(遵循Kahan的建议)的示例。更一般地说,Fortran允许许多性能优化,这些优化可能会对数值稳定性产生负面影响,在C语言中是默认不允许的。我还想指出,您的评论应该真正针对James,因为“Fortran通常被认为是最适合数值计算的”=)@Idigas:回应您关于Fortran的约定“通常与计算机科学家习惯的约定不同”的评论:我是经过培训的数学家,而不是计算机科学家。我引用的作者威廉·卡恩(William Kahan,因其在数字方面的工作而获得图灵奖)也是一位数学家。Fortran在复杂算术中对零符号的约定、算术的重新关联以及其他在C中被正确称为“不安全”的优化,都会对严格的数值编程产生反作用。性能卓越,不利于再现性和正确性。*感谢您推荐GSLL!*不幸的是,matlab对我来说太慢了。实际上,我已经用C实现了所有东西,但现在我想扩展这个项目,所以我正在权衡我的选择……我不熟悉OCaml;),但Runge-Kutta()指的是一类数值求解微分方程组的算法。一阶龙格库塔算法(RK1)也称为欧拉方法(),但它往往会迅速失去精度。对于许多应用程序,四阶龙格库塔算法(RK4)提供了良好的精度和时间性能。我也喜欢CL原生bignum功能。CL不符合IEEE 754吗?你是对的,python在这方面也很好,但不幸的是,它太慢了。研究PydTool可能是值得的。虽然它是一个更通用的工具,但它可以从一个更面向数学的ODE规范中动态生成C解算器。新增奖金:庞加莱节(活动;))。