Top Banner
モモモモモモ モモモモモモ モモモモモモモモ モモモモモモモモ 乱乱乱乱乱乱乱乱乱乱乱乱乱乱 乱乱乱乱乱乱乱乱乱乱乱乱乱乱 P129
19

モンテカルロ シミュレーション

Jan 06, 2016

Download

Documents

Keira

P129. モンテカルロ シミュレーション. 乱数を使ったシミュレーション. モンテ・カルロ. モナコ 公国 の北部を占める地区。 南の首都モナコ市とは港を挟んで反対側(北)に位置する。 1856 年シャルル 3 世が公国の財源確保のため 賭博 (とばく)場( カジノ )の開設を許可、 1861 年に開設して以来、 カンヌ 、 ニース と並び、地中海の コート・ダジュール 有数の 観光 ・保養地、海水浴場として発達した。. モンテ・カルロ. C言語での乱数発生. rand( ) 0 ~ RAND_MAX  までの ランダムな整数値が発生する。 (32767) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: モンテカルロ シミュレーション

モンテカルロモンテカルロシミュレーションシミュレーション乱数を使ったシミュレーション乱数を使ったシミュレーション

P129

Page 2: モンテカルロ シミュレーション

モンテ・カルロモンテ・カルロ

モナコ公国の北部を占める地区。南の首都モナコ市とは港を挟んで反対側(北)に位置する。1856 年シャルル 3 世が公国の財源確保のため賭博(とばく)場(カジノ)の開設を許可、 1861 年に開設して以来、カンヌ、ニースと並び、地中海のコート・ダジュール有数の観光・保養地、海水浴場として発達した。

Page 3: モンテカルロ シミュレーション

モンテ・カルロモンテ・カルロ

Page 4: モンテカルロ シミュレーション

C言語での乱数発生C言語での乱数発生

rand( ) 0 ~ RAND_MAX  までのランダムな整数値が発生する。(32767)

#include<stdlib.h>  を使用

Page 5: モンテカルロ シミュレーション

プログラム例プログラム例#include <stdio.h>#include <stdio.h>#include <stdlib.h>int main()int main(){{

int irandx, i, n=4;int irandx, i, n=4;for(i=0;i<n;i++){for(i=0;i<n;i++){

irandx = irandx = rand();rand();printf("%d\n",irandx);printf("%d\n",irandx);

}}return 0;return 0;

}}

Page 6: モンテカルロ シミュレーション

0~1の乱数の発生0~1の乱数の発生

0 ~ 1 の実数を与えるには、rand( ) を最大値 RAND_MAX で割る。

例:randx = (double) rand()/(double) RAND_MAX;

Page 7: モンテカルロ シミュレーション

プログラム例プログラム例#include <stdio.h>#include <stdio.h>#include <stdlib.h>int main()int main(){{ int i, n=4;int i, n=4; double randx;double randx; for(i=0;i<n;i++){for(i=0;i<n;i++){ randx = randx = (double)rand()/(double)RAND_MAX(double)rand()/(double)RAND_MAX;; printf("%lf\n",randx);printf("%lf\n",randx);

}}return 0;return 0;

}}

Page 8: モンテカルロ シミュレーション

円の面積円の面積

0.5- 0.5

0.5

- 0.5

0

円の面積=(円内の個数)/(全部の個数)

Page 9: モンテカルロ シミュレーション

円の面積円の面積

0.5- 0.5

0.5

- 0.5

0

(x1, x2)

円内の条件 ⇒ ( x12 + x2

2 ) <0.25

Page 10: モンテカルロ シミュレーション

球の体積球の体積

(x1, x2, x3)

球内の条件 ⇒ ( x12 + x2

2 + x3

2 ) <0.25

Page 11: モンテカルロ シミュレーション

多次元空間の球内の条件多次元空間の球内の条件

三次元x1

2 + x22 + x3

2 < 0.25四次元

x12 + x2

2 + x32 + x4

2 < 0.25五次元

x12 + x2

2 + x32 + x4

2 + x52 < 0.25

ただし,‐ 0.5 < x1, x2, x3, x4, x5 < 0.5

Page 12: モンテカルロ シミュレーション

多次元空間の球の体積多次元空間の球の体積

乱数で, x1, x2, x3, … を生成

m[j]=0

x12 + x2

2 + x32

<0.25

YesNo

m[j]=m[j]+1

繰り返し数:N

体積= m[j]/N

Page 13: モンテカルロ シミュレーション

#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 10000#define DIM 5int main( ){

double x[DIM], r[DIM];int n, j;double rr;int m[DIM+1];for(j=0;j<DIM;j++)

m[j]=0;

乱数の点数

5次元まで

球内の個数をカウントする変

Page 14: モンテカルロ シミュレーション

printf("  回数  円面積  球体積  四次元  五次元 \n\n");for(n=1;n<=N;n++){for(j=0;j<DIM;j++){

x[j]=(double)rand()/32768.;r[j]=0.0;

}rr=0.0;for(j=0;j<DIM;j++){

rr+=(x[j]-0.5)*(x[j]-0.5);r[j]=rr;

}for(j=0;j<DIM;j++)

if(r[j]<0.25) m[j]++;if((n%1000)==0){

printf("%6d ",n);for(j=1;j<DIM;j++)

printf("%9.4lf ",(double)m[j]/(double)n);printf("\n");

}}return 0;

}

乱数発生0~1

各次元ごと距離を計算

各次元ごと球内点を加算

全点数で割って球体積を計算」

Page 15: モンテカルロ シミュレーション

乱数の初期値を変更する乱数の初期値を変更する

srand((unsigned)time(NULL));

を rand() の前に入れる。

#include<time.h>;  を使用

Page 16: モンテカルロ シミュレーション

プログラム例プログラム例#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <time.h>int main()int main(){{ int i, n=4;int i, n=4; double randx;double randx; srand((unsigned)time(NULL));

for(i=0;i<n;i++){for(i=0;i<n;i++){

randx = (double)rand()/(double)RAND_MAX;randx = (double)rand()/(double)RAND_MAX;

printf(printf(""%lf\n",randx);%lf\n",randx);

}}return 0;return 0;

}}

Page 17: モンテカルロ シミュレーション

例題例題

15分間隔でくるバスの待つ時間の平均15分間隔でくるバスの待つ時間の平均??

0 15 30 45

待つ時間:0~15分

Page 18: モンテカルロ シミュレーション

15分間隔のバスを待つ時間15分間隔のバスを待つ時間#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <time.h>int main()int main(){{ int i, n=100;int i, n=100; double randx=0.0;double randx=0.0; srand((unsigned)time(NULL));

for(i=0;i<n;i++)for(i=0;i<n;i++)

randx += 15* (double)rand()/(double)RAND_MAX;randx += 15* (double)rand()/(double)RAND_MAX;

randx=randx/(double)n;randx=randx/(double)n;

printf(printf(““%lf\n",randx);%lf\n",randx);return 0;return 0;

}}

Page 19: モンテカルロ シミュレーション

15分間隔のバス

10分以上待つ確率を求めるプログラムを書け。

学部コード;25 時間割コード;63270 曜日・時限:木2