计算物理/为什么是计算物理?
计算物理是研究和实施数值算法以及利用计算机使计算变得容易的技术。
本课程的目的是向学生展示计算机如何通过大幅增加我们可以方便地执行的数学计算范围,使我们能够扩展和深化对物理学的理解。
我们对计算物理学的做法是在高级科学语言(即 FORTRAN 或 C++)中编写自包含的程序。当然,还有许多其他可能的方法,每种方法都有其独特的优缺点。简要检查可用的选项是有益的。
基本上,我们可以通过三种方法执行我们在本课程中将遇到的数值计算。
首先,我们可以使用数学软件包,如 MATHEMATICA、MAPLE 或 MATLAB。这些软件包的主要优势在于它们促进了数值问题的快速编码。主要缺点是它们生成的执行代码是解释的,而不是编译的。编译后的代码直接从高级语言翻译成机器代码指令,这些指令定义上是平台相关的,毕竟,英特尔 x86 芯片的指令集与 Power-PC 芯片完全不同。解释后的代码从高级语言翻译成一组与平台无关的元代码指令。然后,每个元代码指令都翻译成一组固定的机器代码指令,这些指令是代码运行的特定硬件平台所特有的。一般来说,就计算机资源利用率而言,解释后的代码远不如编译后的代码高效:即解释后的代码运行速度远不如等效的编译后的代码。因此,尽管 MATHEMATICA、MAPLE 和 MATLAB 是执行相对较小的计算的理想环境,但它们不适合完整的科研项目,因为它们生成的代码通常运行速度太慢。
其次,我们可以在高级语言中编写自己的程序,但使用对常用子程序库(如 NAG、4 LINPACK、5 和 ODEPACK、6)中预先编写的、预先编译的例程的调用来执行所有实际的数值工作。这是大多数研究物理学家使用的方法。
第三,我们可以从头开始完全用高级语言编写自己的程序。这是本课程中使用的方法。我选择不使用预先编写的子程序库,仅仅是因为我希望学生培养独立思考科学编程和数值技术的能力。然而,学生应该意识到,在许多情况下,预先编写的库例程为数值问题提供了难以改进的解决方案。
最适合科学编程的高级语言是什么?不幸的是,这是一个极具争议的问题。多年来,已经开发了数百种高级语言。然而,只有少数经受住了时间的考验。许多语言(例如 Algol、Pascal、Haskell)可以被视为短暂的计算机科学潮流。其他语言(例如 Cobol、Lisp、Ada)过于专门化而无法适应科学用途。让我们检查一下剩下的选项。
FORTRAN 是第一个开发的高级编程语言:事实上,它比下面列出的语言早了几十年。在 FORTRAN 出现之前。此外,FORTRAN 是专门为科学计算而设计的。事实上,在计算机的早期,所有的计算都是科学性质的,即物理学家和数学家是最初的计算机科学家!FORTRAN 的主要优势在于它非常直观,并且与大多数常用的预先编写的子程序库(因为这些库通常包含编译后的 FORTRAN 代码)很好地集成。FORTRAN 的主要缺点都与其相对古老的历史有关。例如,FORTRAN 的控制语句相当原始,而它的输入/输出功能简直是史前时代的。
这门语言最初由计算机科学家开发来编写操作系统。事实上,所有 UNIX 操作系统都是用 C 语言编写的。因此,C 是一种非常灵活且功能强大的语言。它的主要优势包括良好的控制语句和出色的输入/输出功能。C 的主要缺点是,因为它不是专门为科学语言而编写的,所以缺少一些重要的科学功能(例如复数运算)。尽管 C 是一种高级语言,但它包含了许多相对低级的功能,例如指针(这并不奇怪,因为 C 最初是为编写操作系统而设计的)。C 的低级功能(特别是对数组的相当原始的实现)有时使科学编程比必要时更复杂,并且无疑促进了编程错误。另一方面,这些功能使科学程序员能够编写极其高效的代码。由于效率通常是科学计算中最重要的问题,因此 C 的低级功能总的来说是有利的。
这门语言是 C 的主要扩展,其主要目的是促进面向对象的编程。面向对象是与更传统的程序式方法完全不同的编程方法:它特别适合大型项目,涉及许多人,每个人都编写同一代码的不同部分。然而,对于本课程中考虑的这种简单、单人编程任务类型,面向对象代表着大量的、多少有些不必要的开销。但是请注意,C++ 包含了一些对 C 的非面向对象的扩展,这些扩展非常有用。在上述语言中,我们可以立即排除 C++,因为面向对象是一个不必要的复杂化(至少,就我们的目的而言),以及 FORTRAN 90,因为缺乏廉价的编译器。剩下的选项是 FORTRAN 77 和 C。我选择在本课程中使用 C++(因为它不仅可以面向对象,也可以像 C 那样进行程序式编程),仅仅是因为我发现 FORTRAN 77 的复杂功能令人尴尬,无法在 21 世纪教给学生。