学习计算物理学研究生课程需要什么样的计算机科学/工程知识?

计算科学 数值分析 计算物理学
2021-12-26 06:00:47

我想知道这是否是问这个问题的正确地方。我发现了一个有关堆栈溢出的相关问题https://stackoverflow.com/questions/814312/physics-in-computer-science但它已关闭。所以我在问我关于 SE Physics 的问题。

我打算学习研究生水平的计算物理研究。例如,它涉及解决线性代数、PDE、ODE 问题的编程(更具体的例子是有限体积、有限元、求解非线性方程的迭代方法)。我是机械工程专业的学生,​​具有基本的编程知识。在我的 ME 课程中,我没有大量编程。我刚看了本科的 CS 学位课程,发现我不知道大部分 CS 的东西——算法、计算机科学理论、并行计算等。这些知识可能对高效编程至关重要——就人类而言花在编程上的时间。我觉得一个CS专业的学生可以很容易地编程和调试;对于没有 CS 或计算机工程知识的物理初学者来说,这可能需要几个小时。

我很困惑一个 ME 专业的学生如何在没有 CS 或计算机工程背景的情况下进行计算物理研究。编程语言的知识是否足够?有人可以在这里发表评论吗?提前致谢。

3个回答

作为我荣誉年课程的一部分,当我开始解决计算物理学中的问题(这是基本的量子力学)时,我基本上没有编程经验(除了我在第一年上的一个学期课程 - Octave)。在学习如何在 FORTRAN 中编码的第一周,我们做了一些琐碎的事情,比如格式化文本以进行打印,以及编译包含在一个文件中的源代码。在第二周,我们使用射击法求解了 1D 薛定谔方程。到第四周,我们开始编写 Numerov-Cooley 方法,几周后(这是一个半学期的课程),在完成了一些任务之后,我们开始传播高斯波包。起初所涉及的数学有点棘手,但正是编程让外行人的生活变得非常困难。

大约在第五周,我了解了在编译程序时查看有用错误消息的选项!你的意思是你知道哪个数组引用越界了,你还没有告诉我?我很生气,这对于演讲幻灯片来说还不够重要。

无论如何,关于我的事情已经够多了,我的 80 小时编码周效率低得令人绝望,而这些都是在这门课程中取得成功所必需的……关键是你不想经历我经历过的事情,你也不必这样做。以下是课程,按重要性排序:

1) 如果您想解决数学问题,请不要将 FORTRAN 或 C 作为您的第一语言。这些语言(尤其是 C)只会减慢您完成科学计算课程的短期目标。相反,学习一门旨在帮助您更快编写有用代码的语言(Python 是理想的,但 Octave 和 Matlab 也有其优势)。安装 Python 和适当的模块(主要是 numpy)后,您将可以毫无问题地执行“简单”任务,例如将数据文件读入数组、对数据进行排序以及对其进行标准线性代数运算。相反,在 FORTRAN 中,您可能会放弃尝试为输入文件编写自己的解析器,或者在使 LAPACK 例程的一万个参数中的每一个都不正确后砸碎键盘。C 比 FORTRAN 更好学,但在您的情况下,它只会让编写数值例程更加令人沮丧,并且在您的文本编辑器中看起来更丑陋(C 是一种非常丑陋的语言 - 至少 FORTRAN 代码看起来有点像数学在页面上)。

2) 尽早、定期和在线寻求帮助。不要让简单的、特殊的交易技巧浪费你所有的空闲时间。你不知道这些没关系;这是不直观的。

3)如果你不能及时调试代码,不要用hacks和任意的“bug修复”来破坏它。提交您的简明伪代码以及源代码,并提供清晰的问题记录。有时,只有时间和头脑清醒会有所帮助,而在其他时候(通常在您第一次学习时),您只需要更有经验的人的帮助。

4) 在开始规划代码之前先搞清楚数学。算法被人类在纸上理解,然后通过编程语言传授给计算机。如果你弄错了算法,你将永远无法找到错误,因为它实际上并不存在(你只是正确地编码了错误的算法)。

5)忘记并行计算,直到你“掌握”了为一个处理器编写程序。大多数计算科学家只是依靠这里同事的专业知识。

总结:尽快学习Python,尝试用numpy解决线性代数问题。使用像 Python 这样的语言会让你的生活轻松一百万倍。

您是对的,就软件方面而言,一个典型的 CS 学生在本科期间进行了很多编程,可能比具有基本编程经验的人表现得更快。但是,他们可能没有你可以拥有的坚实的物理背景,因此显然双方在计算物理方面都有自己的弱点。

参与计算科学的事情不仅是你需要在实际科学中有坚实的基础,而且理想情况下你应该有足够强大的软件和算法能力。正如 Wolfgang 在评论中提到的,其中很大一部分只是练习。只要你有时间,数据结构之类的东西也是一个有用的学习主题,但是你可以对每种数据结构的最佳用途有一个基本的了解,只需使用语言库附带的数据结构实现即可。

归根结底,您可能开始做的最有益的事情就是尝试使用您希望使用的任何语言进行大量练习编程。在您了解 C 的基础知识之后,我可能会建议您研究 Fortran 或 C,也许是 C++。

我还建议购买一两本书,不仅可以帮助学习语言,还可以帮助学习构建好的软件。想到的一些书是C++ 中的 API 设计清洁代码请注意,C++ 中的 API 设计实际上教了很多与语言无关的键来构建好的软件,因此无论您是否使用 C++,这都是有用的。我强调开发这个背景,因为没有它,你最终可能会构建难以维护的代码,这些代码有缺陷,从长远来看,这反过来又会导致大量时间的浪费。从长远来看,努力构建干净和模块化的东西确实可以节省时间,即使你预先付出了更多的努力。

在掌握了这些基础知识之后,您应该研究更高级的主题,例如并行计算。

典型的计算物理课程将对学生的编程能力抱有适度的期望。物理课程通常只涵盖基本编程。从“编码”的角度来看,你不应该那么担心。

如果您仍然担心,请考虑遵循在线教程,其中该语言是您计划的课程中使用的语言。