2016/01/31

数学を生き生きと理解するためのプログラミング


2. 数学を生き生きと理解するためのプログラミング 

コンピュータによる微分方程式のシミュレーションは強力で, その原理は簡単だが, 実際には数々難しい点がある. まず, 上でも書いたとおり数値シミュレーションで求めているのはあくまで近似解である. その近似解がどの程度現実に近いかは(厳密解をシミュレーションで求められない以上), 数学を用いて評価するしかない. それをしないままシミュレーションをすると, 現実と, 定性的にも全くかけ離れた結果(現実の解は発散しないのに, シミュレーションでは発散してしまうなど)を出し, 間違った結論を出してしまうこともあり得る. どのようにしたら, 誤差は許容しつつ, かつ「定性的に望ましい」解が得られるかというのは, 闇雲に分かるものではない. 

また, シミュレーションで現象をモデル化する場合でも, 現実をダイレクトにモデル化することは不可能な場合がほとんどである. 例えば銀河系をシミュレートするのに星一つ一つを質点とみなして計算したのでは, 銀河系一つで数十億個の質点間の引力を計算することになり, とてもできるものではない. このようなとき, どのように現実を近似してもよいか, あるいは支配方程式をどのように書き換えて, より効率的に解を得るかという考察のために数学が重要な役割を果たす. 

これを, コンピュータシミュレーションを学ぶためには数学も学ばなくては「いけない」 (事実その通りではあるのだが)と見ずに, むしろ数学を学ぶご利益を, コンピュータが非常にわかりやすく見せてくれると思うと良いのではないだろうか.
例えばこれから線形代数で, ガウスの消去法に始まり, 行列のランク, 固有値・固有ベクトル, 行列のJordan標準型, という一連のストーリーを学んでいくことだろう. 例えばJordan標準型のその導出は高校の時の「行列の対角化」と似ているが, それよりはるかに厳密で難しく, 結果も複雑である. 難しさの原因は高校の時と違って具体的に与えられた行列に対して大体計算が出きればよい, と言うだけでなく, 「全ての行列が」どのような標準型を持つのかを余すことなく, 完璧に論じようとするからである. そもそも大きな行列を何に使うか分からない状態で, これらをしっかり学ぶ気力を持続するのは中々大変である. 

コンピュータによって行列の固有値や固有ベクトルを求めるのに, 非常に簡単な方法があるのだが, その方法が「うまく行く」事をきちんと確認(証明)しようと思うと, 行列の標準型に関する理解が役に立つ. ここではその詳細が重要なのではなく, 大学で習うような「厳密な」数学が, あるプログラムが「全ての入力に対して」動作することをしっかり議論するのに本質的な役割を 果たすということである.

参考リンク
線形代数の本はいわゆる教科書以外に, 実践重視,イメージ重視など説明に工夫を凝らしたものがいくつもあるので探してみると良い.

出典Motivation to learn computer

微分方程式のシュミレーション

今日から数回に渡り,田浦健次朗氏がお書きになったWikimediaの5つの記事を紹介したいと思います。動機はそこに書かれている数式が氏の思惑どおりに表示されないことでした。原文そのままに転載いしたします。

  • 微分方程式のシュミレーション
  • 数学を生き生きと理解するためのプログラミング
  • 乱数(試行)を用いた計算やシミュレーション
  • 機械学習(例からの関数近似または補間)
  • 4色定理とコンピュータ

1. 微分方程式のシュミレーション

物理や化学,様々な工学の分野の問題は微分方程式(wikipedia)を解く事に帰着される.その理由は,自然の様々な現象の根本的な法則が微分方程式を用いて記述される事に起因する.たとえば高校の物理では,ニュートンの運動方程式
\[m a = F\,\]
を習うが,これは質点の動きを支配する方程式である(剛体や流体も質点の集まりとしてその支配方程式が導かれる).ここで$ a\,$は加速度,つまり質点の位置を時間で2階微分したもの. $F\,$は一般に質点の位置や速度(つまり位置を時間で一階微分したもの)の関数として書けるため上記は質点の位置時間の関数)を未知の関数とした方程式, つまり微分方程式になる.
バネにつながれたおもりが単振動をするのも, 太陽のまわりをまわる惑星が楕円軌道を描くのも, すべてここから導かれる.前者の微分方程式は,
\[m \ddot{x} = - k x\]
後者は,
\[m \ddot{x} = - G \frac{mM}{|x|^2}\]
である.その他に,回路の方程式,化学反応中の分子の量,なども同じくらい簡単な方程式で記述される.
コンピュータはこれらの微分方程式を「解く(=その関数を時間の関数として求める)」のに驚くほど簡単で統一的な方法を使う. (常)微分方程式は一般に

                                            ある量$x(t)\,$の微分(時間変化)=$x(t)\,$の関数

数式で書けば,
\[\dot{x}(t) = G(x(t))\]
という形をしている(説明は省略するが,元の方程式に2階以上の微分係数が含まれていても,結局はこの形に変形できる). これを解くとは,この式を満たす関数 $x(t)\,$ を求めることに他ならない. そのためにコンピュータでは,与えられた初期値 $x(0)\,$ から出発して,「ほんの少し時間がたったときの状態」を繰り返し求めていく. つまり,
\[x(t + h) \approx x(t) + \dot{x}(t) h = x(t) + G(x(t))\] という式(最初の$\approx\,$は微分係数の定義,次の等号は,微分方程式そのものによる)を使って,
\[
 \begin{array}{rcl}
x(h) & = & x(0) + G(x(0)) h \\
x(2h)& = & x(h) + G(x(h)) h \\
x(3h)& = & x(2h) + G(x(2h)) h \\
\ldots
\end{array} \] という計算を順に行う事で, $x(t)\,$ という関数の概形を求めていく.これを実行するプログラムは行数にして10行もあれば書ける.しかもこのやり方は $x\,$ が単なる実数であろうと,ベクトルであろうと,まったく同様に使える.
もちろん上記の式は正確には「近似式」であり,正確ではない.したがって方程式の「正確な」解からはある程度の誤差がある.また, 答えが sin, cos のようなよく知った関数で書けたとしても,解が sin/ cos そのものであるということまで教えてくれるわけではない. その意味で微分方程式の階が「本当に分かった」という知的満足度は,実際に答えを式で求める場合と比べて低いのかもしれない.
しかし,この驚くほど単純な方法はほとんど微分方程式の「形」によらず適用できるという強みがある.つまり手計算によって「解ける」微分方程式は非常にその範囲が限られており,解ける・解けないの境目が非常に細かい式の形に依存しているのに対し,ここで述べた解法は,右辺の形がある程度「まともな」関数であれば常に適用できることが期待される.そして実際の物理や工学で現れる微分方程式はほとんどの場合複雑で,答えを閉じた式として求めることは期待できない.さらにそもそも,「閉じた式」で求まるとは,解がたまたまよく知っている関数の組み合わせで書けるという事を意味するだけであって,解が閉じた式で求まる場合を特に有り難がる理由もないということになる.
数値的な解法は微分方程式が複雑になり混み入るほど有難い解法となる.例えば銀河は非常に多数の星の集まりで,そのような多数の星の集まり全体の動きも,星や星間ガスなどの質量の間の万有引力が支配している.この解が閉じた式として求まるということは期待すべくもないが,コンピュータによる数値的な近似解であれば,「原理的には」巨大な連立の微分方程式の解を求める事で求められると期待できる.それがうまく行けば,なぜ銀河はあのような渦巻き形をしているのか,銀河の行く末はどのようになるのか,などが理解できるようになると期待される(もちろんそれは非常に難しい問題であり,基本的なやり方を理解するだけですぐにできるという意味ではない).
File:Galaxy.png
式の形はどんどん難しくなるが,電磁気学のマックスウェル方程式,量子力学のシュレディンガー方程式,熱力学の熱伝導方程式,波動方程式,流体の動きを記述するナビエストークス方程式などもすべて(偏)微分方程式である.
これほど多様な現象に対する解が,同じ原理で求まるというのは非常におもしろいと思うのだがどうでしょうか? また,私にとっては現象を「理解する」ないし「分かったような気がする」ために,それをシミュレートするプログラムを書いてみる,そして,起こるべき事が起こるかどうかを確かめてみるというのは,非常に良い手段のように思われます.より基本的な法則から難しい方程式を導いたり,あるいはシュレディンガー方程式のように「これが法則だ」と言って与えられても,私のような)凡人にはなかなか「理解」した気にはなれないものです.どうなれば「理解」したことになるかは難しいところですが,やはりそれを用いて現象を予測するなどして,実際に使っているうちに各項が果たす意味のようなものが分かってくるのではないでしょうか.しかし実際には解析的に予測できる現象はなかなか少ないですし,できたとしてもむしろ式変形の難しさに埋没されてしまいがちです.数値的に解を求め,それが「それらしい」解であることを確かめることができれば,印象にも残りますし,使っているのは数式だけですから,微分方程式だけから確かにその現象が「導かれた」という感覚が自然に湧き上がって来ます.この後物理や化学で出てくる数々の微分方程式に対し,それをコンピュータにシミュレートさせてみようという動機を持つと(持っていたら),それらをより面白く学べる(た)のではないかと,思います (括弧内は,自分の事を言っています).
おすすめの本:
微分方程式によって色々な現象がモデル化できるということを説明したわかりやすい本
表計算ソフトExcel(だけ)で,微分方程式をはじめとするシミュレーションができてしまうという本.実は類似の本は多数あるので生協などで探索してみると良い.授業でもさわりを課題として取り上げる予定.

出典Motivation to learn computer