シミュレーション論 Ⅱ
第13回
演習:C言語によるシミュレーション作成
ランダムウォーク


物体(人・粒子など)の移動する方向(および距離)が確率
的に与えられており、時間とともにその動きを追うような問
題
元々はブラウン運動(水に浮かぶ花粉の不規則な運動)を
シミュレートするためにモデル化されたもの
ブラウン運動のシミュレーション(Wikipediaより引用)
手作業でのランダムウォーク


講義では乱数表を用い、4方向に動くランダムウォークを
手作業で作成した
今回はC言語を使ってプログラミングしてみよう
ランダムウォークのプログラミング
プログラムの流れ




移動する物体の中心座標(x, y)を決める
座標を中心にして円を描く
ランダムに0~3の数値を生成し、それぞれ右、左、上、下
への移動に割り当てる
物体をその方向へ移動させる
以上の手順を繰り返す
※今回は境界条件として、移動する枠内の上下と左右を連結
してあります
ランダムウォークのプログラム



プログラムの全体は資料を参照してください
Ultra-Cを起動してください
まず、最初の部分に以下のように書きます
r : 円の半径
dist : 1回の移動距離
MAX : 繰り返し回数
wait : 実行速度の調整用
ランダムウォークのプログラム(2)

続いて本体(main関数)を作成します
x, y : 円の中心座標
s : 移動方向
step : 繰り返し回数カウント用
i : 実行速度の調整用
円の中心の初期座標
ランダムウォークのプログラム(3)

枠と円を描画します
MAX回まで繰り返し
白い四角形の描画
(x, y)を中心に、
半径 r の赤色の
円の描画
注:グラフィックの位置


グラフィック・ウインドウ上の位置は座標(x, y)で表される
通常のグラフなどの軸と異なり、グラフィックでは左上が
(0, 0)となり、x 座標は右へ、y 座標は下へ行くほど大きく
なる
(0, 0)
x軸
(10, 10)
(50, 50)
y軸
ランダムウォークのプログラム(3)

rand() 関数を使って0~3の乱数を生成し、それぞれ右、
左、下、上に割り当てます
0~3の乱数を生成
乱数に応じてx, y を
変化させ、上下左右
のいずれかへ移動
ランダムウォークのプログラム(4)

上下左右を接続し、枠の端まで行ったらもう一方の端から
出てくるようにします
枠をはみ出したら
反対側の端へ移動
ランダムウォークのプログラム(5)

このままだと実行が早すぎるので、無意味な計算を適当
に繰り返させて実行を遅くします
計算自体は無意味
繰り返し回数(wait)
を増やすと実行に
時間がかかる
注:通常C言語ではsleep関数を使うなどして実行待ちができますが、
Ultra-Cでは使えないので苦肉の策としてこのようにしてあります。
正直かなり恥ずかしい力技なので、将来プログラマーなどに
なる方は間違っても仕事の際に真似しないようにしてください。
ランダムウォークのプログラム(6)



for文、main関数のカッコを忘れずに閉じて実行します
上手くいっていれば円が枠内を動き回る画面が表示され
るはずです
ウインドウを外に出したい場合は「オプション」⇒「インタプ
リタ」を開いて「グラフィックウインドウ」を「アプリケーション
ウィンドウの外に出す」にチェックしてください
※描画が早すぎたり遅すぎる場合はwait
の値を調整してください
※r や dist も変更して色々試してみてください
ランダムウォークのプログラム(7)


移動した軌跡を残したい場合は、赤い円を描いた後で白い円を上書
きし、それを残したまま新しい赤い円を描きます。
白い枠をfor文の繰り返しの中で描いてしまうと上書きしてしまうので、
for文の外に出します。
for文の外に出す
白い円を
上書き
コッホ曲線


フラクタルの代表図形であるコッホ曲線を描画するプログ
ラムを作成しましょう
キーボードから、繰り返しの操作回数を入力して様々な曲
線を描けるようにします
コッホ曲線の描き方


直線を三等分し、中央に正三角形のでっぱりを作成する
さらに三等分された線分についても同様の操作を繰り返す
再帰プログラム


今回は「再帰関数」という「ある関数の中にその関数自身
を呼び出して使う」形式を用います
ここでは「直線を描画する、または線分を三等分する」と
いう機能を持った関数を再帰的に使います
1
2
コッホ曲線のプログラム(1)

まず以下のように書きます
C言語では角度はラジアンで
表記するため、変換に使う
コッホ曲線のプログラム(2)

直線描画をおこなう再帰関数を作成します
dimが0なら直線を引いて終わり
座標の計算
計算した座標について、それぞれの
線分にもこの描画関数を適用
計算している座標


プログラム内の座標は以下の点に相当します
さらにそれぞれの線分にも同じ操作をします(再帰)
x4, y4の座標の計算方法について
コッホ曲線のプログラム(3)


main関数で再帰回数を決め、描画します
ここでの n が再帰回数になります
ベースとなる直線の始点・終点の座標
コッホ雪片のプログラム

ベースの直線を逆正三角形(正三角形でもよい)になるよう
配置するとコッホ雪片が描けます
コッホ曲線の応用

色を着けてみたり、内向きのコッホ雪片にするなど色々と
試してみてください
ダウンロード

演習:C言語によるシミュレーション作成