*このページは編集中です。完成予定は6月26日午後4時です。 Rを使ったプログラミング演習2: シミュレーション [#q390e40d]

**第10回授業の獲得目標:&worried; [#da844234]
-1. プログラミングの基本:繰り返し・代入・条件分岐に習熟する
-2. ユーザー定義関数を理解する
-3. シミュレーションによる問題解決の方法を習得する


***条件分岐⌣ [#r30a37ba]
プログラミングの基本技の最後は条件分岐。if()を使って表現する。
 i=4                       #iに4を代入
 if(i==3){                 #iの値が3ならば
   print("三")            #   三 と表示する
 } else {                  #iの値が3では無ければ
   print("三以外")   #   三以外と表示する
 }

if命令の()の中の式を''条件式''といい、iの値を評価している。評価に使われるのは''比較演算子''というもので、
 ==     等しければ
 !=      等しく無ければ
 >, >=   左辺が右辺より大きいなら、左辺が右辺以上ならば
 <, <=   左辺が右辺より小さいなら、左辺が右辺以下ならば
ということを意味している

--r-tips.pdfで比較演算子を検索してみよう!

 ''比較演算子''である''=='' に対して、代入の時に使った ''='' は''代入演算子''といいう。
上のif命令では、次のような条件分岐が行われている。
 if(i==3){
    print("三")
 }
  ・もしiの値が3ならば、画面に三を表示。
  ・もしiの値が3で無いならば、何もしない
 else {                  #iの値が3では無ければ
   print("三以外")   #   三以外と表示する
 }

-else以下の処理が必要無いときは省略できる。また、1行に書くことも可能。
 i=3                       #iに3を代入
 if(i==3){ print("三") }   #iが3ならば三と表示

#演習:乱数を1つ発生させ、値が0.5以上なら「0.5以上」、0.5より小さいなら「0.5より小さい」と表示させる
この演習では、乱数を発生させる''runif()''という関数を使う。試しに
 runif(5)
と入力してみよう。0から1までの乱数が5個表示されたはずだ。乱数はシミュレーションではよく使うので、もう少し慣れ親しんでおこう。
例えば、runif()を使って乱数を10個発生させ、ヒストグラムを書いてみよう。同じことを、100個、1000個、10000個、100000個についてもやってみよう。
 hist(runif(10))
バラツキがだんだんと無くなってきたのがわかるだろうか。
 #穴埋め式練習問題
 if (runif(1) >= _ ) {   #条件式0.5以上ならば
   print("0.5以上")
 } _ { 
   print("0.5より小さい")
 }


***繰り返しと条件分岐 [#jf5a97f2]
 では、上の繰り返しと条件分岐を組み合わせて使ってみよう
 練習問題:for命令を使って1から10までの数字を表示させなさい、5だけは"five"と英単語で表示させなさい
--ヒントを穴埋め式で示しておく。
 for(i in _:_){    #  10回繰り返し。iは1から10まで変化
   if(i == _) {    #iが5の場合
      print("five")       #fiveと表示
   } _ {       #それ以外の場合
      print(_)       #iの値を表示
   }
 }


**関数の定義&smile; [#ia7cf442]
「関数の定義」なんていうと難しそうだが、ようするに、先ほどまでに作ったプログラムに名前をつけて、いろいろと数値を変えて解析できるようにしようというものだ。こういうときに関数を定義する関数、'function()'を使う。
例えば、円の面積を計算する関数を作るなら、
  menseki=function(r){r*r*pai}
とすれば良い。これで自分独自の関数''menseki()''ができた。
では、実行してみよう。
 menseki()

 
演習:1から入力した数値までの全てを横一列に表示させるプログラムを作りdisplayという名前の関数として定義する
 display=function(a){       #関数定義の始まり
  kekka=c()                 #kekkaに空ベクトルを代入して初期化
  for(i in 1:a){              #a回(iの値を1からaまで変化させる間)繰り返し
    kekka=c(kekka,i)     #kekkaというベクトルにiを要素として代入
  }
  print(kekka)              #kekkaの内容を表示
 }                          #関数定義の終わり

 display(10)
 
↑を使って何回も実行してみると、結果がいろいろ変わるのがわかる。

演習上の関数の定義方法に従って、入力した数までの合計値を計算するsumupという名前の関数を作成する。下の囲みの中の_の部分(1文字に対応するとは限らない)を埋めて、プログラムを完成しなさい。
  sumup = ______       #関数sumpuを定義
    kotae = _          #kotaeを初期化
    _ (i in ___){      #1からaまで繰り返し
      kotae = _____    #kotaeにiの値を足したものとkotaeに代入
    }                  #繰り返し終了
   _____               #kotaeを表示
   }                   #関数定義の終了

**授業で使ったRの基本関数 [#bebf948e]
#include(授業/H20/情報処理/R関数一覧,notitle)

**Rを用いたシミュレーション [#a1b45ddd]
***円周率(π)をモンテカルロ法で求める [#k940a9cb]
 simpai=function(x){
 	kaisu=0;  #回数の初期値を0にする
 	for (i in 1:x) {
 		point=runif(2)
 		distant=sqrt(point[1]^2+point[2]^2)
 		if(distant<1){
 			kaisu=kaisu+1
 		}
 	}
 	answer=4*kaisu/x
 	print(answer)
 }
 > simpai(10)
 [1] 2.8
 > simpai(100)
 [1] 3.16
 > simpai(1000)
 [1] 3.156
 > simpai(10000)
 [1] 3.1624
 > simpai(100000)
 [1] 3.15652
 > simpai(1000000)
 [1] 3.13994
 > simpai(10000000)
 [1] 3.140556
//http://www.bunkyo.ac.jp/~nemoto/lecture/simulation/97/random/ppframe.htm