H25 奈良女 計算機実験1 第4回
前回まで
数値積分 • リーマン和• 台形則• シンプソン則
今回
モンテカルロ積分と酔歩プログラムの作成
H25 奈良女 計算機実験1 第4回
複雑な積分境界多次元の積分(重積分)になると積分範囲の解析的な
表現が簡単に書けない場合がある
!4
!2
0
2
4 !4
!2
0
2
4
!1.0!0.50.00.51.0
!3 !2 !1 0 1 2 3
!3
!2
!1
0
1
2
3
H25 奈良女 計算機実験1 第4回
モンテカルロ積分法積分範囲内にランダムな点(乱数)をうち、点の数を数えることで面積を求める方法
数学的問題の解法に疑似乱数を用いる方法をモンテカルロ法と呼ぶ
H25 奈良女 計算機実験1 第4回
一様乱数
Prob[x < X < x + dx] =�
1b�adx a < x < b
0 Otherwise
確率密度関数はステップ関数
点はランダムに均等に打たれる必要がある一様乱数区間[a,b]で全ての実数が同じ確率で出現する
1b � a
ba
乱数が正規分布に従う場合
乱数が一様分布に従う場合
H25 奈良女 計算機実験1 第4回
疑似乱数の生成方法
例. 線形合同法
Xi+1 = (A�Xi + B) mod M
適当な整数 A, B, Mを用いて、任意の初期値 X0 を乱数の種 seed として 逐次乱数Xi を求める方法
M: 法 M > 0 A: 乗数 0 < A < M B: 増分 0 < B < MX0: 初期値 0 ≤ X0 < M
• 0からM-1の範囲で整数の乱数を発生させる• 最大周期はM, 1周期中に整数は発生しない• BとMは互いに素である必要がある
H25 奈良女 計算機実験1 第4回
#define IA! 3877 // A#define IB! 29573 // B#define IM! 139968 // M
int main (int argc, const char * argv[]) { ! int i, randomInt;! double randomDouble;
! randomInt = 10;! !! for(i=0; i<1000; i++){! ! randomInt = (randomInt*IA + IB) % IM;! ! randomDouble = randomInt/(IM + 1.0);! }!! return 0;}
線形合同法のアルゴリズム
H25 奈良女 計算機実験1 第4回
Cにおける乱数発生rand関数
#include <stdlib.h>#include <time.h>
unsigned seed;int randomInt;double randomDouble;
seed = (unsigned)time(NULL);!srand(seed);!printf("RAND_MAX is %d\n", RAND_MAX);printf("Seed is %d\n", seed);!for(i=0; i<100; i++){! randomInt = rand();! randomDouble = randomInt/(RAND_MAX+1);
printf("%d, %f\n", randomInt, randomDouble);}
int rand(void)疑似乱数を生成
線形合同法に基づく疑似乱数生成関数。[0, RAND_MAX]の範囲の整数値を返す。
RAND_MAXはコンパイラ毎に異なるため確認してみよう
毎回自動的に乱数の種が変わるように時間関数timeを用いて現在時刻から種を設定する
void srand(unsigned)乱数の種(初期値)を指定
[0,1)の乱数を発生
H25 奈良女 計算機実験1 第4回
メルセンヌ・ツイスタrand関数より品質が高く、周期が長い疑似乱数を発生させる
void init_genrand(long)乱数の種(初期値)を指定
種の代入
[0,1)の乱数を発生
#include <stdio.h>#include <time.h>
int main(){
extern void init_genrand(long);extern double genrand_real2(void);
long seed;int i;double rand;!seed = (long)time(NULL);! init_genrand(seed);!for(i=0; i<100; i++){! rand = genrand_real2();! printf("%.20f\n", rand);}return 0;}
double genrand_real2(void)疑似乱数 [0, 1) を生成
H25 奈良女 計算機実験1 第4回
レポート課題8
1. 区間 [0,1) の一様乱数を100個生成し、区間幅 0.2 で 5 個の区間に区切った時に各区間に落ちた疑似乱数の数を数えてファイルに書き出せ。
2. 乱数が一様であれば各区間に落ちる数の平均は N/5 と予想される。生成した疑似乱数が統計的に一様であるか、どのようにして判定したら良いか考察し、方法を述べよ。
3. 発生させる乱数を10000, 100000と増やしたときに平均値の予測精度がどれくらい上昇するか定量的に評価せよ。
メルセンヌ・ツイスタを用いて下記の課題に取り組め。
H25 奈良女 計算機実験1 第4回
レポート課題9
-1.5 -1 -0.5 0.5 1 1.5
-1.5
-1
-0.5
0.5
1
1.5
-1.5 -1 -0.5 0.5 1 1.5
-1.5
-1
-0.5
0.5
1
1.5 2� 1
�1
⇥1� x2dx =
��
x2+y2⇥1dxdy
モンテカルロ法により以下の積分の近似値を求めよ。疑似乱数の数Nを100, 10000, 100000と変えたときにどれくらい精度が増すか(真の値に近づくか)定量的に評価せよ。
ヒント:
一辺の長さが1の正方形と四分円を考え、正方形の中でランダムに打った点が四分円の中に入る数を数え、(四分円の面積)/(正方形の面積)を4倍すればよい。
H25 奈良女 計算機実験1 第4回
レポート課題10モンテカルロ法により以下の積分の近似値を求めよ。また真の値と定量的に比較せよ。
(1)
(2) �� 1
�1
�3 +�
1 � z
2�2��3 ��
1 � z
2�2
dz =
����
x
2+y
2�3)2+z
2�1dxdydz
半径1の円をz軸の周りで半径3で回転させてできるトーラスの体積
(
��
x2+y2�1
⇥1� x2 � y2dxdy =
���
x2+y2+z2�1dxdydz
H25 奈良女 計算機実験1 第4回
ポイント
メルセンヌ・ツイスタで[0, 1]の実数の乱数を発生させる関数genrand_real1()を用いて [-1, 1]の範囲で
実数の乱数をどうやって発生させるか?
H25 奈良女 計算機実験1 第4回
酔歩問題 (ランダム・ウォーク)
ある対象が一定の確率法則に従いランダムに運動し、その位置や値を決定する過程
• コイン投げ、サイコロの目の出方• 分子のブラウン運動• 株価
H25 奈良女 計算機実験1 第4回
確率変数と確率分布確率変数:x1, x2, ..., xn の個の値をとる変数Xに対してX = xi になる確率pi が与えられているとき, Xを確率変数という。
確率分布:確率変数Xとそれに対応する確率P(X = xi)との対応関係。
例) コイン投げの場合
X: コインの表が出る回数P: コインの表がi 回出る確率
H25 奈良女 計算機実験1 第4回
コイン投げの確率分布
全ての投数nのうち表が出る確率がpで、裏が出る確率がq = 1 - pであるとする。この時表がi回分子出る確率は、
例) コイン投げの場合, 続き
P(X = i) = nCi piq(n�i)
=n!
i!(n � i)!piq(n�i)
P(X = i) =n!
i!(n � i)!
�12
�npとqが等確率ならば
0 2 4 6 8 10 12 14 i0.000.050.100.150.200.250.30
pi
n = 15
n = 10
二項分布
H25 奈良女 計算機実験1 第4回
x
t ある分子が進行方向に時間ステップ毎に前進する際、1/2の確率で右に、1/2の確率で左に進むものとする。10000個の分子に対して前進を100回繰り返した後のxを求め、xの頻度分布と理論値を重ね合わせた図を作成せよ。
0 1-1 …2-2…012
…レポート課題11
H25 奈良女 計算機実験1 第4回
1次元ランダム・ウォークの確率分布全ての歩数nのうち右に移動する回数をn+、左に移動する回数をn - とすると、
全歩数nにおいて分子の位置xが従う確率分布関数は、
n = n+ + n�, x = n+ � n� n+ =n + x
2, n� =
n � x
2
P(X = x) =n
C
n+x
2
�12
� n+x
2�
12
� n�x
2
=n!
�n+x
2
�!�
n�x
2
�!
�12
�n
H25 奈良女 計算機実験1 第4回
Mathematicaでの頻度分布の描き方
SetDirectory[“データのあるディレクトリ名”]
data = ReadList[“data”,Real] (*注:データは一行に書き出しておくこと*)
(*下は自分が試行した回数であることを確認*)n=Length[data]
Histo = Histogram[data,n]
!40 !20 0 20 400246810
x
頻度
50回シミュレーションした時の頻度分布
H25 奈良女 計算機実験1 第4回
Mathematicaでの二項分布の理論値の描き方(*確率分布関数の定義*)prob[x_, n_] := n!/((n+x)/2)!/((n-‐x)/2)!/2^n
(*xiが -‐50 から 50 までの理論値を計算し, xiとpiのセットを作る)n = 100numHead = Table[x,{x,-‐50,50}]probSeq = Map[prob[#,n]&,numHead]points = Transpose[{numHead,n*probSeq}]
Binom = ListPlot[points,PlotJoined-‐>True]
Show[Histo, Binom]
50回シミュレーションした時の頻度分布と理論値を重ねたもの
!40 !20 0 20 400246810
x
頻度理論値
H25 奈良女 計算機実験1 第4回
レポート課題12
x
y
0 1-1 …2-2…
012
…
ある分子が進行方向に時間ステップ毎に移動する際、前(y++)、後ろ (y--)、右 (x++)、左(x--)にそれぞれ1/4の確率で移動するものとする。10000個の分子に対して移動を10, 50, 100回ずつ繰り返した後のx,yを求め、それぞれの結果についてxy平面上に分子の位置をプロットせよ。
…
-1-2
H25 奈良女 計算機実験1 第4回
Mathematicaでのxy平面上プロットの描き方
SetDirectory[“データのあるディレクトリ名”]
data = ReadList[“data”,{Real,Real}] (*注: データは一行につき一回のシミュレーション後の x y を書き出しておくこと*)
(*シミュレーションの回数が表示されることを確認*)n=Length[data]
ListoPlot[data,PlotRange-‐>{{-‐50,50},{-‐50,50}},AspectRatio-‐>1]
H25 奈良女 計算機実験1 第4回
レポート提出
12月20日 (金) 17:00 厳守
• 締め切りに遅れたものは受け取らない
• 数値微分、数値積分、並びに作成した全プログラムを全てホチキスでまとめ、提出
• 提出しない場合は0点。できたところだけでも必ず提出すること!
Top Related