書評
幸谷 智紀著「Python数値計算プログラミング」(講談社, 2021)
2021年07月22日
須志田 隆道
すしだ たかみち
サレジオ工業高等専門学校
本書はPythonと呼ばれるスクリプト言語を用いて、網羅的に数値計算法を学習することができる解説書である。著者の講義資料が本書のベースであるということもあり、これから初めて数値計算法を学ぶ学生にも有益な書籍の1つである。本書で作成されたPythonのスクリプトが著者のサポートページ(https://github.com/tkouya/inapy)にて公開されており、学ぶ上で手助けになる。さらに、著者のWebページ(https://na-inet.jp/nasoft/)には講義資料が公開されており、本書に記されなかった数値計算法や解説があるため、手にしておきたい。
本書は14個のトピックスから構成されており、各章において、数値計算法の理論的な解説とPythonによるアルゴリズムの実装例および数値実験の両面から学習することができる。第1章では数学と計算の概念から始まり、鳥越神社に奉納された算額の問題を題材にして、定積分の近似値を計算するアルゴリズムおよび数値実験の解説が行われ、数値計算をするということを学ぶことができる。
第2章から第4章では,数の体系から浮動小数点数と有効桁数、多倍長精度計算まで数値計算法を学習する上で必要かつ有益な情報が丁寧にまとめられている。Pythonの基本的な使用方法は第3章にて示されており、浮動小数点数とともに学習することができる。特に、演習問題3.3の二次方程式の解の精度を回復させる話題は、初めて学ぶ読者にはプログラムの作成と実行を通して確認をしてほしい。その後、第4章のPythonでの多倍長精度計算に進み、有効桁数を上げたプログラミングを身につけることができる。
第5章では、多項式関数の計算をホーナー法にて行うことから始まり、テイラー展開と誤差解析について数値実験とともに解説されている。ホーナー法では乗算の回数が最小であると書かれているが、初めて学ぶ読者には、逐次的に計算する回数とホーナー法による回数の違いを数式で示し、その違いを確認してほしい。
第6章から第9章までに、基本線形計算から連立方程式の直接法および反復法、固有値問題まで、数値線形代数の話題がたっぷりと解説されている。第6章では、A@Bのような形式で行列積の命令を記述できることが紹介されており、この命令は数学計算との調和性も高く、Pythonの利便性が高いことを示す一例であると思う。第7章に記載された連立方程式の直接法では、ガウスの消去法およびLU分解法の解説が行われる。第8章では、Pythonでの疎行列の取り扱いの解説が詳しく行われており、第14章の偏微分方程式の数値計算に関連しているため押さえておきたい。その後の反復法の解説では、反復計算での収束条件の証明から始まり、ヤコビ法および共役勾配法が解説されている。著者のWebページにて公開されている講義資料には、反復法についてさらに詳しく述べられているので、合わせて学習することで更なるレベルアップに繋がるだろう。第9章では、固有値問題の復習から始まり、べき乗法およびQR分解法の解説が行われている。
第10章と第11章では、非線型方程式の数値計算および補間と最小二乗法の話題が詳しく解説されている。3次収束を示すハレー法や三次方程式の解の公式などが記載されていることもとても興味深い。ハレー法が3次収束であるかを確認することは読者に委ねられているので、チャレンジしてみるとよいだろう。
第12章から第14章では、数値微分と数値積分から始まり、常微分方程式と偏微分方程式の数値計算法が解説されている。特に、さまざまな高次解法が解説されていることは本書の特徴の1つである。偏微分方程式の数値計算では、空間一次元の波動方程式と熱方程式について、陽的差分法および陰的差分法の両方が解説されており、最後に空間二次元のポアソン方程式における陰的差分法の解説が記載されている。
ざっくりと本書の内容を追いかけたが、本書で用いたスクリプト言語であるPythonを用いるか、あるいはコンパイラ言語であるC++等を用いるか、という疑問が出てきそうであるが、もちろんどのように使用するかはユーザー側に委ねられている。ただ、本書の表紙からも想像できる通り、Pythonにはさまざまなライブラリ(道具)が用意されており、基本的な数値計算から深層学習などの高度なものまで幅広く扱うことができることが大きな利点である。例えば、筆者の研究活動では、データ解析を計算ライブラリや可視化などの便利な機能が揃っているスクリプト言語で行い、微分方程式などの数値計算をコンパイラ言語で行うことが多かったが、本書を手に取ることができ、改めてPythonの利便性に気づくことができたため、今後は幅を広げて、PythonによるマルチコアCPUやGPUでの並列計算にチャレンジしてみようと思う。筆者も含めて、これから先、本書を手に取って得られた学びが、読者の新たな研究や学習に繋がることを期待したい。