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

Download Report

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

シミュレーション論 Ⅱ

第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 が再帰回数になります ベースとなる直線の始点・終点の座標

コッホ雪片のプログラム  ベースの直線を逆正三角形(正三角形でもよい)になるよう 配置するとコッホ雪片が描けます

コッホ曲線の応用  色を着けてみたり、内向きのコッホ雪片にするなど色々と 試してみてください