- 小高[おだか] 知宏, 2018: Pythonによる数値計算とシミュレーション。オーム社, 196 pp. ISBN 978-4-274-22170-5.
2018年1月の新刊。わたしは2018年4月に店頭でみつけた。大学の授業で、簡単なシミュレーションの実習をしようと思ったのだが、大学のパソコン教室のWindows PCでつかえるプログラム言語処理系がかぎられていた。Excelははいっているが、VBAプログラミングをやりたくはなかった。パソコン教室の説明書には書いてなかったのだがログインしてみるとPython処理系があったので、Pythonの例文がのっている教科書をさがして、本書を見つけて買い、例文のいくつかを動かしてみた。ところが、本書ではPythonのモジュールをつかっている例題が多い。パソコン教室にはいっていたPythonでは、math ははいっていたが、numpy, scipy, matplotlib などははいっておらず、ユーザーが追加するすべもなかった。(Pythonは他のソフトウェアを動かすための基盤として必要だからはいっていたのであって、直接つかうことは想定されていなかったらしい。) Pythonで実習をすることをあきらめたので、本書を読むのもそこでやめてしまった。
2020年9月、Twitterで本書のプログラム例がちょっと話題になったので、ひっぱりだしてきた。この機会に、この本はどんなものかのメモを書いておく。
6章からなっている。
第1章は導入。1.1節では、数値計算のアルゴリズムをPythonプログラムにすることを、二次方程式を二分法でとく問題を例としてしめす。また、モジュールを呼びだす方法をしめす。1.2節では、数値計算の誤差の問題を指摘する。誤差の生じかたには、けた落ち(値の近い数値どうしのひきざんで生じる)、まるめ誤差、情報落ち(けたちがいの数値のたしざんなどで生じる)がある。浮動小数点計算の誤差をさける方法として、十進計算や、分数計算のモジュールがある。
第2章は常微分方程式になる物理の問題。2.1節は質点の1次元の運動で、運動方程式は2階微分方程式だが、位置と速度を両方変数にすれば連立1階微分方程式の形になる。これをとく方法として「オイラー法」が紹介される。[わたしの差分法の教材]でいえば「前方差分」にあたる。区間のおわりの時点での速度をもとめる計算では、区間のはじめの時点での加速度がつかわれているので、たしかに前方差分だ。ところが、区間のおわりの時点での位置をもとめる計算では、「オイラー法」だと言ってはいるのだが、いま計算された区間のおわりの時点の速度を(まちがえてではなく意識的に)つかっている。一種の後方差分だ。(ただし、おわりの時点での物理量のつじつまがあうように計算する陰解法の後方差分とはちがう。) Twitterで、ある人が、これを「オイラー法」というのはまちがいだと言っていた。わたしは、「オイラー法」ということばの意味のひろがりを正確に知らないので、これがまちがいかどうかわからないのだが、単純な前方差分とのちがいをしっかり説明していないのはうまくないと思う。
2.2節は質点の2次元空間での運動。質点が電荷をもち、動かない複数の電荷からの引力や斥力を受けるという想定だ。固定した電荷の値と位置を与えてそれをつかうところの構造型変数の構造、値をつかうところでの表現、値をあたえるところの表現が、いずれも他のプログラム言語から想像しにくく、Python文法を参照する必要があると思った。(2次元以上の配列変数のあつかいがプログラム言語間でまちまちであることの一例だが。)
第3章は偏微分方程式。2次元のラプラス方程式の境界値問題を例題にし、ポアソン方程式も同様にできると言っている。おもに反復法(iteration)でといている。連立1次方程式のときかたにはガウスの消去法があることも紹介している。
第4章はセルオートマトンによるシミュレーション。セルのならびは配列変数で表現し、要素の値が0になったり1になったりする。まず1次元のセルオートマトン、それから2次元のセルオートマトンの例として「ライフゲーム」、それからまた1次元のセルオートマトンで交通流(交通渋滞)のシミュレーションをしめす。
第5章は乱数とそれをつかったシミュレーション。5.1では疑似乱数の簡単な例として線形合同法をしめすが、Pythonのrandomモジュール (メルセンヌツイスタによる)をつかうことをすすめている。5.2では、いわゆるモンテカルロ法(本書ではその用語は出てこないが)による数値積分と、組み合わせ最適化問題。5.3ではランダムウォークのシミュレーション。
第6章はagent-based シミュレーション。複数のエージェントが2次元空間を動きながら相互作用するとする。あるカテゴリーのエージェントが出あったあいてのエージェントを自分と同じカテゴリーにかえてしまうという想定で「感染」現象をシミュレートする。(ただし実際の感染症に似せるところまではいっていない。)
折りかえしのあとに くわしい目次をつける。[ ] の中に書いたのはそこで紹介されるモジュールの名まえ。
Continue reading