我应该选择什么编程语言,为什么?

计算科学 有限差分 流体动力学 有限体积 语言
2021-12-04 01:58:25

我是一名机械工程师,MATLAB 和 MATHEMATICA 中级/高级,Python 初学者。我打算获得气动弹性(FEM + CFD)博士学位并编写自己的程序。

我打算这样做,因为我真的很喜欢编码,这是我想要拥有的技能。由于网格很大,这些计算方法非常耗时,所以我知道我需要一种更高效的语言来编码。

我已经在 MATLAB 和 MATHEMATICA 中为 FEM 和 CFD 编写了一些基本程序。当我还是一名本科生时,这是一件奇怪的事情。我的顾问用 Fortran 编写了一个程序。由于经验不足且时间短,我将 Fortran 代码翻译成 MATLAB。我的顾问代码运行了大约 5 秒,而我的 MATLAB 代码运行了大约 5 分钟。可能我的代码可以更高效,但我认为在编辑我的代码的同时很难。

基于此,您向我推荐什么以及为什么推荐语言?

  1. C++
  2. Fortran
  3. Python

提前感谢大家的所有建议。

4个回答

你一定要看看JuliaJulia 是一种类似于 Python 或 MATLAB 的编程语言,但利用强大的类型推断算法 + JIT 来优化代码。如果可以在函数中完全推断类型(通常可以),那么代码将以完全静态的方式编译,与 C 或 Fortran 性能相匹配。将数学 MATLAB 代码转换为 Julia 通常只需将一些代码更改A(i)A[i](您可能会发现值得注意的差异页面或QuantEcon MATLAB-Python-Julia 备忘单特别有用),并且看到 1-2 范围内的加速并不少见数量级(当然,如果代码时间没有完全由 BLAS 内核的速度决定)。

它是一种功能齐全的编程语言,包含用于微分方程、机器学习等的软件包,所有这些都易于访问。一个搜索配套工具的好网站是JuliaHub这是跨语言求解微分方程的一些基准(注意:我是这些基准的作者)。以下是一些专门的 CFD 计算示例:

当然是 YMMV,但对我来说效果很好。

从简单开始。学习 Python。

我已经获得了四十多年的报酬来编写程序,并且我使用了其他答案中提到的所有语言(Julia 除外——我以前从未听说过)。每种语言都有其优点,并且大多数都有其缺点。与人类语言一样,代码是一种表达和构建想法的方式,当您知道如何编程时,您可以选择能够帮助您以最适合您尝试解决的问题的方式表达想法的语言。然而,当你还在学习的时候,你使用的语言会框定和限制你能够表达的想法,从而限制你能够考虑的解决方案。

在我使用过的所有语言中,Python 的优点是总是有很多方法来实现给定的结果,并且总是有一种更优雅的方法。(他们使用术语“Pythonic”解决方案)。它足够简单和连贯,可以成为教孩子编程的理想语言,同时也是数据分析和 AI 和 ML 的首选语言。它还有一个我认为值得一提的优势;Python 是一种通用语言。如果您使用 Python 开发解决方案,通常很容易将其翻译成特定部署所需的任何语言。

你想达到什么目的?

如果您想开发方法/算法,您可能更喜欢灵活且熟悉的语言。正如您在问题中所说,您教授的 Fortran 代码对您来说很难掌握,因此您在 MATLAB 中重新实现了它。这是进行方法开发的非常自然的方式:首先你用你熟悉的语言实现你的想法;然后在第二步中,当所有初期问题都解决后,您可以用一种高性能的语言重新实现您的方法。

如果您想解决(计算量很大的)问题,那么您或多或少会受到可用框架的限制。很有可能您将获得(选择)现有软件,这些软件可用于/扩展用于您的目的。这使您无法选择编程语言。


我在计算流体动力学 (CFD) 和离散元法 (DEM) 领域工作。在这里,计算框架决定了编程语言,因为从头开始开发计算软件并解决问题是不可能的。
此外,单独解决一个特定问题可能已经够难了,那么如果其他人在我之前这样做过,为什么还要处理数字、CFD 等的技巧呢?

我强烈推荐给任何人,无论背景如何,都学习

  • 低级“快速”语言(C、Rust、C++、Go)
  • 高级脚本语言(Python、MATLAB、Mathematica、R、bash)

作为一般陈述,低级语言更精确地控制硬件并且非常高效,而高级语言更容易编写/描述逻辑。此外,高级语言非常适合控制精确的低级逻辑。

由于这种关系以及构建和验证代码问题的各种解决方案,以及贡献者的背景和偏好,任何规模的项目都不太可能纯粹用一种语言编写。


为了您的目的,现代高级语言将拥有高质量的数学和模拟库,这些库是用低级语言(通常是 C)编写的。

了解低级库代码的工作方式将有助于解决在高级语言中使用库时遇到的问题。

来自著名的 [Python] 库的示例

西皮

GitHub 上的 Scipy

openssl

GitHub 上的 openssl

火炬

GitHub 上的 Pytorch