mmm2第3回 ランダムウォークとブラウン運動(10月18日)




第1回レポート提出者未提出要再提出

S133045 S143004 S143007 S143008 S143010 S143013 S143014 S143015 S143018 S143021 S143022 S143023 S143024 S143025 S143028 S143031 S143038 S143041 S143043 S143044 S143047 S143051 S143053 S143054 S143060 S143067 S143069 S143071 S143074 S143075 S143076 S143078 S143080 S143082 S143087 S143091 S143092 S143093 S143095 S143096 S143097 S143098 S143103 S143105 S16B014 S16B015

まだ提出していない人は、できるだけ早く提出してください。


*出席確認

<出席確認メール> 添付ファイルなし 受付:本日14:30〜16:15

本日のキーワードは授業中に連絡します。


宛先:miwamoto[at]riko.shimane-u.ac.jp

件名:MMM2 20161018

本文: 学生番号 名前 「本日のキーワード」



インタラクティブな描画(キーボード入力)


練習1 次のプログラムコードを入力し、「20161018-1」という名前で保存せよ。(復習のためにコピペせずに手入力すること)


void setup()

{

        size(400,400);

        background(255,255,255);

}

void draw()

{

        if(keyPressed == true)

       {

         println(key);

       }

}


キーボードが押されたかどうかは、keyPressedを使って、知ることができる。また、押したキーの情報はシステム変数keyに格納される。変数keyはchar型で、半角英数字1文字だけを格納することができる。


練習2 練習1で、「  if(keyPressed == true)」をコメントアウトすると何が起こるか確認せよ。


draw()のなかにキーボード入力に関する処理を入れると、一度しか押してなくても、何度か押したと処理されてしまう。一度キーボードを押したときに、一度だけ処理されるようにするには、setup()やdraw()関数とは別にキーボード処理の関数をかく。

Processingにはキーイベントに応答して呼び出される関数が3つ用意されている。

キーを押したとき

keyPressed()

keyPressed()とkeyTyped()の違いは、

[Shift]キー、[Ctrl]キー、[Alt]キー

キーを押したとき
(Shift, Ctrl, Altは使えない)

keyTyped()

などに応答するかどうかである。

keyPressed()はすべてのキーに応答する。

キーを離したとき

keyReleased()





練習3 練習2を以下のように変更せよ。


void setup()

{

        size(400,400);

        background(255,255,255);  

}

void draw()

{

   

}


void keyPressed()

{

         println(key);

}



キーボードのcを押した

key == 'c'

「キーボードのある文字を押した」という処理をしたいときには、'一文字'のようにコーテーションマークで囲む。



練習4 前回配布した「ball」フォルダをコピーし、「ball_key」と名前を変更せよ(そのフォルダ内のball.pdeもball_key.pdeと変更すること忘れずに!)。キーボードの「s」を押したら、ボールが動き出し、「q」を押したらボールが止まるように変更せよ。



インタラクティブな描画(マウス入力)


現在のマウスのウィンドウ上のx座標

mouseX

マウスのウィンドウ上の座標を取得するには、mouseXやmouseYを使う。


現在のマウスのウィンドウ上のY座標

mouseY





キーボード入力と同様に、マウスの処理についても、5つの関数が用意されている。

マウスボタンを押さずにマウスを動かしている間

mouseMoved()

マウスボタンを押しながらマウスを動かしている間

mouseDragged()

マウスを動かしている間は、mouseMoved()かmouseDragged()が繰り返し呼ばれる。どちらが呼ばれるかはマウスボタンの状態による。


マウスボタンを押したとき

mousePressed()

マウスボタンを離したとき

mouseReleased()

マウスをクリックしたときはmousePressed()、mouseReleased()、mouseClicked()の順番に呼ばれる。クリックした位置を確実に取得したい場合はmouseCliced ()ではなく、mousePressed()を使う。


マウスボタンをクリックしたとき

mouseClicked()





練習5 練習3のコードの最後に以下のコードを追加せよ。

void mousePressed()

{

 fill(255,0,0);

 ellipse(mouseX, mouseY, 30,30);

}

練習6 練習5のコードの最後に以下のコードを追加せよ。

void mouseReleased()

{

 fill(0,255,0);

 ellipse(mouseX, mouseY, 30,30);

}

練習7 練習6のコードの最後に以下のコードを追加せよ。

void mouseClicked()

{

 fill(0,0,255);

 ellipse(mouseX, mouseY, 30,30);

}


練習8(発展) 練習4の「ball_key」を変更して、マウスをクリックすると新しくボールが増えるようにするにはどうすれば良いか考えよ。



粒子のランダムウォーク(1次元)




直線上に1つの粒子がある。この粒子が時間とともに左右に移動するのであるが、その移動が完全にでたらめである場合、その運動をランダムウォーク(または、酔歩、乱歩)と呼ぶ。

【1次元ランダムウォークのルール(最も簡単な場合)】

・粒子は、次のステップで距離δだけ右か左に動く

・各ステップで左右に行く確率はそれぞれ 1/2 であり、前のステップでどちらに動いたかは記憶していない。

・各粒子は他の粒子と独立に動き、相互作用することはない。(重なってOK)


練習9 配布されたプログラムコードrandomwalk.pdeを変更して、10個の粒子が1次元上をランダムウォークするプログラムを作成せよ。「randomwalks」として保存せよ。


練習10 粒子を100ステップランダムウォークさせたときに、はじめの位置からどのくらい遠くまで移動できるだろうか?(当然、はじめの位置から100×δ以上離れたところには移動できないが、100×δ離れたところに移動する可能性もかなり低いそう)複数の粒子(例えば1万個)をランダムウォークさせ、100ステップ目のランダムウォークでどの格子点に到達するかを観察し、100ステップ目に各粒子がいる位置の平均を計算するプログラムを作成せよ。(ステップの回数は、 frameCountで取得できる)



粒子のランダムウォーク(2次元)

fig3-1


1次元ランダムウォークモデルと同様に、粒子の2次元ランダムウォークを考える。今、二次元格子状に粒子があるとし、その粒子の運動はでたらめであるとする。つまり、次の時間、右に移動する、左に移動する、下に移動する、上に移動することが同確率で起こるとする。


練習11 配布されたプログラムコードrandomwalk.pdeを変更して、2次元上をランダムウォークするプログラムを作成せよ。「randomwalk2」として保存せよ。


練習12 練習11で各方向への移動確率を変化させると運動はどのようにかわるだろうか?実験してみよ。


練習13(復習) 練習11を変更して、壁まで行ったときに跳ね返るようなプログラムに変更せよ。


ブラウン運動

1827年ロバート・ブラウンが、花粉から出た微粒子が水中でランダムな運動をすることを観察した。しかし、この現象のメカニズムはわからないままであった。20世紀初頭、アルベルト・アインシュタインが、原子の存在を仮定し、溶液の浸透圧の式と流体力学の式や確率過程の統計的な解法を用いて、原子の存在があれば、顕微鏡で観察可能な程度の大きさの粒子のランダムな運動が観察されるはずであり、また逆も然り、ということを提起した。アインシュタインの導いた式とブラウン運動の観察結果からアボガドロ定数を求めることができる。


このブラウザは埋め込まれたオーディオファイルを再生できません




粒子の平均位置

1次元ランダムウォークを考える。初期時刻にN個のすべての粒子が原点にいるとする。

第i番目の粒子のnステップ目の位置を 、1ステップに進む距離を とすると、


 

nステップ目のN個の粒子の位置の平均(平均位置) は、

 

粒子数Nが十分大きいとき、

 

 


初期位置が原点なので、 である。よって、

 




本日の課題 2次元ランダムウォークのシミュレーションで、100粒子が同時にランダムウォークするシミュレーションを完成せよ。ただし、粒子間の相互作用はないと仮定する。この場合,一つの格子上に複数の粒子があってもよい。(粒子同士の衝突などは全く考えない。)「randomwalks2」として保存せよ。


本日の課題2(発展)

複数の粒子(例えば1万個)を2次元ランダムウォークさせ、100ステップ目のランダムウォークでどの格子点に到達するかを観察し、100ステップ目に各粒子がいる位置の平均を計算するプログラムを作成せよ。


本日の課題3(発展) 2次元ランダムウォークのシミュレーションで、100粒子が同時にランダムウォークするシミュレーションを完成せよ。ただし、粒子間の相互作用を考え、一つの格子上には一つの粒子しか存在できないと仮定せよ。(移動先に既に粒子が存在する場合には、移動させないといった処理が必要となる。)