科学程序员的阅读列表

50

我正在努力成为一名科学程序员。我的数学和统计背景足够,但在编程方面缺乏经验。我发现很难学习如何使用语言进行科学编程,因为大多数SP的参考资料都是琐碎的。

我的工作涉及统计/金融建模,没有涉及物理模型。目前,我广泛使用Python与numpy和scipy。我也熟悉R/Mathematica,具备阅读C/C++代码的能力,但没有Fortran的经验。

我不知道这是否是一位科学程序员所需的好编程语言列表。如果是,那么有哪些适用于科学领域的语言语法和设计模式的阅读清单呢?


你将使用哪些编程语言? - James Black
@ James。在原型设计中,我需要能够快速或高效地完成工作的任何东西。我没有受到几乎任何限制,但必须是其他人可以阅读的内容。 - leon
“这是问题的设计模式在科学环境中的语言。即使那些声称涵盖此类内容的书籍通常都是胡说八道。学习C++,让经验(和数值计算)教你,或者坚持使用R或Numpy(两者都很棒)。" - Alexandre C.
17个回答

39

25

我强烈推荐

Barton 和 Nackman 所著的《Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples》。虽然有些年代久远,但内容非常优秀。如果你喜欢用 C、C++ 或 Fortran 编程语言,那么 Numerical Recipes 就是一部非常全面且能让你从中学到很多东西的优秀指南,但并不总是为每个问题选择了最佳算法。

此外,我也很喜欢 Karniadakis 所著的《Parallel Scientific Computing in C++ and MPI: A Seamless Approach to Parallel Algorithms and their Implementation》,越早开始学习并行计算就越好。


5
任何情况下都不要使用Numerical Recipes来尝试学习编程语言。 - Graphics Noob
7
糟糕,太晚了,大约晚了25年。哦,多么浪费的人生啊。我坚持认为《数值计算方法》是学习科学编程的绝佳教材,这不仅仅是关于一门编程语言。 - High Performance Mark
3
数值计算方法25年前还可以,但今天已经过时了。 - J D

11
我的第一个建议是,您可以查看您所在领域的前五所大学,了解他们正在教授什么以及教授使用哪些研究方法。这样您就可以发现相关的语言/方法。
此外,请看这个stackoverflow问题(“在科学环境中编程的实践”)
您正在进行统计/金融建模吗?我自己在这个领域使用R, 它正在迅速成为统计分析的标准,特别是在社会科学领域,但在金融领域也是如此(例如,请参见http://rinfinance.com)。Matlab可能仍然在工业界使用更广泛,但我有一种感觉,这可能正在改变。如果性能是主要因素,我只会退而求其次使用C++。
查看这些相关问题以获取有关R相关阅读材料的帮助:

就统计和金融方面的书籍推荐而言,我认为最好的选择仍然是 David Ruppert 的 "Statistics and Finance"你可以在这里找到大部分 R 代码作者的网站上有 MATLAB 代码)。

最后,如果你的科学计算不涉及统计学,那么我认为Mathematica是最好的工具。在程序员中似乎很少提到它,但在我看来,它是纯科学研究的最佳工具。它比matlab更好地支持积分和偏微分方程等事项。他们在wolfram网站上有一份很好的书籍列表

10
关于编程语言,我认为你已经涵盖得很全面了。Python适用于实验和原型开发,Mathematica在处理理论问题时非常好用,如果需要进行严格的数字计算,则可以使用C/C++。 我还建议您了解汇编语言和函数式语言(例如Haskell),不是因为您需要使用它们,而是因为它们对您的编程技能和风格以及所带来的概念影响很大。它们未来也许会派上用场。 我认为学习并行编程(并发/分布式)非常重要,因为这是获取某些科学问题所需的计算能力的唯一方法。在这方面接触函数式编程将非常有帮助,无论您是否真正使用函数式语言来解决问题。 不幸的是,我没有太多阅读建议,但您可能会发现《科学家和工程师的数字信号处理指南》很有帮助。

我非常欣赏 Haskell :) - leon
在这种情况下,学习汇编语言。我个人认为最好的方法是使用汇编语言编写一个玩具内核,因为除此之外,你还将学到很多其他东西。 - Artelius
哦,对了,还有《计算机程序设计艺术》(作者Knuth)。 - Artelius
通过学习汇编语言,你将会学到无数的事情,但这就像是说在学习生物学之前先学习物理学。当然,你会学到很多知识,但(a) 并非每个人都需要深入了解计算机或软件的工作原理(虽然具备更广泛的知识也是一件好事),(b) 还有其他更适用于他的研究领域的路径,可以提供更多的见解。 - metal
@mlimber:这是一个观点问题。请注意,我在这个问题上使用了“建议”和“我的看法”。原帖发布者应该选择适合自己的东西。 - Artelius

7
我是一名科学程序员,过去两年刚进入这个领域。我对生物和物理建模更感兴趣,但我想你要找的东西可能非常相似。当我申请工作和实习时,有两件事我认为不那么重要,但导致我错失机会。其中一个是MATLAB,已经有人提到了。另一个是数据库设计——无论你在SP的哪个领域,都可能有大量需要管理的数据。
Michael Hernandez的书《Database Design for Mere Mortals》被推荐给我,作为一个很好的起点,并在我的准备工作中帮助了我很多。如果你还没有了解一些基本的SQL,我也建议你至少了解一下。

6
我建议任何一本数值计算书籍(选择一种语言)都会很有用。
根据您使用的语言或者是否需要可视化,可能会有其他建议。
我非常喜欢另一本书面向对象的数值方法实现,作者是Didier Besset。他展示了如何在Java和smalltalk中解决许多方程问题,但更重要的是,他在帮助人们优化方程以在计算机上使用以及如何处理由于计算机限制而产生的错误方面做得非常出色。

+1 给 Besset。NR 书需要保持怀疑态度——代码很糟糕,但通常是可用的。 - Drew Hall
我永远不会原谅NR(即使是第三版,2007年)建议人们将信号填充到2的幂。这样做毁掉了那么多工作... :-( - J D

4

4
唐纳德·科恩的《半数值算法》一书。

4

MATLAB广泛应用于工程设计、快速开发甚至生产应用(我的当前项目有一个MATLAB生成的DLL,用于执行一些高级数字计算,比在我们的本地C++中更容易实现;我们的FPGA也使用MATLAB生成的核进行信号处理,这比手动在VHDL中编码要容易得多)。此外,还有一个金融工具箱对您可能感兴趣。

这并不意味着MATLAB是您领域的最佳选择,但至少在工程领域,它被广泛使用且不会很快消失。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接