Python+数値計算で

プログラミングを学ぶ

はじめに

このシリーズの狙いは、次の折りたたまれたテキストを開いて読んでいただきたいと思うが、2021年4月9日の時点で大体完成した。導入部分をもう少し丁寧にすることを考えている。また、動画だけ見ればわかるようなものも考えてはいるが、いつになるかわからない。macOSで動画は作成しているが、Windowsでも Anaconda で Python をインストールしてしまえば同じであるので、そのインストール方法と簡単な使用法の動画を載せた(第0回にある)ので問題なく取り組めると思う。

滑舌が悪く、聞き取りにくいため、再生回数が多いものから日本語字幕を追加しています。Googleが勝手につける自動字幕は、こちらも滑舌が悪いせいで精度が悪いので、徐々に編集していきます。

このシリーズの狙い(右の ⋁ で展開)

ここでは、プログラミングの基礎をPythonによる数値計算(シミュレーション)を例に学ぶ。狙いは、Python さらには数値計算というよりも、プログラミングの基礎を学ぶ教材として、Python + 数値計算を利用するということだ。想定している学習者は、以下の様な方々。


  • 学校でプログラミングを学んだが、自分では何も作れない事に気が付いた

  • サンプルプログラムを打ち込んで意味はわかるが、作れない

  • 数値計算をしているが、人のプログラムを使っているだけでよくわからない

  • ハイテンションなYouTube動画のプログラミング教材はつらい


そもそも Python 言語は実行速度が遅いため数値計算(シミュレーション)には向いていない。速度が遅いのだ。いやいや、NumPy使うんだよ、そういうときはという方もおられるだろうが、あれは C言語等で書かれた高速に動く「関数」を呼び出しているだけではないか。あえて言えば、シェルスクリプトを高級にしたようなものだろう。フルにPython言語で数値計算を書くと、ここに紹介する例でもわかるように遅くてたまったものではない。なぜPythonを使うのかというと、揃った環境を整えやすいという事が大きい。AnacondaでPythonを導入してもらえれば、グラフの描画を含めて同様の環境が mac, Windows, Linux で完成する。プログラミング教材がややこしいのは、環境構築にある為、その辺りが助かる部分だ。Python言語については、個人的には好きでは無いが、入門的には良い部分もある。ただし、Pythonの機能を使おうとするあまり、例えばC言語に移ろうとしたときに困る事態が想定される。よって、ここではPythonらしい使い方はしないことにする。良く、アルゴリズムの教科書にあるようなアルゴリズム記述言語的な利用方と言えば良いだろうか。

私は数値計算をプログラミングの教材として使う事には次の様なメリットがあると前々から考えている。

  • プログラムの基礎的な構成要素である、繰り返し、配列、条件分岐が素直に使われる。

  • 単純である。

  • 実現象と関わる数学に触れることもできる。最近のゲームなどは物理シミュレーションをベースにしているが、それは常微分方程式や偏微分方程式を簡易的に解いているわけで、数値計算そのものである。

多くのプログラミングに関する教材があり、様々試してきたがどうも興味が持てないという希有な人にぴったりかも知れない。やはり興味が持てないというかたは、そもそも向いていないのかも知れない。例えば、スマホのアプリ開発がしたいという方にも導入としてはおすすめだ。やはり、基礎は大事で、その通りに作ったらできた!では進めない領域がある。数値計算のプログラミングとスマホのアプリ開発のプログラミングには、実はかなり大きな差があるが、基本は知っておくにこしたことは無い。ほら、こんな凄いことができたよ!面白いね!から、早く脱却することが大事である。地道な努力が大事だ。

ところで本気で数値計算するなら、C言語を学ぶ事をおすすめする。この一連の動画を学んだ後に、C言語入門に移行すれば良いと思う。最初からそっちでも良い気はするが。Python言語もC言語で書かれているし、モジュールもC++あたりで書かれている。他の言語、例えば最新のSwift言語を学ぶにしても、C言語の知識は役に立つ。色々意見はあるだろうが、C言語はスタート地点として良い言語だ。しかし、ここではPythonを使う。

ここでは動画は一時停止などができるので、あまり時間をとるようなことはしていない。適宜一時停止を利用して欲しい。動画はショボいですが、必要十分だと思っている。途中、ぼそぼそ喋りながら作っているが、考えながら作っているのでそちらも参考になれば。

macでやってるが、WindowsやLinuxでも同様だ。多分、Anacondaは無いが、Raspberry Piでも matplotlib さえ入れればオーケーだ。(私のもっているラズパイには、Thonny Python IDE というものが入っていて、それにここでのコードをコピペで動いた。python3 を起動しているが、これらが最初から入っていたのか、後から入れたのか定かでは無い。)

講義

講義は8回である。基本的にウェブ上のテキストと、動画内でのライブコーディングで紹介する。Web上のテキストだけで内容はわかるが、動画については、そもそもどういう風に考えてプログラムを組み立てているのかの参考にして欲しい。特に、繰り返し文については、苦手意識というか、何がわからないかがわからない状態にになってしまう人が多いが、その辺り気をつけて解説する。基本的に、編集無しで撮りっぱなし動画なので、つまったりするだろうがご愛敬。

基本的にPythonの標準機能しか使わない。Pythonの格好いい使い方を学びたい人はここでは無い。きっちりこのコンテンツで学べば、数値計算を使った研究の入口に立てるし、プログラミングについても、より高度なプログラミングに向けた入口には立てると思う。誰かの役に立てば幸いである。

おまけ回では、反応拡散系の2次元シミュレーションを紹介する。可視化については matplotlib を用いたものから、データファイルを書き出し、それを ParaView 可視化するという手法に変更し、その後 Python コードをC言語に書き直すことを実演する。ついでに、2次元波動方程式の数値計算も載せた。


  • PythonをAnacondaで導入(macOS, Windows)

  • Mac のエディターについて

  • Ubuntu(Linux) での Python

  • ファイル名、フォルダー、ターミナルでの操作一通り

  • 変数、繰り返し、リスト(配列)の概要

  • ランダムウォークを少し

  • モンティホール問題のシミュレーション

  • matplotlib で折れ線を描く

  • 線形補間

  • 放射性炭素による年代測定(1階常微分方程式)

  • ロジスティック方程式

  • 単振動・減衰振動(2階常微分方程式)

  • ルンゲ・クッタ法とオイラー法の誤差の検討

  • 強制振動

  • ローレンツ・アトラクター(但しデモはオイラー法)

  • 放物運動のシミュレーション(但しデモはオイラー法)

  • フーリエ級数が与えられたときに、元関数を再現する

  • フーリエ級数を数値的に求める(素朴な方法、FFTではない)

  • (陽解法の)アルゴリズム

  • 安定性条件

  • アニメーションの作成

  • (おまけ)1次元Gray-Scottモデル(反応拡散系)の数値計算

  • アルゴリズム

  • 初期値の違い

  • 2次元Gray-Scottモデル(反応拡散系)の数値計算

  • ParaViewで可視化(データをVTK形式で書きだす)

  • PythonコードをC言語で書き直す

  • 2次元波動方程式の数値計算