- 小高[おだか] 知宏, 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次元空間を動きながら相互作用するとする。あるカテゴリーのエージェントが出あったあいてのエージェントを自分と同じカテゴリーにかえてしまうという想定で「感染」現象をシミュレートする。(ただし実際の感染症に似せるところまではいっていない。)
折りかえしのあとに くわしい目次をつける。[ ] の中に書いたのはそこで紹介されるモジュールの名まえ。
== 目次 ==
まえがき
目次
第1章 Pythonにおける数値計算
– 1.1 Pythonによる数値計算プログラムの構成
– – 1.1.1 Pythonによる数値計算プログラム
– – 1.1.2 Pythonモジュールの活用 [math, sympy]
– 1.2 数値計算と誤差
– – 1.2.1 数値計算における誤差
– – 1.2.2 数値計算における誤差の実際
– – – (1) 桁落ち
– – – (2) 丸め誤差
– – – (3) 情報落ち
– – 1.2.3 Pythonモジュールの活用 [decimal, fractions]
第2章 常微分方程式に基づく物理シミュレーション
– 2.1 質点の1次元運動シミュレーション
– – 2.1.1 自由落下のシミュレーション
– – 2.1.2 着陸船のシミュレーション
– 2.2 ポテンシャルに基づく2次元運動シミュレーション
– – 2.2.1 ポテンシャルに基づく2次元運動
– – 2.2.2 2次元運動のシミュレーション
– 2.3 Pythonモジュールの活用 [scipy]
第3章 偏微分方程式に基づく物理シミュレーション
– 3.1 偏微分方程式の境界値問題
– – 3.1.1 ラプラスの方程式
– – 3.1.2 ラプラスの方程式の境界値問題
– – 3.1.3 境界値問題の数値解法
– – 3.1.4 ガウスの消去法による境界値問題の計算
– – 3.1.5 逐次近似による境界値問題の計算
– – 3.1.6 その他の二階偏微分方程式
– 3.2 ラプラスの方程式による場のシミュレーション
– – 3.2.1 ラプラスの方程式の反復解法プログラム
– – 3.2.2 より複雑な形状の領域の場合
– 3.3 Pythonモジュールの活用 [numpy]
第4章 セルオートマトンを使ったシミュレーション
– 4.1 セルオートマトンの原理
– – 4.1.1 セルオートマトンとは
– – 4.1.2 セルオートマトンの計算プログラム
– 4.2 ライフゲーム
– – 4.2.1 ライフゲームとは
– – 4.2.2 ライフゲームのプログラム
– 4.3 交通流シミュレーション
– – 4.3.1 1次元セルオートマトンによる交通流のシミュレーション
– – 4.3.2 交通量シミュレーションのプログラム
第5章 乱数を使った確率的シミュレーション
– 5.1 擬似乱数
– – 5.1.1 乱数と擬似乱数
– – 5.1.2 乱数生成アルゴリズム
– – 5.1.3 Pythonの乱数生成モジュール [random]
– 5.2 乱数と数値計算
– – 5.2.1 数値積分と乱数
– – 5.2.2 乱数と最適化
– 5.3 乱数を使ったシミュレーション
– – 5.3.1 ランダムウォーク
– – 5.3.2 ランダムウォークシミュレーション
– 5.4 Pythonモジュールの活用 [scipy]
第6章 エージェントベースのシミュレーション
– 6.1 エージェントとは
– – 6.1.1 エージェントの考え方
– – 6.1.2 Pythonによるエージェントシミュレーションの実現
– – 6.1.3 マルチエージェントへの拡張
– – 6.1.4 相互作用するマルチエージェント
– 6.2 マルチエージェントによる相互作用のシミュレーション
– – 6.2.1 マルチエージェントによるシミュレーション
– – 6.2.2 マルチエージェントシミュレーションプログラム
付録
– A.1 4次のルンゲ=クッタ法の公式
– A.2 ラプラスの方程式が周囲4点の差分で近似できることの説明
– A.3 ナップサック問題の解法プログラム rkp30.py
– A.4 シンプソンの公式
章末問題略解
参考文献
索引