Java scriptによるシミュレーション.

z軸方向には自由に動けるが, x,y軸方向には動けない質点を並べて, 隣合う もの同士をバネで接続したものを考え, 時間が経つとどの様に変化をしていくか 計算します. こちらに置いておきますが, Javascriptで書いているので非常に重いので注意してください.

使い方とか.

Createのボタンを押すと, シミュレーションをするための要素を表示します. 隣にある入力欄で, cellのサイズや それぞれのcellを表示するときの幅, Cellを1次元/2次元的にならべる などの設定をできます. 1dimを選ぶとcellは直線状に並べられます. 2dimを選ぶとcellは六角格子状に並べられます.

Createのボタンを押すと, シミュレーションをするための要素が表示されます. Start Simulationを押すと計算を始め, Stop Simulationを押すと計算を中断します. その次にある入力欄で, 描画を更新する間隔(ms), 一回の描画のために何ステップの計算をするか, simulationの微小時間 などを設定できます.

一次元の時には, 表示された段階で初期状態として, z軸の座標がnontrivial になっていますが, 2次元の時には全て0に設定されていますので, そのままStart Simulationのボタンを押しても何も起こりません. 以下に書いてあるHitボタンを押し初期の波形を設定してください.

一次元的にcellをならべている時には, Show/Hide current positionというボタンがありますが, 各cellのz軸の情報を縦軸方向の位置として表示するかを選べます. デフォルトでは表示しませんが, 表示をすると波の伝播の様子がわかります. 二次元の時にはわかりやすく表示する方法が思いつかなかったので, このボタンはありません.

Reset positionというボタンを押すと, 全てのcellのz軸方向の位置と速度を0に設定します.

Hitというボタンを押すと, cellのz軸方向の位置を変化させます. Index of centerで指定されたcellから指定された半径の以内のcellのz軸方向の 位置を変化させます. 最大の変化量をpowerとして指定できます. (負の値も指定できます.) cosをつかって変化させます. 表示されているcellをダブルクリックするとそのインデックスが Index of centerの欄に入ります.

基本的には書くセルはz軸には自由に動けますが, 赤く囲われたcellは固定されます. 表示されているcellをシングルクリックすると 固定/自由 切り替えることができます.

最後の行の入力欄で, 質点の質量, バネ定数, 減衰係数, などの物理定数を指定できます. 速度と減衰係数に比例する力が各cellにはかかります.

時刻tにおけるcellの速度をv_tとします. s(t,f) = max { f^{t-t'} |v_{t'}| } とおきます (ただしt'は t'≦ t を動く). Forgetting rateに入力された値が f の時, s(t,f)を計算し各cellの色が決まります. s(t,f)が大きいほど白っぽくなります. 大雑把に言うと, (過去に) 激しく運動していたところほど白くなり, 余り動いていないところは濃くなるという状況になります. fとして指定する値は1から0までの値を想定しています. 色自体は各cellのs(t,f)を計算し相対的に決めています. もし全てが同じ値であれば, 黒になります.

別のcell sizeや次元などを試すときには, reloadしてください.

注意とか.

やっつけで書いたので汚いですし間違いもあるかもしれません. ライセンスはLGPLとしますので自由に使ってください.

どこかを外力で振動するようにするなどの変更を加えると, 共鳴/固有振動などを調べることができて面白いかもしれません. また他の隣接関係を実装するということも面白いかもしれません.

Javascriptで書いているので, 重いです. cellの数を大きするととたんに死にますので気をつけてください. HTML5にある, Canvasとかを使えば良いのかもしれませんが, (悪乗りで) Canvasなどは使っていません. ただし, 表示の部分だけの問題ではあるので, 比較的簡単に修正できると思います.

Chladni図形に着想を得て書きましたが, Chladni図形のsimulationになっているかどうかは知りません.


../