高校生(理系の進学希望らしい)からメールをもらった。(誰が見ているかわからないものだなぁ)
趣旨は、シミュレーションは非常に興味があるが、アナログな世界をデジタルで計算する基本的な手法について教えてほしい、とのこと。高校レベルの微積分の知識はあるらしい。
まず、量子力学が一般的になった現在ではニュートン力学やラグランジュ力学のようなアナログ(連続)な世界はもはや無いと考えてよく、全てデジタルだと考えたほうが良い。無論、自分もそういった古典的な力学体系で教育されてきたが、この辺は日本の数学や物理の教育の遅れを強く感じる。
竿燈シミュレータの中身の数学的な部分を高校生でもわかるように解説してみる。
まずは『微分』だ。(コンピュータ的には『差分』=微分の近似)
微分は、ある量が「ほんの少し時間が進んだとき、どれだけ変化したか」を表す。たとえば位置 x(t) の時間微分は速度 v(t)になる。
v(t) = dx(t)/dt
このdtを限りなく0(ゼロ)に近づける考え方が「極限」の考え方だがコンピュータでは「dtをゼロ」にするという操作はできない。ゼロで割れないから。
そこで十分に小さいΔtを使う。
v[n] ≈ (x[n+1] – x[n]) / Δt
0.01 秒の間に竿先が 2 mm 動いたとする。平均速度は
v ≈ 0.002 / 0.01 = 0.2 m/s
です。Δt を小さくすれば、短い時間の変化をより細かく追える。ただし、Δt を小さくしすぎると計算回数が増える。差分の扱いは3種類あって、
|
名前 |
式 |
特徴 |
| 前進差分 | (x[n+1]-x[n])/Δt | 実装が単純。未来値が必要。 |
| 後退差分 | (x[n]-x[n-1])/Δt | 既に計算済みの値だけで作れる。 |
| 中央差分 | (x[n+1]-x[n-1])/(2Δt) | 同じ Δt なら一般に精度が高い。 |
以上が『微分』『差分』の考え方で、差分にするとプログラムのコードがなんとなく見えると思う。
積分は、「非常に細かい量を全部足したもの」と考えることができる。速度を時間について積分すると位置になり、加速度を積分すると速度になる。
コンピュータでは、Δt ごとの小さな長方形の面積を足す。
x[n+1] ≈ x[n] + v[n] Δt
位置や速度の概念としては、結局
x = x + v * dt
v = v + a * dt
となる。この2行は「1回だけ」では大したことをしていないが、1秒間に数百回繰り返すと時間変化を追跡できる。