見出し画像

【内容一部公開】“Pythonic”なコーディングを身につける――近刊『Pythonによる計算物理』

2023年9月上旬発行予定の新刊書籍、『Pythonによる計算物理』のご紹介です。
同書の一部を、発行に先駆けて公開します。



***

はじめに

本書では、物理系の学生にとって身近な方程式を取り上げ、それをPythonを使って数値的に解く方法を示します。それにより、計算物理の実践的な力を身につけることを目指します。以下の特徴があります。

  • 例題を取り上げ、サンプルコードを示して解説します。

  • サンプルコードでは、数値計算ライブラリを積極的に使います。

プログラミング言語を取り巻く環境は、筆者が学生の頃に比べて大きく変わりました。当時は、数値計算といえばC/C++かFortranの2択でした。筆者も当然のようにC/C++を学び、長らく研究で使用してきました。しかし最近では、Pythonを使用する機会のほうが増えてきました。Pythonはとにかくシンプルな記述が可能です。それでいて、数値計算に特化したライブラリが充実しているため、研究にも十分使用できます。Pythonは、これから数値計算を学ぶ学生の有力な選択肢になっています。

これに対応して、計算物理を学ぶ(教える)方法も見直す必要があります。計算物理の伝統的な教科書では、まず計算アルゴリズムの解説があり、その中から簡単なものを選んで実装するのが一連の流れです。しかし、Pythonではライブラリが充実しているので、基本的なアルゴリズムを自分で実装する必要はありません。むしろ、「自分で実装してはいけない」といっても言い過ぎでないくらいです。ライブラリを積極的に使ってプログラミングにかける時間を減らし、浮いた時間を結果の解析やもっと難しい問題に取り組む時間に充てるべきです。

ただ、ライブラリを使って解けるからといって、アルゴリズムを知らなくてよいというわけではありません。ライブラリを正しく使うためには、アルゴリズムについての知識が必要です。そこで本書は、「解法」の節で、アルゴリズムを「使うため」に必要な知識に重点をおいて解説します。これは、アルゴリズムを「実装するため」の知識とは別物です。たとえば、ライブラリを使うには、「この問題を解くならこのアルゴリズムを選ぶべき」とか「このアルゴリズムならこのパラメータを指定しないといけないはず」といった感覚を身につけておく必要があります。

本書の解説では、筆者が重要と思っている以下の2点を繰り返し強調しています。

(1)“Pythonic”なコーディングに慣れる。
(2)公式ドキュメントを調べる習慣をつける。

1つめは、Pythonという言語の特徴と関連しています。Pythonでは、基本的な操作を集めたモジュール(関数の集まりのこと)や高度なライブラリが充実しており、それらを非常に簡単に使用することができます。部品を組み立てるようにしてコーディングするのがPython流です。一方、C/C++やFortranなどのコンパイル言語は、部品を一から自分で作って組み立てるというイメージです。その点、C/C++やFortranに慣れた人からすると、Pythonは独特です。それらの言語の“直訳”では、Pythonの長所を生かせません。用意された部品を極力使い、なるべく自分で書く部分を減らすことで、コードがシンプルになるだけでなく、コンパイル言語と遜色のない実行速度を実現することができます。

2つめは、正しい情報を得ることの重要性についてです。Pythonに限らず、プログラミング環境は日進月歩です。ある時点で新しい解説記事も、時間の経過とともにすぐに古くなってしまいます。実際、インターネット上には古い情報が溢れています。そこで本書では、ライブラリの使い方の解説だけでなく、ライブラリの「正しい使い方の調べ方」の解説にも重点をおいています。そのほうが長く広く役に立つからです。正しい情報を得るためには、公式ドキュメントを参照することがもっとも重要なのですが、公式ドキュメントは多くの場合、英語で書かれています。英語のドキュメントを読むことに、最初は躊躇するかもしれません。少しでもそのハードルを下げるために、本書では、公式ドキュメントの記述と対応させながら、ライブラリの使い方を読み取るような解説にしています。また、本文中のプログラミング用語には英単語を併記するようにしています。

本書を読み進めていくうちに、計算物理の知識が深まると同時に、上記の2点が自然に身につくことを期待しています。

(中略)

本書の構成

各章は独立した構成になっていて、興味のある章を選んで読むことができます。
参考のために、本書の読み方の例を以下に2つ示します。

計算物理や数値計算についてしっかりと学びたい人
最初から順番に読み進めていけば、計算物理で用いられる標準的な解法や数値計算法を一通り学べるようになっています。第1章では、Pythonを用いた数値計算の基礎をコンパクトにまとめてあります。第2章以降で扱う題材は、物理学科の標準的なカリキュラムと同じように、「古典力学」「振動・波動」「量子力学」「量子統計力学」の順番になっています。したがって、自然に読み進めることができると思います。各章では、まず問題を解くために必要なを学び、それを応用してを解く構成になっています。

とにかく具体的な物理の問題を解いてみたい人
の中から興味のあるテーマを選んで、サンプルコードを実際に実行してみてください。例題では、はじめに問題の物理的な背景を簡単に説明したのちに、サンプルコードを示し、それにより得られた結果を紹介しています。サンプルコードを自分で動かしてみて、計算方法でわからないところがあったり、より発展的なことをやってみたいと思ったら、の該当部分を読んで再チャレンジしてください。

(後略)

***

岡山大学 大槻 純也 (著)

【目次】
はじめに

第1章 計算物理のためのPython入門
 1.1 なぜPythonを使うのか
 1.2 NumPy
  1.2.1 NumPy配列の使いどころ
  1.2.2 NumPy配列の初期化
  1.2.3 NumPy配列の基本情報の確認方法
  1.2.4 演算規則と数学関数
  1.2.5 ベクトルと行列
 1.3 SciPy
 1.4 Matplotlib
  1.4.1 2つのインターフェース
  1.4.2 グラフを構成するオブジェクトの構造

第2章 古典力学――常微分方程式
 2.1 古典力学と常微分方程式
 2.2 【解法】常微分方程式
       【Library】SciPyによる常微分方程式の解
 2.3 【例題】ロジスティック方程式
 2.4 【例題】ニュートン方程式
 2.5 【例題】LLG方程式――磁気モーメントの歳差運動

第3章 振動・波動――偏微分方程式
 3.1 物理学における偏微分方程式
  3.1.1 初期値問題
  3.1.2 境界値問題
 3.2 【解法】差分法
     【Library】SciPyによる疎行列の取り扱い
 3.3 【解法】初期値問題
 3.4 【例題】KdV方程式――ソリトン
 3.5 【例題】時間依存シュレディンガー方程式
 3.6 【解法】境界値問題
 3.7 【解法】連立方程式
     【Library】SciPyによる連立方程式の解法
 3.8 【例題】ポアソン方程式(2次元空間)

第4章 量子力学――固有値問題
 4.1 量子力学と固有値問題
  4.1.1 時間に依存しないシュレディンガー方程式
  4.1.2 スピン演算子
 4.2 【解法】固有値問題
     【Library】SciPyによる全対角化
     【Library】SciPyによる疎行列の対角化
 4.3 【例題】量子非調和振動子
 4.4 【例題】スピン演算子
 4.5 【例題】ハイゼンベルグ模型――量子スピン系
 4.6 【例題】ハバード模型――強相関電子系

第5章 量子統計力学――数値積分・非線形方程式・乱数
 5.1 量子統計力学で必要となる数値計算法
  5.1.1 統計力学エントロピー
  5.1.2 量子統計とボーズ–アインシュタイン凝縮
  5.1.3 相転移とイジング模型
 5.2 【例題】文章の情報エントロピー
 5.3 【解法】数値積分
     【Library】SciPyによる数値積分の解法
 5.4 【例題】ボーズ–アインシュタイン積分
 5.5 【解法】非線形方程式
     【Library】SciPyによる1次元非線形方程式の解法
     【Library】SciPyによる多次元非線形方程式の解法
 5.6 【例題】ボーズ–アインシュタイン凝縮
 5.7 【例題】イジング模型の平均場近似
 5.8 【解法】モンテカルロ法
     【Library】NumPyによる乱数生成
 5.9 【例題】イジング模型のモンテカルロシミュレーション

付録A Pythonの基礎
付録B NumPy/SciPyの使い方
付録C Matplotlibの使い方

おわりに
参考文献
索引

この記事が気に入ったらサポートをしてみませんか?