web-dev-qa-db-ja.com

科学プログラマーのための読書リスト

私は科学プログラマーになるために働いています。私は数学と統計の十分なバックグラウンドを持っていますが、プログラミングのバックグラウンドが不足しています。 SPのリファレンスのほとんどは些細なことであるため、科学プログラミングに言語を使用する方法を学ぶのは非常に難しいと思いました。

私の仕事には統計/財務モデリングが含まれ、物理モデルは含まれていません。現在、私はPythonをnumpyとscipyで広範囲に使用しています。R/ Mathematicaを実行しました。コードを読むのに十分なC/C++を知っています。Fortranの経験はありません。

これが科学プログラマーにとって良い言語のリストであるかどうかはわかりません。もしそうなら、科学的な設定でこれらの言語の構文デザインパターンを学ぶための良い読書リストは何ですか。

45
leon

ある段階で、浮動小数点演算が必要になります。それをうまくやるのは難しく、有能にやるのはそれほど難しくなく、ひどくやるのは簡単です。この論文は必読です:

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

36
Tim

私は徹底的にお勧めします

科学および工学C++:バートンとナックマンによる高度な技術と例の紹介

その年齢に躊躇しないでください、それは素晴らしいです。お気に入りの言語(C、C++、またはFortranである限り)の数値レシピは豊富で、学習に最適ですが、必ずしも各問題に最適なアルゴリズムであるとは限りません。

私も好き

C++およびMPIでの並列科学コンピューティング:並列アルゴリズムへのシームレスなアプローチとKarniadakisによるそれらの実装

並列計算を開始するのが早ければ早いほどよいでしょう。

25

私の最初の提案は、あなたがあなたの特定の分野のトップ5の大学を見て、彼らが何を教えているか、そして教授が研究のために何を使っているかを見ることです。それはあなたが関連する言語/アプローチを発見する方法です。

また、を見てください このstackoverflowの質問( "practices-for-programming-in-a-scientific-environment")

統計/財務モデリングを行っていますか? - 私が使う R その分野では私自身 、そしてそれは急速に統計分析の標準になりつつあり、特に社会科学では、金融でも同様です(たとえば、 http://rinfinance.com を参照してください)。 )。 Matlabはおそらく業界でさらに広く使用されていますが、これは変化しているのではないかと思います。パフォーマンスが主要な要因である場合にのみ、最後の手段としてC++にフォールバックします。

Rに関連する読み物を見つけるのに役立つこれらの関連する質問を見てください。

統計と財務に関連する本の推奨事項に関しては、私はまだ最良の一般的なオプションは David Ruppertの「統計と財務」Rコードのほとんどはここにあります =および 作成者のWebサイトにはmatlabコードがあります )。

最後に、あなたの科学計算が統計的でないなら、私は実際にMathematicaが最良のツールだと思います。プログラマーの間ではほとんど言及されていないようですが、私の見解では、純粋な科学的研究に最適なツールです。それは、MATLABの積分や偏微分方程式のようなものをはるかによくサポートしています。彼らは wolframのウェブサイト上の本の素敵なリスト を持っています。

12
Shane

言語に関しては、あなたは良い報道をしていると思います。 Pythonは実験やプロトタイピングに最適で、Mathematicaは理論的なものを支援するのに適しています。深刻な数値計算を行う必要がある場合は、C/C++があります。

また、アセンブリ言語と関数型言語(Haskellなど)を実際に使用するのではなく、プログラミングスキルとスタイル、およびそれらがもたらす概念に影響を与えるために、理解を深めることをお勧めします。あなたへ。それらmightもいつか重宝します。

また、並列プログラミング(並行/分散)について学ぶことも重要だと思います。これは、科学的な問題に必要な場合がある種類の計算能力にアクセスする唯一の方法だからです。実際に関数型言語を使用して問題を解決するかどうかに関係なく、関数型プログラミングに触れることはこの点で非常に役立ちます。

残念ながら、読み方について提案することはあまりありませんが、 デジタル信号処理に関する科学者およびエンジニアのガイド が役立つ場合があります。

10
Artelius

私は過去2年間でこの分野に参入したばかりの科学プログラマーです。私は生物学と物理学のモデリングに興味がありますが、あなたが探しているものはかなり似ているに違いありません。仕事やインターンシップに応募しているときに、知っておくことがそれほど重要だとは思わなかったことが2つありましたが、機会を逃してしまいました。 1つはMATLABで、これについてはすでに説明しました。もう1つはデータベース設計でした。SPのどの領域にいても、何らかの方法で管理する必要のあるデータが大量にある可能性があります。

本 単なる死すべき者のためのデータベース設計 Michael Hernandezは、良いスタートであると私に勧められ、準備に大いに役立ちました。また、少なくともいくつかの基本的なことを理解していることを確認します [〜#〜] sql [〜#〜] まだ理解していない場合。

7
tordal

数値レシピ本(言語を選択)のいずれかが役立つことをお勧めします。

使用する言語に応じて、または視覚化を行う場合は、他の提案があります。

私が本当に好きなもう1つの本は、Didier Bessetによる Object-Oriented Implementation of Numerical Methods です。彼はJavaとSmalltalkで多くの方程式を実行する方法を示していますが、もっと重要なのは、コンピューターで使用する方程式を最適化する方法と対処する方法を示すのに役立つ素晴らしい仕事をしていることです。コンピュータの制限のためにエラーが発生します。

6
James Black

MATLABは、設計、迅速な開発、さらには実稼働アプリケーションのエンジニアリングで広く使用されています(私の現在のプロジェクトには、MATLABで生成されたDLL)があり、ネイティブよりも簡単に高度な数値処理を実行できます。 C++、および当社のFPGAは、信号処理にもMATLABで生成されたコアを使用します。これは、VHDLで手動でコーディングするよりもはるかに簡単です)。 MATLABの金融ツールボックス もあります。 。

これは、MATLABがあなたの分野に最適であると言っているわけではありませんが、少なくともエンジニアリングでは、MATLABは広く使用されており、すぐにはどこにも行きません。

4
metal
4
user173973

半数値アルゴリズムに関するドナルド・クヌースの本。

4
user181548

科学プログラマーが直面する問題の1つは、他の人が実験を再現するために使用できるコード(およびデータ)のリポジトリを維持することです。私の経験では、これは商業開発には必要のないスキルです。

これに関するいくつかの読みがあります:

これらは計算生物学の文脈にありますが、ほとんどの科学プログラミングに当てはまると思います。

また、 計算科学のためのPythonスクリプト も見てください。

4
pufferfish

科学的環境における一般的なC++の場合、 Modern C++ Design by Andrei Alexandrescuは、おそらく一般的なデザインパターンに関する標準的な本です。

3
Georg Fritzsche

ソースコードを読むことも大いに役立ちます。 Pythonは、この意味で素晴らしいです。科学的なPythonツールのソースコードを掘り下げるだけで、大量の情報を学びました。これに加えて、お気に入りのツールのメーリングリストやフォーラムは、スキルをさらに高めることができます。

2
Gökhan Sever

起動して実行したら、これを読むことを強くお勧めします blog

C++テンプレートを使用してタイプセーフユニットを提供する方法について説明します。したがって、たとえば、速度に時間を掛けると、距離などが得られます。

2
Richard Corden

これは役に立つかもしれません: 数学的モデリングの性質

0
David Lehavi

Writing Scientific Software:A Guide to Good Style は、現代の科学プログラミングに関する全体的なアドバイスが記載された優れた本です。

0
e.tadeu

Donald Knuth:Seminumerical Algorithms 、Volume 2 of The Art of Computer Programming

Press、Teukolsky、Vetterling、Flannery:Numerical Recipes in C++ (この本は素晴らしいです、 ライセンス に注意してください)

最新のC++デザイン

GNU Scientific Library のソースコードをざっと見てください。

0
jason