環境シミュレーション セル・オートマトン セル・オートマトン(cellular automata)の一例 として,ここではイギリスの科学者スティーブン・ ウォルフラムが開発したセル・オートマトンの一次 元モデルを紹介する(ウォルフラムは数学ソフト "Mathematica"の作者としても名高い). 1)4 行以下のシートには実際には「1」または「0」 の数値が入っている.これを[セルの書式設定][ユー ザ定義]を用いて「[青][=1]"●";[=0]"";G/標準」と指 定したものである.また全ての列幅を 4 mm に統一 している. ウォルフラムのセル・オートマトンは,一つひと つのセルの白黒が,そのセルの上段の三つのセル (真上,右上,左上)の状態(白黒)のみによって 規定されるという単純なものである.しかし,規則 の設定次第では,フラクタル図形を描く不思議なオ ートマトン(自動機械)である. 2)プログラムとしては先ず A1 セルであるが,こ こは 10 進法で 0 から 255 を入力する場所になって いる.これは,セルが白黒(このプログラムでは青 ●か空欄)のいずれかになるかのルールの組合せが, 256 通りあることに対応している.256 通りとなる 理 由 は , 上 段 三 つ の セ ル の 白黒の組み合わせが 2x2x2 = 8 通りであり,それぞれの組合せにおいて 下のセルが白黒のいずれかとなる 2 通りがあるので, ルールとしては全部で 28 = 256 通りとなるのであ る. スピンボタン ちなみに上図は[表示][ズーム]倍率指定 10%とし たもので,これを通常の 100%で見ると下図のよう になっている. 3)B1:I1 には下表のような式が入っている.この B1:I1 は A1 の値を 2 進法で表したものである. 下セル○か●か 右上 真上 左上 - 11 - 環境シミュレーション B1 C1 D1 E1 F1 G1 H1 I1 =INT(A1/2^7) =INT((A1-2^7*B1)/2^6) =INT((A1-2^7*B1-2^6*C1)/2^5) =INT((A1-2^7*B1-2^6*C1-2^5*D1)/2^4) =INT((A1-2^7*B1-2^6*C1-2^5*D1-2^4*E1)/2^3) =INT((A1-2^7*B1-2^6*C1-2^5*D1-2^4*E1-2^3*F1)/2^2) =INT((A1-2^7*B1-2^6*C1-2^5*D1-2^4*E1-2^3*F1-2^2*G1)/2) =A1-2^7*B1-2^6*C1-2^5*D1-2^4*E1-2^3*F1-2^2*G1-2*H1 「=INT()」は Excel 関数で,()内の 数の小数点以下を切り捨て整数を 返す機能をもつ 4)つづいて 4 行(A4:IO4)(ここでの IO4 はア イ・オー・4)には「1」または「0」の値が 50%ず つの確率でランダムに入っている.設定方法として は 先 ず A4:IO4 の 全 て の セ ル に 「=INT(RAND()+0.5)」を入力,これで「1」また は「0」のランダムな数値を発生する.しかしこの ままでは,シートの再計算のたびにこの範囲の値が 変化するため,それを防ぐために,A4:IO4 をすべ てコピーし,同じ場所に[形式を選択して貼り付 け][値]でペーストする. こでは,スピンボタンを設定する.スピンボタンを 利用すれば,マウスクリックで A1 の値を変化させ ることが可能となる. 5)つづいて B5 に を選択.「+」字 ツールバーからスピンボタン カーソルが画面に現れるので,これをドラッグして スピンボタンの場所と大きさを確定する.じゃまに ならないよう,画面右下角がいいだろう.次に,ス ピンボタンを右クリック,現れるメニューから[コン トロールの書式設定]を選択. スピンボタンの挿入には,[表示][ツールバー]から [フォーム]を選ぶ.すると画面に下のようなフォー ムのツールバーが現れる(縦横長はドラッグで自由 に変更できる). =IF(A4=1,IF(B4=1,IF(C4=1,$B$1,$C$1),IF(C4=1, $D$1,$E$1)),IF(B4=1,IF(C4=1,$F$1,$G$1),IF(C4 =1,$H$1,$I$1))) の式を入力する.この式は上段三つのセルの白黒の 組み合わせ 8 通りのそれぞれにおいて下のセルが 「1」となるか「0」となるかのルールを B1:I1 の 1/0 で 指 定 し た も の . あ と は , こ の 式 を 全 範 囲 (A5:IO274)にコピーしてやればよい.注意:少 しでもファイルサイズを小さくするために,倍率 10%ズームで画面上で見えるセル範囲(A5:IO274) だけに限定している. ただし,A 列と最後の IO 列については注意が必 要である.なぜなら A 列なら左上のセルが,IO 列 なら右上のセルに値がないからである.このため例 えば A5 には =IF(IO4=1,IF(A4=1,IF(B4=1,$B$1,$C$1),IF(B4=1 ,$D$1,$E$1)),IF(A4=1,IF(B4=1,$F$1,$G$1),IF(B4 =1,$H$1,$I$1))) IO5 には =IF(IN4=1,IF(IO4=1,IF(A4=1,$B$1,$C$1),IF(A4= 1,$D$1,$E$1)),IF(IO4=1,IF(A4=1,$F$1,$G$1),IF( A4=1,$H$1,$I$1))) [コントロール]タブで最小値 0,最大値 255,変化 の増分 1,リンクするセルとして「A1」を指定して 完成である. の式を入れ,これらの式をそれぞれ A 列と IO 列の 最後の行までコピーしてやる.上記の 2 式が意味す るところは,A 列なら最後の IO 列 1 行前のセルを 左上のセルとして,IO 列なら最初の A 列 1 行前の セルを右上のセルと見なすということである.した がって,画面上は平面に見えるが,A 列と IO 列が つながった円筒になっていると考えればよい. ちなみにこのスピンボタンは,A1 に手入力した 値から開始することも可能である. 6)基本的には5)までのステップでセル・オート マトンは完成である.A1 に 0-255 の値を代入すれ ば,描画の変化を見ることができる.ただし,いち いち A1 に値を入力するのは手間である.そこでこ - 12 - 環境シミュレーション 回数を n としたならば,その 2 つの回数の比率はど うなるだろう.もし N が十分大きければ,この N 対 n の比は,正方形の面積 1 と 4 分の 1 円の面積 π / 4 との比に,ほぼ等しくなると予想される. 3.モンテカルロで乾 π(かんぱい) ここでは,モンテカルロ法と呼ばれているシミュ レーション手法によって円周率 π を求めてみる. 先ずは,題名「モンテカルロで乾 π」についてであ るが,もともと「乾」という文字は「高い空(天)」を意 味するものであった(通常,われわれが「乾」の字から 思い浮かべる「乾かす」の意は,高く空に掲げて干す から転じたもの).これに地を意味する「坤」をつなげ れば「乾坤(けんこん)」となる.よく聞く「乾坤一擲 (けんこんいってき)」とは,天地を賭けてサイコロを ふること(要するに,一か八かの大勝負にでること). モンテカルロ法とは,サイコロをふって答えを見つ けるような方法だから「乾 π」とシャレてみた.(庄 野真代の唄った「モンテカルロで乾杯」を知らない 人は,お父さんか,お母さんに聞いてみよう.) 近代シミュレーションは,J.von Neumann(ゲー ム理論でも出てきたノイマン)と S.M.Ulam の両名 が水爆の研究開発の中で,物質中における中性子の 拡散現象をモンテカルロ法によってコンピュータ で模擬したことに発すると言われている.高速にラ ンダムな方向へ飛び回る中性子の動きをコンピュ ータ内で乱数を使って数値的に再現しようとした のである(大気汚染の拡散シミュレーションに用い られているランダムウォークモデルもランダムな 方向へ飛び回っている汚染物質の運動をモンテカ ルロ法で再現しようとしたもの). N: n ≅1: π 4 上式を変形すれば, π ≅ 4n N となり, π は 4n N で近似できることがわかる.直感的にもわかるよう に,この近似は N が大きければ大きいほど,その精 度が増す. シミュレーション・プログラムの作り方 ここではモンテカルロ法による π 計算を 3 種類 の方法で試みる.これら 3 種類に,今後の授業で用 いる基本的な Excel VBA のテクニックがすべて含 まれているので十分に習熟してほしい. (1) Excel 関数だけを用いた方法 先ず下図が Excel 関数のみを用いて,モンテカル ロ法(100 回の試行)によって円周率 π を求めて みたワークシート(1)である. このようにコンピュータ内で乱数を発生させる ことによって確率現象を模擬して,もとの現象を解 明しようとするシミュレーション手法を,乱数を用 いることから,カジノで有名なモナコの都市モンテ カルロから名をとって「モンテカルロ・シミュレー ション」と呼ぶ(もともと,このノイマンらのプロジ ェクトが最高軍事機密であったことから,軍内部で の隠語としてそう呼ばれていたようである).以前は, シミュレーションといえばモンテカルロ・シミュレ ーションを指す時代もあった. A1:E5 を拡大すると下のようになる. では,モンテカルロ法による π の求めかたを見 てみよう.先ずは,下図のように,半径 1 の 4 分の 1 円と,その 4 分の 1 円を囲む一辺 1 の正方形を考 えてみる. それぞれのセルに入っている式は下表のとおり. B3 C3 D3 B5 C5 D5 E5 もしこの図の上にランダムな点 ( x, y ) を打ち,そ の点が正方形の中に入る回数を N ,さらにその内で 4 分の 1 円の中に入る,すなわち x 2 + y 2 ≤ 1 となる - 13 - =COUNT(B4:B104) =COUNT(C4:C104) =4*C3/B3 =RAND() =IF(B5^2+E5^2<=1,E5,"") =IF(B5^2+E5^2>1,E5,"") =RAND() 環境シミュレーション また,A5:A104 には 1 から 100 までの通し番号 が,B6:E104 には,B5:E5 をコピー・ペーストした 式が入っている. ここで B5 と E5 は RAND 関数を用いて 2 つの乱 数(0-1 の一様乱数)を発生させているセルであ る.それぞれが x と y に相当する.つぎに C5 では, x 2 + y 2 (B5^2+E5^2)を計算して,もし(IF) x 2 + y 2 ≤ 1(B5^2+E5^2<=1)ならば y の乱数(E5) を,そうでなければ空の文字列「""」を,また D5 では逆に x 2 + y 2 > 1 (B5^2+E5^2>1)ならば y の 乱数(E5)を,そうでなければ空の文字列「""」を 打ち出す. B3 と C3 は Excel の COUNT 関数を用いて,括 弧内に指定した B4:B104 と C4:C104 の範囲にある 数値の個数をそれぞれカウントしている.例示され ている B3 の 100 と C3 の 82 は,N =100 組の ( x, y ) を生成させたところ x 2 + y 2 ≤ 1 となったものが n = 下図のような系列設定になっていることを確認 する.もしそうなっていない場合は,系列の削除と 追加を使って,2 つの系列を下図のように指定する. 82 組あったことを表す. 最後に D3 の「=4*C3/B3」は,π の近似値とし て 4n N を求めたものである.例では 3.28 となって いる. 次に乱数で生成した ( x, y ) の点をグラフ上に描い てみる. 1) B4:D104 を指定して,グラフウィザード をク リック,ウィザード画面で「散布図」を指定する. 出 来 上 が っ た グ ラ フ で は x2 + y2 ≤1 の 点 と x 2 + y 2 > 1 の点が色分けされて表示されるはずであ る. (2) Sub プロシージャを用いた方法 つぎに 2 つ目の方法として下図が Sub プロシージ ャという VBA プログラムを用いて,モンテカルロ 法で円周率 π を求めてみたワークシート(2)である. コマンドボタン [次へ]をクリックして,[系列]タブへ. - 14 - 環境シミュレーション シート上の「スタート」と書かれたコマンドボタ ンをクリックすると,VBA プログラムが起動しワ ークシート上に 3000 組の乱数 ( x, y ) を発生させ, グラフにプロットするとともに,ワークシート(1) と同様に D3 セルで π を計算するようになっている. 作成方法としては,先ず前掲のワークシート(1) のコピーを作成する.作成方法はシート(1)を開き [編集][シートの移動またはコピー]を選び,[コピー を作成する]のチェックボックスを して[OK]ボタ ンを押す. 続いて Sub プロシージャ(VBA プログラム)を 書き込むための,モジュールシートを挿入する. モジュールの挿入 Sub プロシージャや後述する Function プロシー ジャ(両者をあわせて VBA プログラムと呼ぶ)を 作成するためには,モジュールと呼ばれるシートが 必要である.モジュールを挿入するには,先ず[ツー ル]から[マクロ],[Visual Basic Editor]を選ぶ.(注 意:Excel 2003 以降では VBA プログラムを使用す るために,モジュールの挿入の前にセキュリティレ ベルの設定変更が必要となる.そのためには 1)新し いブックを開く,2)[ツール][マクロ][セキュリティ] を選び,セキュリティレベルを「中」に設定,3)そ の後,Excel を一旦終了して,再起動する,4)マク ロの有効無効を聞いてくるので,[マクロを有効にす る]をクリックする.これで VBA が使用可能とな る.) 実は先ほどのオプション設定の意味は,この文頭 の一行をモジュールシートに自動的に挿入するた めのものであった.この「Option Explicit」の意味は, もし,そのシートに書かれるプログラム中に,デー タ型を宣言していない変数が使われた場合には,必 ずそのことをエラーとして警告するように,という ものである(データ型宣言の意味については,また後 述する).ここでは簡単に,変数のデータ型を一つ一 つ明示しておいたほうが,プログラムのエラーが見 つけやすくなる,とだけ言っておこう. モジュールシートにプログラムを書いてゆく前 に,もう一つだけ設定をしておこう.[表示][ツール バー]から[デバッグ]を する.これによって下図の ようなツールバーが画面上に現れる. [Visual Basic Editor]を選ぶと下の画面のような [Visual Basic]編集画面が現れる. このツールバーは,VBA プログラムを作成する 際に便利な機能をツールボタンとしてまとめたも ここでモジュールシートを挿入する前に,若干の オマジナイをしておく.それは,[ツール][オプショ ン]の[編集]で[変数の宣言を強制する]のチェックボ ックスを しておくことだ.この設定の意味は後述 する.編集画面でさらに[挿入]から[標準モジュール] を選ぶと,文頭に「Option Explicit」と書かれた白紙 のシート(モジュールシート)が現れる.(またこ こで[挿入]から[ユーザーフォーム]を選ぶと後述す るフォーム画面が現れる.) (F8 キー)を使え のである.特にステップイン ば,プログラムを 1 行 1 行実行させることができる. Excel 2003 以降では,途中,変数にマウスカーソル を合わせるだけでその変数の保持している値がウ ォッチできるので便利である.また,このツールバ ーは,ウィンドウ内のどこにでも移動させることが できる. さてツールバーの用意までできたところで,モジ ュールシートに以下の文字列を一字一句間違えず に打ち込んでいこう.ちなみに VBA では,大文字 小文字の区別は原則としてない.ただし,モジュー ルの編集機能として,最初に使用した用法に合わせ て,大文字小文字を自動的に修正する機能がある. - 15 - 環境シミュレーション Sub pi_dot() Dim i As Integer Dim x, y As Double Range("A5:E3004").Clear For i = 1 To 3000 Cells(4 + i, 1) = i x = Rnd: y = Rnd '[0,1]の一様乱数を返す Cells(4 + i, 2) = x If x ^ 2 + y ^ 2 <= 1 Then Cells(4 + i, 3) = y Else Cells(4 + i, 4) = y End If ActiveSheet.Calculate Next i 最後にボタンの名称をクリックして「スタート」 と書き直せば完成である.ちなみに一度作成したコ マンドボタンを編集するためには,先ず<Ctrl キー> を押しながらそのボタンをクリックして選択して やる.また登録マクロの変更にはボタンを右クリッ クして[マクロの登録]を選択してやる. End Sub 以上の一連の文が pi_dot と名づけた Sub プロシ ージャである.Sub プロシージャの基本的構文は以 下のようになっている.Sub 名称...End Sub. なお Sub プロシージャの起動自体はワークシー トの[ツール][マクロ][マクロ]で実行可能なマクロ (プロシージャ)一覧がでるので,そこから pi_dot を選択,[実行]ボタンをクリックしてやればよい. Sub pi_dot() ... End Sub [Visual Basic Editor]に戻って,Sub プロシージ ャ pi_dot を1行ずつ見ていこう. ここでは「pi_dot」がこの Sub プロシージャの名 称である.Sub プロシージャは,引数を名称の後ろ の()の中にとることもできるが,ここでは取ってい ない.Sub プロシージャと,後述する Function プ ロシージャとの違いは,後者が値を返すのに対して 前者は値を返さない点にある.また,Sub プロシー ジャだけは,Excel のシートからマクロとして呼び 出せる特徴を持っている(ただし,Sub プロシージャ も引数をとると,マクロとして呼び出せなくなる).シ ート上の「スタート」コマンドボタンをクリックす ると,この「pi_dot」がマクロとして起動することに なる. Dim i As Integer Dim x, y As Double 最初にプログラムの冒頭に現れる「Dim」につい て説明する.これは変数のデータ型を宣言し,型に 応じたメモリ領域を変数に割り当てるための宣言 ステートメント(命令)である. ここでは i を整数 (Integer),x と y を倍精度浮動小数点数型(Double) と宣言している.これらのデータ型の違いの意味は 後述する.TIPS:モジュールの中では,調べたい文字に カーソルを置き,[F1]キーを押せば,ヘルプ画面が現れ, それらの説明文を見ることができる. コマンドボタンへのマクロの登録 本来なら Sub プロシージャを完成させてから,コ マンドボタンへマクロ登録するのであるが,ここで は最初に登録方法を説明しておこう.コマンドボタ ンを描画するためには先ず,ワークシートに戻り, [表示][ツールバー]から[フォーム]を選択,ツールバ ーからボタン を選択する.すると「+」字カーソ ルが画面に現れるので,これをドラッグしてコマン ドボタンの場所と大きさを確定する.ここで[マクロ の登録]ダイアログボックスが現れ,起動できるマク ロの一覧がでてくるので,「pi_dot」という Sub プロ シージャを選択する.これによってボタンに 「pi_dot」がリンクされたことになる. Range("A5:E3004").Clear 続く上記の1行はワークシートの A5:E3004 の範 囲(Range)をクリアするための命令文である. For i = 1 To 3000 Step 1 ... Next i 本文中の上記の部分は,VBA によるフロー制御 ステートメント(For...Next ステートメント)である. - 16 - 環境シミュレーション ここでは,変数 i が 1 から 3000 までの間(For),そ の下のステートメント群を処理し,Next 行に到達 したら,次(Next)の i で処理を繰り返す.For...Next ステートメントで囲まれる部分は,プログラムを見 やすくするために,インデントすることが推奨され ている. 上ステートメントは,ランダムな点 ( x, y ) が半径 1 の 4 分の 1 円内にあるかどうかを判断している. もし(if)(x ^ 2 + y ^ 2)が 1 より小さか,あるいは 等しければ(<= 1)(4 分の 1 円内ならば),その場合 (Then)は,4+i 行 3 列のセルに先ほど生成した乱数 y を打ち出す.もしそうでなければ(Else)(4 分 の 1 円外ならば)4+i 行 4 列のセルに y を打ち出す. ちなみに VBA におけるべき乗演算には「^」(ハット マーク)をつかう. 「Step」は繰り返す際,変数 i の増加の幅を指定す る.ただし,1 の場合(Step 1)は省略可能である. If ステートメントの終了を宣言するのが「End if」である. Cells(4 + i, 1) = i 続く Cells は VBA の関数で,現在開いているワ ークシート上のセルに値を打ち出すためのコマン ドである.この例では,4+i 行 1 列のセルに i を打 ち出すことになる. ActiveSheet.Calculate ワークシート上の計算をやり直し,グラフを描き 直すための VBA コマンドである.このコマンドが ないと,Sub プロシージャがすべて終了してからで ないとグラフは描き直されない. x = Rnd: y = Rnd '[0,1]の一様乱数を返す End Sub 次に「x = Rnd: y = Rnd」についてである.先ず行 中の「:」は,本来は 2 行に書かれるべきプログラムが 1 行に詰め込まれていることを示している.TIPS: Sub プロシージャの終了を示す. VBA は固定フォーマット言語で,ひとつのステートメン トは 1 行で完結しなければならない.もし複数行に渡る場 合には「_」(アンダースコア)を用い,複数ステートメント を 1 行に納めるためには「:」(コロン)を用いる. ちなみに,以上の Sub プロシージャは,ワークシ ート(1)において手作業で行ったことを再現してい るにすぎない.2 つの乱数 ( x, y ) を発生させて, x その下の 1 行はコメント(注釈)行である.「'」は, それ以下の行末までの文がコメント文であること を示す.コメント文はプログラムの実行時に無視さ れる. ここで Rnd は Rnd 関数と呼ばれ,0 以上 1 未満 の範囲で一様乱数値を返す VBA 関数である.先に 出てきた RAND 関数(RAND())は,機能はまったく 同じであるが Excel 関数であり,Excel 関数は,モ ジュールシート内で,そのままでは使用できないの で注意が必要である. の乱数をワークシート B 列に打ち出し, x 2 + y 2 ≤ 1 ならば y の乱数を C 列に,x 2 + y 2 > 1 ならば D 列に 打ち出している. 最後にシート(1)の 100 回の試行をシート(2)で 3000 回に増やしたことによる修正を施す. 1) B3 と C3 の COUNT 関数の指定範囲をそれぞ れ「B4:B3004」と「C4:C3004」に変更する. 2) グラフを右クリック,[元のデータ]で[データ範 囲 ] を 「 ='(2)'!$B$4:$D$3004 」 , [ 系 列 ] 「 x^2+y^2<=1 」 の 「 x の 値 」 を 「 ='(2)'!$B$5:$B$3004 」 「 y の 値 」 を 「='(2)'!$C$5:$C$3004」に,[系列]「>1」の「x の値」を「='(2)'!$B$5:$B$3004」「y の値」を 「='(2)'!$D$5:$D$3004」に変更する. すなわち,ここでは Rnd 関数によって ( x, y ) を生 成している. Cells(4 + i, 2) = x ただし例に示されるように 3000 回の試行でも π の近似値は 3.121333 とまだ理論値 3.141593...との 間には開きが見られる.より多くの試行回数が必要 のようであるが,ワークシート上に値を打ち出すこ の方法には限界がある.一般のワークシートの行数 は 65536 が限界であり,またこれだけの数値を発生 させると Excel ファイルが大きくなりすぎてしまう. そこで次には Function プロシージャを用いた方法 を試してみる. 続く行は,Cells によって 4+i 行 2 列のセルに先 ほど生成した乱数 x を打ち出している. 次に If...Then...Else ステートメントについて述 べる. If x ^ 2 + y ^ 2 <= 1 Then Cells(4 + i, 3) = y Else Cells(4 + i, 4) = y End If (3) Function プロシージャを用いた方法 - 17 - 環境シミュレーション 下図が Function プロシージャ(ユーザ定義関 数)という VBA プログラムを用いて,モンテカル ロ法で円周率 π を求めてみたワークシート(3)であ る.このシートでは,異なる回数 N に対して, Function プロシージャによって π の近似値を求め, N と近似値の関係をグラフ化している.ちなみに図 の中央付近にある(E10)の値は,PI 関数(Excel 関数 「=PI()」)で求めた π の値である. N の値が大き くなるに連れて,4n N の値が π の理論値に近づい ている様子がわかる. 試行回数 N )を渡し,π の近似値( 4n N )を演算結果 として返させようとしているのである.ただし,こ こでの pi_cal という関数は,Excel に初めから定義 (用意)されていた関数ではない.これはユーザ定義 関数(Function プロシージャ)と呼ばれ,このシ ミュレーションのために定義・作成した関数である. この関数(Function プロシージャ)は,Sub プ ロシージャと同じく,モジュールシート上で定義さ れる.1 つのモジュールシート上に複数の Sub プロ シージャや Function プロシージャを定義すること ができる. モジュールシートに以下の文字列を一字一句間 違えずに打ち込んでいこう. ではこのシートの作成方法を順に説明していこう. Function pi_cal(n As Long) Dim ni, i As Long Dim x, y As Double ni = 0 Randomize '乱数ジェネレータを初期化(乱数系列を再設定)する数値 '演算ステートメント For i = 1 To n x = Rnd: y = Rnd '[0,1)の一様乱数を返す If x ^ 2 + y ^ 2 <= 1 Then ni = ni + 1 Next i pi_cal = ni / n * 4 End Function 以上の一連の文が VBA によって書かれたユーザ 定義関数 pi_cal である. オブジェクトの挿入 シートの左上に挿入された図は,ペイント (Windows にアクセサリとして付いてくる簡単なお 絵描きソフト)で描いたものである.Excel のシート 上でペイントの絵を新規に作成するためには,[挿 入][オブジェクト][ビットマップイメージ]を選ぶ. 挿入された図は,ダブルクリックすることによって いつでも編集可能であり,図のサイズも,図の 4 辺 および 4 角にある小さな黒いボックスをドラッグす ることで変更可能である(ペイントによる作画の方 法は省略する). ユーザ定義関数のプログラミングの基本は次の ように,Function...(...)で始まり,End Function で 終わるサンドウィッチ構文である. Function sample(x,y) ... sample=... ... End Function 上の例は,名前が sample の Function プロシー ジャで,引数として x と y を取り,返り値として 「sample=」以下の値を返す関数となっている.いっ たんこの形で関数をモジュール内で定義すれば,あ と は 通 常 の シ ー ト の セ ル に 数 式 「=sample(A1,1.22)」のように入力するだけである (モジュール内の他のプロシージャからこの関数を呼び出 すことも可能である). 罫線 表中の縦横 2 本の罫線は,[セルの書式設定]の[罫 線]タブで設定したもの. ユーザ定義関数 さて π の近似値が示されている最も肝心な E4:E8 について説明しよう.サンプルプログラムの これらのセルには,例えば E4 になら, では 1 行 1 行見ていく. =pi_cal(D4) Function pi_cal(n As Long) という数式が入っている.要するに,pi_cal という 関数に引数として,その数式左側のセルの値(D4: ユーザ定義関数 pi_cal の 1 行目は pi_cal(n As Long)から始まる.これは pi_cal が引数として変数 - 18 - 環境シミュレーション n を取り,そのデータ型が長整数型(Long)である と宣言したものである.ここで長整数型にした理由 は,pi_cal の引数(ここでは,ランダム試行回数 N ) が最大で 1,000,000 を取るのに対して,整数型 (Integer)の記憶領域サイズは 2 バイトで,値と して-32,768~32,767 までしか使用できないからで ある.一方,長整数型なら 4 バイトまで割り当てら れており,-2,147,483,648~2,147,483,647 の整数を 表わすことが可能である. ( x, y ) の原点からの距離の 2 乗(x ^ 2 + y ^ 2)がも し(If)1 より小さか,あるいは等しければ(<= 1)(半径 1 の 4 分の 1 円の中ならば),その場合(Then)は,変 数 ni に 1 を加えて(ni + 1),それを変数 ni に再び代 入する(つまり ni を 1 つ増やす),というものである. これによって 4 分の 1 円の中に入る ( x, y ) の数をカ ウントしている. pi_cal = ni / n * 4 Dim ni, i As Long 最終的には pi_cal = ni / n * 4 として,ni(4 分円の 中に入る回数を n )を n(正方形の中に入る回数 N ) で割ったものに 4 を掛け(すなわち 4n N ),その結 Dim x, y As Double プログラムの 2-3 行は変数型宣言文である.ここ では ni と i を長整数型(Long)に,x と y を倍精 度浮動小数点数型(Double)と宣言している.ちな みにここで変数 ni は,4 分の 1 円の中に入る回数 n を表す. 果をこの関数の返り値(すなわち π の近似値)として 返す. このようにユーザ定義関数では必ずその返り値 を「関数名=...」の形で定義しておかなければならな い. ni = 0 グラフの作成 ワークシート(3)のような表がいったん完成す れば,後は,結果をグラフ化するだけである.作 成の手順は先ず,1)グラフ化するデータの範囲 4 行目の「ni = 0」は,変数 ni を 0 で初期化したも のである. (D3:E8)を指定し,[グラフウィザード]ボタン をクリックする.2)グラフの種類から[標準][折れ 線]を選ぶ.3)後はウィザードの指示に従ってその 他のオプションを設定するだけである.ちなみに シート(3)のグラフは x 軸を対数目盛とし,x 軸が y 軸と 3.141593 で交差するように指定してい る. Randomize 次 に Randomize と だ け 書 か れ た 一 行 は , Randomize ステートメントと呼ばれ,その下で使 われている乱数ジェネレータ(Rnd)を初期化(乱数 系列を再設定)するための数値演算ステートメント である. For i = 1 To n ... Next i 続く上記の部分は,For...Next ステートメントで ある.ここでは,For と Next に囲まれたステート メント群を引数の n 回繰り返す. x = Rnd: y = Rnd 次の「x = Rnd: y = Rnd」は先の例と全く同じであ る.ここで Rnd 関数で一辺 1 の正方形内にランダ ムな点 ( x, y ) を生成している. If x ^ 2 + y ^ 2 <= 1 Then ni = ni + 1 続く If ステートメントも,やや簡略形ではあるが, やっていることは先の例とそれほど変わらない.点 - 19 - 環境シミュレーション RAND()関数の応用例1 RAND 関数自体は 0-1 の一様乱数を生成するが, これを利用して正規分布データを生成することも できる.下記がワークシート上で生成した例である. セル上に =SQRT(-2*LN(RAND()))*COS(2*PI()* RAND()) 偏差 1 の正規分布データであるが,この関数を σ 倍 して, x を加えてやれば,平均 x ,標準偏差 σ の 正規分布データとなる. ページ下のヒストグラムは[ツール][分析ツール] から[ヒストグラム]を選んで描いた.なお[分析ツー ル]で[乱数発生]を選べば,同様に正規分布の乱数や 一様乱数を発生することができる. ただし分析ツールを使用するためには,Excel を フルインストールしていること,アドインによる分 析ツール使用の設定が必要である. と入力すればよい. ちなみにこの関数で生成されるのは平均 0,標準 RAND()を使った正規分布データの発生 "=SQRT(-2*LN(RAND()))*COS(2*PI()*RAND())" 28 -0.14491 29 1.150287 30 -0.79687 31 1.601563 32 -0.60391 33 0.498597 1 -0.99881 2 0.257725 3 -0.62075 -3.5 0 34 -0.77858 4 1.393733 -2.5 2 35 1.093049 5 1.322116 -1.5 6 36 0.752229 6 -0.81586 -0.5 25 7 -0.93269 0.5 38 98 -2.09073 8 0.63843 1.5 21 99 -0.74471 9 0.349568 2.5 8 100 0.966562 10 0.261899 3.5 0 11 1.288906 次の級 12 -0.49166 13 0.318864 14 -0.17804 15 0.076804 16 0.146498 17 0.42808 18 -0.61577 19 1.642217 20 -1.00306 21 0.45726 22 -0.25134 23 -0.67187 24 1.191922 25 0.872832 26 -3.04242 27 -0.2946 データ区間 頻度 0 - 20 - 環境シミュレーション RAND()関数の応用例2(乱数を使った確率計算) 理論解: 男女が同数の学校において,任意の8人の男女を 選んで,横一列に並ばせた.この時,ある男子生徒 の両脇が女子生徒となる確率は? 男を 0,女を1 とおく. A 7 8 1 B C D E F G H I 1 2 3 4 5 6 7 8 0 0 0 1 1 0 1 1 1 1 ⋅ 6 ⋅ = 0.09375 8 8 =INT(RAND()+0.5) 9 2 1 1 0 1 1 0 1 1 10 3 1 0 1 1 1 1 0 1 105 98 0 0 1 0 0 1 0 0 106 99 1 0 0 1 1 1 0 1 107 100 0 1 1 1 1 0 0 1 Q K L M N O P 7 2 3 4 5 6 7 8 0 0 0 0 1 0 1 =SUM(K8:P8) =IF(C8=0,IF(B8+D8=2,1,0),0) 9 0 1 0 0 1 0 2 10 1 0 0 0 0 1 2 105 0 0 0 0 0 0 0 106 0 0 0 0 0 1 1 107 0 0 0 0 0 0 0 84=SUM(Q8:Q107) 0.105=Q108/800 参考図書 「Excel で学ぶ理工系シミュレーション入門」CQ 出版社(2003) - 21 - 環境シミュレーション 今回登場した Excel 関数 ・COUNT 関数 ・PI 関数 今回登場した VBA 関数 ・Rnd 関数 課題 次のいずれかの課題を実施して次週までに提出 せよ.定期試験には,このうち 1 問を出題する. 1) Excel 関数を使って,サイコロを投げて出る目 をシミュレートせよ(ヒント:「=RAND()*6」 で 0 から 6 の一様乱数を生成できる).次に 3 つのサイコロを投げて出た目を a,b,c とする とき i)積 abc が偶数である確率を求めよ(答え 7/8),ii)(a-b)(b-c)(c-a)=0 である確率を求めよ (答え 4/9)(類 岐阜経大) 2) Excel 関数を使って,3/5 の確率で 1,2/5 の確 率で 0 となる事象をシミュレートせよ.次にセ ルの書式設定で 1 なら赤い「●」,0 なら「○」 と表示するようにせよ.以上を踏まえて,次の 問題に答えよ.袋の中に赤球 6 個,白球 4 個が 入っている.この袋から任意に 2 球を取り出す とき,その 2 球が同じ色である確率を求めよ. (答え 7/15) 3) センター試験において英語と歴史の平均値と 標準偏差がそれぞれ 60±40 点,65±35 点のと き,両科目の合計点が 180 点を超える人の割合 を求めよ.ただし両科目とも 100 点満点とす る.(約 9%) 4) 以下の課題のプログラムを完成させて,ワーク シート(グラフを含む)と Sub プロシージャ をプリントアウトしたものを提出せよ.問題 y = sin x の 曲 線 と x 軸 で 囲 ま れ る 面 積 ( 0 ≤ x ≤ π )を Sub プロシージャを使ったモ ンテカルロ法でもとめよ.(答え 2) 5) 以下の課題のプログラムを完成させて,ワーク シート(グラフを含む)と Sub プロシージャ をプリントアウトしたものを提出せよ.問題 y = cos x の 曲 線 と x 軸 で 囲 ま れ る 面 積 ( 0 ≤ x ≤ π 2 )を Sub プロシージャを使った モンテカルロ法でもとめよ.(答え 2) - 23 -
© Copyright 2024 Paperzz