シミュレーション論 Ⅱ 第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 が再帰回数になります ベースとなる直線の始点・終点の座標 コッホ雪片のプログラム ベースの直線を逆正三角形(正三角形でもよい)になるよう 配置するとコッホ雪片が描けます コッホ曲線の応用 色を着けてみたり、内向きのコッホ雪片にするなど色々と 試してみてください
© Copyright 2024 ExpyDoc