科学程序员阅读清单
我正在努力成为一名科学程序员。 我在math和统计方面有足够的背景,但缺乏编程背景。 我发现学习如何使用一种语言进行科学编程是非常困难的,因为大多数SP的参考文献都是微不足道的。
我的工作涉及统计/财务build模,没有涉及物理模型。 目前,我广泛使用Python和numpy和scipy。 完成R / Mathematica。 我知道足够的C / C ++来读取代码。 没有Fortran的经验。
我不知道这是不是一个科学程序员的语言清单。 如果是这样的话,在科学环境中学习这些语言的语法和devise模式是一个很好的阅读列表。
在某个阶段,你将需要浮点运算。 做得不好,做得不够好,容易做得不好。 这篇文章是必读的:
计算机科学家应该知道什么是浮点运算
我彻底推荐
科学与工程C ++:Barton和Nackman的“高级技术与实例介绍”
不要被它的年龄推迟,这是非常好的。 您最喜欢的语言(只要是C,C ++或Fortran)的数值食谱是简明扼要的,而且非常适合学习,而不是每个问题的最佳algorithm。
我也喜欢
并行科学计算在C + +和MPI:一种无缝的并行algorithm和Karniadakis实现
越早开始并行计算越好。
我的第一个build议是,你看看你的具体领域的前5所大学,看看他们在教什么,教授用什么来研究。 这就是你如何发现相关的语言/方法。
也看看这个计算器的问题(“在科学编程环境中的做法”) 。
你在做统计/财务build模? 我自己在这个领域使用R ,它正在迅速成为统计分析的标准,特别是在社会科学领域,但在金融领域也是如此(参见http://rinfinance.com )。 Matlab可能还在工业中得到了更广泛的应用,但是我有这种感觉可能会改变。 如果性能是一个主要因素,我只会回到C ++作为最后的手段。
看看这些相关的问题,以帮助find与R有关的阅读材料:
- 合适的官能化的语言换科学-统计的计算
- 书换学习的-R语言
- 什么,可待完成,在-R-说,斜面待完成与-中的python-numpy的,SciPy的
- R-对金融-教程资源
在统计和金融相关书籍推荐方面,我仍然认为最好的一般select是David Ruppert的“统计与金融” ( 你可以在这里find大部分的R代码 , 作者的网站有matlab代码 )。
最后,如果你的科学计算不是统计的,那么我认为Mathematica是最好的工具。 程序员似乎很less提及,但在我看来,它是纯科学研究的最佳工具。 它对matlab等积分和偏微分方程有更好的支持。 他们在wolfram网站上有很多书籍 。
在语言方面,我认为你有很好的覆盖面。 Python非常适合实验和原型devise,Mathematica非常适合用于理论工作,如果您需要进行严格的数字处理,那么C / C ++就在那里。
我也可能会build议你开发汇编语言和函数式语言(比如Haskell),而不是真的使用它,而是因为它们对你的编程技巧和风格的影响,以及它们带来的概念给你。 有一天他们也可能会派上用场。
我也认为学习并行编程(并发/分布式)是至关重要的,因为这是获得有时对科学问题有必要的计算能力的唯一方法。 在这方面,接触函数式编程是非常有用的,不pipe你是否真正使用函数式语言来解决这个问题。
不幸的是我没有太多的build议在阅读的方式,但你可能会发现“科学家和工程师的数字信号处理指南”有帮助。
我是一个在过去两年刚刚进入这个领域的科学程序员。 我进入了更多的生物学和物理学模型,但我敢打赌,你所寻找的是非常相似的。 当我申请工作和实习时,有两件事情我不认为是重要的,但是最终导致我错过了机会。 一个是已经提到的MATLAB。 另一个是数据库devise – 不pipe你在哪个领域,都可能会有很多数据需要被pipe理。
Michael Hernandez的“ 单纯的凡人数据库devise”这本书被推荐给我,因为这是一个很好的开始,在我的准备中帮了我很大的忙。 如果你还没有,我也会确保你至less能够理解一些基本的SQL 。
我会build议任何数字食谱书(select一种语言)是有用的。
根据您使用的语言,或者如果您要做可视化,可以有其他build议。
另一本我真正喜欢的书是Didier Besset 的“面向对象的数值方法实现” ( Object-Oriented Implementation of Numerical Methods) 。 他演示了如何在Java和Smalltalk中执行许多方程,但更重要的是,他在帮助演示如何优化计算机上的方程式以及如何处理由于计算机的限制而出现的错误方面做了出色的工作。
Donald Knuth关于mathalgorithm的书。
MATLAB被广泛用于工程devise,快速开发,甚至生产应用(我目前的项目有一个MATLAB生成的DLL,用于做一些先进的数字处理,比我们的本地C ++更容易做到,而我们的FPGA使用MATLAB生成用于信号处理的核心,这比用VHDL手动编码要容易得多)。 还有一个您可能感兴趣的MATLAB金融工具箱 。
这并不是说MATLAB是您所在领域的最佳select,但至less在工程领域,它被广泛使用,而且不会很快出现。
科学程序员面临的一个问题是维护一个代码(和数据)的存储库,其他人可以使用它来重现您的实验。 根据我的经验,这是商业开发中不需要的技能。
这里有一些读物:
- 一个pipe道是一个makefile
- 组织计算生物学项目快速指南
这些是在计算生物学的背景下,但我认为它适用于大多数科学编程。
另外,请参阅计算科学的Python脚本 。
好的,这里是我一直用来达到同样目的的书目清单:
科学家和工程师的数值方法
数字食谱第3版:科学计算的艺术
CUDA by Example:通用GPU编程简介
使用OpenMP:便携式共享存储器并行编程(科学和工程计算)
使用MPI和OpenMP在C中进行并行编程
Donald Knuth:“计算机程序devise艺术”第2卷“mathalgorithm”
另外我发现自己最近使用R而不是Python。
对于科学环境中的通用C ++,Andrei Alexandrescu的Modern C ++ Design可能是关于常见devise模式的标准书籍。
一旦你开始运行,我强烈build议阅读这个博客 。
它描述了如何使用C ++模板来提供types安全单元。 所以例如,如果你乘以速度的时间,你得到一个距离等
阅读源代码也有很大的帮助。 Python在这个意义上是伟大的。 通过挖掘科学Python工具的源代码,我学到了大量的信息。 除此之外,您最喜爱的工具邮件列表和论坛可以进一步提高您的技能。
这可能是有用的: mathbuild模的本质
Donald Knuth: “计算机程序devise艺术”第2卷“ mathalgorithm”
Press,Teukolsky,Vetterling,Flannery:C ++中的Numerical Recipes (本书很棒,只是要小心执照 )
现代C ++devise
并在GNU科学图书馆的源代码中有一个雄辩。
编写科学软件:“良好风格指南”是一本好书,为现代科学编程提供全面的build议。
对于Java,我推荐看一下Unit-API
实现是Eclipse UOMo(http://www.eclipse.org/uomo)或JScience.org(单元API的工作正在进行,JSR-275的早期实现存在);