作为我荣誉年课程的一部分,当我开始解决计算物理学中的问题(这是基本的量子力学)时,我基本上没有编程经验(除了我在第一年上的一个学期课程 - 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 这样的语言会让你的生活轻松一百万倍。