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

Slides:



Advertisements
Similar presentations
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
Advertisements

コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
数個、数十個のデータ点から その特徴をつかむ
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
データ構造とアルゴリズム 第10回 mallocとfree
解答 1 複素数を構造体として定義し、二つの複素数の積(結果は複素数)を返す 関数 を定義せよ。
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
プログラミング論 I 行列の演算
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
基礎プログラミングおよび演習 第8回.
第5回C言語講座 ~ポインタと配列.
IT入門B2 ー 連立一次方程式 ー.
コンピュータープログラミング (C言語)(8) 1.乱数(復習) 2.配列とその利用
第6章 2重ループ&配列 2重ループと配列をやります.
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第7回 条件による繰り返し.
C言語講座 第3回 ポインタ、配列.
プログラミング演習 バージョン1 担当教員:綴木 馴.
繰り返し計算 while文, for文.
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
#include <stdio. h> int main() { /. 表示をする
関数の定義.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
傾きがわかった関数の軌跡を求める. 変数は二つ以上
プログラミング序論 2. n人のインディアン.
第17章 その他の制御文 17.1 do-while文 17.2 goto文とラベル 17.3 break文による繰返し制御
高度プログラミング演習 (03).
知能情報工学演習I 第12回(後半第6回) 課題の回答
今までの練習問題の復習.
前回の練習問題.
第7回 条件による繰り返し.
高度プログラミング演習 (02).
知能情報工学演習I 第8回( C言語第2回) 課題の回答
関数への道.
C言語講座第二回 2017 分岐とループと乱数.
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
整数データと浮動小数データ.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
疑似乱数, モンテカルロ法によるシミュレーション
プログラミング序論演習.
プログラミング序論演習.
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
ループだよ!難しいよ! 第5章 while(ループ);.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
知能情報工学演習I 第12回( C言語第6回) 課題の回答
統計解析 第11回.
高度プログラミング演習 (07).
第12章 乱数という業の深い存在 ~ランダムな値・他~
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
第10回 関数と再帰.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
第12章 ランダム関数.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
C言語講座第5回 2017 構造体.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
第5回 配列.
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
第13章 構造体 講習最後だよ!.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

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

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

モンテ・カルロ

C言語での乱数発生 rand( ) 0 ~ RAND_MAX までの ランダムな整数値が発生する。 (32767) #include<stdlib.h> を使用

プログラム例 #include <stdio.h> #include <stdlib.h> int main() { int irandx, i, n=4; for(i=0;i<n;i++){ irandx = rand(); printf("%d\n",irandx); } return 0;

0~1の乱数の発生 0~1の実数を与えるには、 rand( )を最大値RAND_MAXで割る。 例: randx = (double) rand()/(double) RAND_MAX;

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

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

円の面積 0.5 (x1, x2) - 0.5 0.5 円内の条件 ⇒ (x12 + x22 )<0.25 - 0.5

球の体積 (x1, x2, x3) 球内の条件 ⇒ (x12 + x22 + x32 )<0.25

多次元空間の球内の条件 三次元 x12 + x22 + x32 < 0.25 四次元 x12 + x22 + x32 + x42 < 0.25 五次元 x12 + x22 + x32 + x42 + x52 < 0.25 ただし,‐0.5 < x1, x2, x3, x4, x5 < 0.5

多次元空間の球の体積 m[j]=0 乱数で,x1, x2, x3, …を生成 m[j]=m[j]+1 No Yes 繰り返し数:N 体積=m[j]/N

#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 10000 #define DIM 5 int 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次元まで 球内の個数を カウントする変数

乱数発生 0~1 各次元ごと 距離を計算 各次元ごと 球内点を加算 全点数で割って 球体積を計算」 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; 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 各次元ごと 距離を計算 各次元ごと 球内点を加算 全点数で割って 球体積を計算」

乱数の初期値を変更する srand((unsigned)time(NULL)); をrand()の前に入れる。 #include<time.h>; を使用

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

例題 15分間隔でくるバスの待つ時間の平均? 待つ時間:0~15分 0 15 30 45

15分間隔のバスを待つ時間 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, n=100; double randx=0.0; srand((unsigned)time(NULL)); for(i=0;i<n;i++) randx += 15* (double)rand()/(double)RAND_MAX; randx=randx/(double)n; printf(“%lf\n",randx); return 0; }

15分間隔のバス 10分以上待つ確率を求めるプログラムを書け。 学部コード;25 時間割コード;63270 曜日・時限:木2