01 / 読書ガイド
読書ガイド
引用
Kong, Q., Siauw, T., & Bayen, A. M. (2020). Python Programming and Numerical Methods: A Guide for Engineers and Scientists. Academic Press (Elsevier). Free official edition: https://pythonnumericalmethods.berkeley.edu/notebooks/Index.html
章の要約
本書は二部構成である。第I部(第1〜13章)はプログラミングを教え、第II部(第14〜24章)は数値計算法を紹介する。機械学習を扱う第25章は、オンライン版だけにある拡張部分である。
第1章:Python の基礎
冒頭の章では、Python のインストール、電卓としての利用、パッケージの管理、Jupyter Notebook での作業を通じて、学生がすぐに動かせるようにする。基本的なデータ型(整数、浮動小数点数、複素数、文字列、真偽値)と論理式・演算子を導入する。
第2章:変数と基本的なデータ構造
変数と代入に続いて、Python の組み込みコンテナ――文字列、リスト、タプル、集合、辞書――と NumPy 配列を扱う。章のまとめは NumPy 配列を科学計算の中心的なオブジェクトとして特に取り上げている。
第3〜4章:関数/分岐文
第3章では、関数の定義の仕方、各関数が固有のメモリ空間をもつこと(ローカル変数とグローバル変数)、入れ子の関数、ラムダ関数、関数を引数として渡すことを説明する。第4章では if-else による分岐と1行で書ける三項演算子を加える。
第5〜6章:反復/再帰
第5章は反復的な解法の道具として for ループ、while ループ、内包表記を扱う。第6章は再帰関数と分割統治の戦略を紹介し、フィボナッチ数、ハノイの塔、クイックソートなどの例を示す。
第7章:オブジェクト指向プログラミング(OOP)
手続き指向とオブジェクト指向のプログラミングを対比し、クラス、オブジェクト、そして継承、カプセル化、ポリモーフィズムの考え方を導入する。
第8〜9章:計算量/数の表現
第8章はアルゴリズムの計算量とビッグオー記法を定義し、例を通じて計算量がなぜ重要かを示し、遅いコードを見つけるためのプロファイラを紹介する。第9章は N 進法と2進法による表現、IEEE 754 浮動小数点数、丸め誤差を説明する。
第10〜11章:エラー、良いプログラミングの習慣、デバッグ/データの読み書き
第10章は構文エラー、例外、論理エラーを区別し、エラーを避けるための習慣を勧め、try/except、型チェック、デバッガを扱う。第11章はテキスト、CSV、pickle、JSON、HDF5 ファイルの読み書きの方法を示す。
第12〜13章:可視化とプロット/Python の並列化
第12章は Matplotlib による2次元・3次元のプロット、Cartopy による地図の描画、アニメーションと動画の作成を扱う。第13章はプロセス、スレッド、Python のグローバルインタプリタロックを説明し、multiprocessing パッケージと joblib を使って複数のコアで処理を実行する。
第14章:線形代数と連立一次方程式
第II部は線形代数の速習で始まる。ベクトル、ノルム、一次独立性、行列式・階数・逆行列をもつ行列、線形変換である。連立方程式を Ax = y と表し、解の個数を階数に関連づけ、ガウスの消去法、ガウス=ジョルダン消去法、LU 分解、ガウス=ザイデル反復で連立方程式を解き、その後 NumPy と SciPy のソルバーと逆行列の計算を示す。
第15章:固有値と固有ベクトル
固有値問題を述べた後、最大固有値のためのべき乗法、逆べき乗法とシフトつきべき乗法、すべての固有値を求める QR 法を示し、NumPy による計算方法を紹介する。
第16章:最小二乗回帰
最小二乗法を、線形代数による方法と多変数微積分による方法の2通りで導き、パラメータの正規方程式の公式に至る。Python でデータをあてはめ、対数変換、多項式回帰、SciPy の curve_fit によって非線形モデルを扱う。
第17章:補間
補間の問題を述べ、線形補間、3次スプライン、ラグランジュ補間とニュートン補間を SciPy の実装とともに示す。
第18章:級数
テイラー級数を使って関数を表し近似する。1次近似を論じ、テイラーの剰余項で打ち切り誤差を評価し、級数を足し合わせるときの丸め誤差に注意を促す。
第19章:求根
問題と許容誤差の考え方を定義した後、二分法(安定だが遅め)とニュートン=ラフソン法(根の近くでは速いが不安定になりうる)を示し、SciPy の求根関数を紹介する。
第20〜21章:数値微分/数値積分
第20章は前進差分、後退差分、中心差分で導関数を近似し、高階導関数に拡張し、ノイズのあるデータが引き起こす困難を示す。第21章はリーマン和、台形則、シンプソン則で積分を近似し、精度の次数を比較し、SciPy の積分ルーチンを使う。
第22〜23章:常微分方程式――初期値問題/常微分方程式――境界値問題
第22章は高階の常微分方程式を1階の連立系に帰着させ、陽的・陰的・台形のオイラー法、数値誤差と安定性、予測子修正子法とルンゲ=クッタ法、SciPy の solve_ivp、そして多段法と硬さに関する短い発展的話題を扱う。第23章は境界値問題を射撃法と差分法で解き、それらの精度と安定性を論じる。
第24章:フーリエ変換
波の基本的な性質(振動数、周期、振幅、波長)から始めて、離散フーリエ変換を定義し、高速フーリエ変換が対称性をどう利用するかを説明し、NumPy と SciPy の FFT 関数を信号に適用する。
第25章:機械学習入門
オンラインの拡張部分で、教師あり学習と教師なし学習を紹介し、サポートベクターマシンによる分類、回帰、k 平均法によるクラスタリングを、アヤメのデータセットに scikit-learn を適用して示す。
主要概念
第1章:Python の基礎
- Jupyter Notebook:コード、出力、文章を混在させる対話的な環境で、本書全体で使われる。
- データ型:int、float、complex、文字列、真偽値で、それぞれ固有の演算をもつ。
第2章:変数と基本的なデータ構造
- 変更可能なコンテナと変更不能なコンテナ:リストと辞書は変更できるが、文字列とタプルはできない。
- NumPy 配列:型が固定された多次元配列で、要素ごとの高速な演算ができる。
第3〜4章:関数/分岐文
- 関数のスコープ:各関数は固有のメモリブロックをもち、情報は入力を通じてのみ受け取り、出力を通じて返す。
- ラムダ関数:無名の1行関数で、しばしば引数として渡される。
- 分岐:条件に応じてコードが異なる動作をするための if-elif-else 文。
第5〜6章:反復/再帰
- ループ:命令を繰り返す for 文や while 文の構造。
- 再帰と分割統治:関数がより小さな自分自身の問題を呼び出すことで問題を解く方法。
第7章:オブジェクト指向プログラミング(OOP)
- クラスとオブジェクト:データとメソッドをまとめる設計図と、そこから作られるインスタンス。
- 継承:親クラスの属性とメソッドを子クラスで再利用すること。
第8〜9章:計算量/数の表現
- ビッグオー記法:入力の大きさに応じて実行時間がどう増えるかを、機械に依存せずに表す記法。
- IEEE 754:標準的な2進浮動小数点形式で、精度を制限し丸め誤差の原因となる。
第10〜11章:エラー、良いプログラミングの習慣、デバッグ/データの読み書き
- 例外処理:実行時エラーにプログラムを止めずに対応する try/except ブロック。
- ファイル形式:データを保存・交換するためのテキスト、CSV、pickle、JSON、HDF5。
第12〜13章:可視化とプロット/Python の並列化
- Matplotlib によるプロット:結果を伝えるための2次元・3次元の図の作成。
- プロセスベースの並列化:複数のプロセス(multiprocessing や joblib)で複数の CPU コアを使うこと。
第14章:線形代数と連立一次方程式
- 階数と解:rank(A) と rank([A, y]) を比較すると、連立方程式の解が0個、1個、無限個のいずれかが決まる。
- LU 分解:A を下三角行列と上三角行列に分解し、連立方程式を効率よく解く方法。
- ガウス=ザイデル反復:未知数を一つずつ更新していく反復法。
第15章:固有値と固有ベクトル
- べき乗法:A を繰り返し掛けて、絶対値最大の固有値と固有ベクトルを求める方法。
- QR 法:QR 分解に基づく反復で、すべての固有値を求める。
第16章:最小二乗回帰
- 正規方程式:最小二乗のパラメータを与える公式 β = (AᵀA)⁻¹AᵀY。
- 線形化のための変換:対数をとって指数モデルやべき乗則モデルを線形最小二乗であてはめること。
第17章:補間
- 3次スプライン:1階と2階の導関数が連続な区分3次補間。
- ラグランジュ多項式とニュートン多項式:すべてのデータ点を通るただ一つの多項式の二つの表し方。
第18章:級数
- テイラー級数:ある点のまわりで関数を多項式の項の無限和として表すこと。
- 打ち切り誤差:級数を途中で打ち切ることによる誤差で、テイラーの剰余項で評価する。
第19章:求根
- 二分法:関数の符号が変わる区間を繰り返し半分にする方法。
- ニュートン=ラフソン法:接線を使って反復し、根の近くで速く収束する方法。
第20〜21章:数値微分/数値積分
- 差分:格子上の関数値の差の比で導関数を近似するもので、精度は方式の次数によって決まる。
- シンプソン則:2次式による近似で積分する方法で、滑らかな関数では台形則より精度が高い。
第22〜23章:常微分方程式の初期値問題と境界値問題
- オイラー法とルンゲ=クッタ法:次数がしだいに高くなる、初期値問題のための逐次的な方式。
- 安定性:数値誤差が増大するかどうかで、方程式、方法、刻み幅に依存する。
- 射撃法:境界値問題を、求根と組み合わせた初期値問題に変える方法。
第24章:フーリエ変換
- 離散フーリエ変換:標本化された信号を時間領域から周波数領域へ変換すること。
- 高速フーリエ変換:対称性を利用して DFT を効率的に計算するアルゴリズム。
第25章:機械学習入門
- 教師あり学習と教師なし学習:ラベルつきデータから学ぶ(分類、回帰)か、ラベルのないデータの構造を見つける(クラスタリング)か。
- サポートベクターマシン:マージン最大の境界でクラスを分ける分類器。
批判的分析
長所
- 本当に初心者向けのプログラミング。 序文はプログラミング経験をまったく前提とせず、高校程度の代数と三角法、入門的な微積分だけを求めている。第I部は電卓とデータ型から始まり、関数、OOP、デバッグ、ファイル形式、プロット、並列計算へと進むので、工学系の学生は数値計算法が登場する前に実践的な道具一式を身につけられる。
- 対話的で実行できる。 オンライン版は読者が実行するよう勧められるコードつきの Jupyter ノートブックの集まりである。頻繁に現れる「TRY IT!」ブロック(サイト全体で200を超える)に加え、TIP、WARNING、WHAT IS HAPPENING?、CONSTRUCTION の各ボックスが実践的な作業を導く。コードは MIT ライセンスで公開されている。
- 方法とライブラリの道具を組み合わせる。 第II部のほとんどの章は、まず方法を一から実装し、次に対応する NumPy や SciPy のルーチンを示すので、学生はアルゴリズムとプロ向けの道具の両方を理解できる。
- 意図的に広く短く扱う。 各章は講義2時間以内で扱えるよう設計されており、線形代数、固有値、回帰、補間、級数、求根、微分、積分、常微分方程式、フーリエ解析を一つの授業で概観できる。
短所
- 意図的に浅い。 序文は、どの話題も深くは扱わないと述べている。誤差解析や収束の証明は最小限なので、理論が必要な学生は数値解析の教科書に当たる必要がある。
- バージョンに依存したコード。 本書は2019年ごろのパッケージのバージョン(たとえば NumPy 1.16、SciPy 1.2)を挙げており、現在のリリースでは一部の関数や出力が異なるかもしれない。
- 話題ごとの深さにむらがある。 一部の節(たとえば多段法や硬さ)は短い「発展的話題」にすぎず、機械学習の章はオンライン版だけの短い拡張である。
- オンライン版と印刷版の違い。 サイトは本書の著作権が Elsevier にあることを記し、ノートブックを印刷版の抜粋と説明している。機械学習の章はオンライン版の拡張であり、オンラインにある付録は Windows への Python のインストールを扱う一つだけである。
本書で扱う応用
応用は独立した章ではなく、例と問題として登場する。Cartopy による地理データのプロットと地図作成、アニメーションの作成(第12章)、計算の時間計測と並列化(第8章と第13章)、線形・非線形最小二乗による実験データのあてはめ(第16章)、振り子やロケット打ち上げの境界値問題のような常微分方程式モデルを、自作の方式と SciPy で解くこと(第22〜23章)、FFT による信号の解析(第24章)、アヤメのデータセットの分類とクラスタリング(第25章)である。
コースにおける位置づけ
本書は Cleve Moler の Numerical Computing with MATLAB と並ぶ位置にある。二冊ともソフトウェアを先に立てるアプローチをとるが、重点が異なる。Kong、Siauw、Bayen は第I部を Python によるゼロからのプログラミング教育に充てるのに対し、Moler はある程度のプログラミング経験を前提とし、MATLAB を使ってライブラリのアルゴリズムが内部でどう動くかにより多くの紙幅を割く。プログラミング経験のない学生や Python を使う授業ではここから始めるとよく、すでにプログラミングができる学生は Moler を選ぶか、併読書として使うとよい。
Burden、Faires、Burden の Numerical Analysis と Süli と Mayers の An Introduction to Numerical Analysis は学部向けの教科書で、一般に誤差解析を伴うより厳密な扱いとされる。第II部の後の自然な次の段階である。Trefethen と Bau の Numerical Linear Algebra と Stoer と Bulirsch の Introduction to Numerical Analysis は大学院レベルの教科書であり、本書で紹介された方法に慣れた後の学習に向いている。
本書の使い方
本書は、プログラミング経験のない工学・理学系の1〜2年生を対象としている。前提条件は高校程度の代数と三角法、大学入門レベルの微積分であり、後で必要になる線形代数は第14章で補われる。
序文は、プログラミングの基礎を扱う第1〜5章を最初に読むよう勧めている。第6〜11章はどの順序で読んでもよい。1学期の授業では、ある程度コーディングの経験がある学生なら第I部を手早く済ませ、第14〜24章に集中できる。Jupyter ノートブックを開いた状態で読み、すべての例を実行し、すべての「TRY IT!」ブロックに挑戦し、各章末の問題に取り組み、まとめの一覧で理解を確かめるとよい。パッケージのバージョンは変わるので、出力が異なるときは最新の NumPy や SciPy のドキュメントと比べるとよい。
版と出典
本ガイドは、著者らがカリフォルニア大学バークレー校で公開している Python Programming and Numerical Methods の無料の公式オンライン版(https://pythonnumericalmethods.berkeley.edu/notebooks/Index.html、© 2020、印刷版は Academic Press/Elsevier 刊、コードは MIT ライセンス)に基づいている。序文(目的、前提条件、構成、読み方の助言、パッケージのバージョン)、目次全体、第1〜25章と付録のすべての章の概要と節ページの見出し、全章の章末のまとめ、そしてより詳しく読んだ節(9.2、12.3、13.1〜13.3、14.4、15.3、16.5、18.3、22.5、22.7、25.2〜25.4節を含む)を参照している。
