不確定な世界

科学の話題を中心に、勉強したことや考えたことを残していきたいと思います

「Pythonによる数値計算とシミュレーション」;小高知宏著 読書感想 

本日紹介するのは、小高知宏著「Pythonによる数値計算とシミュレーション」。
元々はC言語版が古くから出版されていて、本書はそのPython版である。読者層は情報系が想定されているが、小高先生の本はサンプルプログラムの実装が素朴でわかりやすく、プログラミングを専門としない方でも理解や改造が容易である。また、本書はあくまで数値計算アルゴリズムを自分で実装することを趣旨とする本であるが、ScipyなどPythonのライブラリを用いる方法についても簡単ではあるが記述がある。

内容は6章構成で、1章で数値計算の基礎と誤差の問題を扱い、2章・3章で微分方程式の数値解法、4章でセルオートマトン、5章で乱数によるモンテカルロシミュレーション、6章でエージェントベースの手法を学ぶ。
私は物理系の数値計算の講義を受けた経験があり、微分方程式と乱数の部分は懐かしい気持ちで読み進めた。学生時代は特にオイラー法がお気に入りで、ロトカ・ヴォルテラ方程式レプリケータ方程式などを解いて遊んでいたことを思い出した*1
一方で、オートマトンやエージェントベースの手法は方程式ベースの手法とは毛色が違い、社会現象のシミュレーションに有用である。特に第6章で扱われる「感染」シミュレーションは、現在のコロナ禍を彷彿とさせ、非常に興味深く読ませていただいた。章末問題にも言及があるが、例えば飛沫の拡散などの物理シミュレーションと組み合わせて、「密」のシミュレーションなどをやってみたりすると面白いのではないかと思った。

ニュースなどでよく、「シミュレーションによれば何十年後の気温が何度上がる」とかいう話が出てくる。また、製造業のエンジニアをやっていると、CADソフトでシミュレーションを行う機会も多いだろう。本書を読むことで、「現実の物理現象や社会現象をコンピュータでシミュレーションするとはどういうことか」という概念が理解できる。数式ではなくコードがメインの本であるため、意欲的な高校生にもおすすめである。自分が高校生の頃にこういう本を読んでいれば、物理の勉強が捗ったのになぁ、と思う。

バグ情報?

第6章のマルチエージェントのプログラム、例えばP174の48行目などで、この実装ではカテゴリ0のエージェントだけ、1ターンに何度も移動することになる。
サポートサイトに正誤表が見当たらないので確認できないが、控えめに言っても本文に記述のない仕様である。カテゴリ0の移動はfor文の外に記述するのが正しいと思う。

def cat0(self):
    for a in agents:
        if a.category == 1:
            c0x = self.x
            c0y = self.y
            ax = a.x
            ay = a.y
            if ((c0x-ax)**2+(c0y-ay)**2) < R:
                self.category = 1
    if self.category == 0:
        self.x += random.random() - 0.5
        self.y += random.random() - 0.5

ただし、これだけだとカテゴリ0の移動量がサンプルプログラムより減ってしまうので、移動量は適当に調節するのがよいだろう。

Pythonによる数値計算とシミュレーション

Pythonによる数値計算とシミュレーション

*1:本書にも記述があるが、オイラー法は単純故に精度が悪く、実用的にはルンゲ・クッタ法が用いられる