本日の講義資料

1
2015年6月4日
エネルギー工学演習II
乱数とモンテカルロ
― 第1回:乱数の発生 ―
渡辺幸信
2
エネルギー工学演習IIのスケジュール
1.コンピュータ演習-1
2.コンピュータ演習-2
3.コンピュータ演習-3
4.コンピュータ演習-4
5.コンピュータ演習-5
6.コンピュータ演習-6
7.コンピュータ演習-7
8.コンピュータ演習-8
9. 英作文-1
7/2
10. 英作文-2
7/9
11.コンピュータ演習-9
12.コンピュータ演習-10
13. 英作文-3
7/16
14. 英作文-4
7/23
4/16
4/23
4/30
5/14
5/21
5/28
6/4
6/11
山本
山本
6/18
6/25
山本
山本
山口
山口
松清
山口
山口
山口
渡辺
渡辺
渡辺
渡辺
変更
本演習のHP
http://enep.ence.kyushu-u.ac.jp/lectures06.html
3
1.はじめに
• モンテカルロ法(Monte Carlo method)は乱数
(random number)を用いた数値解析技法の総称。
• カジノで有名なモナコの地名モンテカルロに由来し
て命名された。
• 乱数とはある指定された確率分布をもつ数列を意
味する。
4
モンテカルロ法の対象
• モンテカルロ法の対象となる問題は、確率的な事象とそ
うでない決定論的事象に大別できる。
• 確率的な事象は広範囲の問題に含まれており、モンテ
カルロ法は自然科学、工学、医学、経済・社会科学等の
様々分野におけるコンピュータ・シミュレーションで広く
用いられている。
– 例えば、原子炉内のランダムな中性子の運動を、その素過程
である原子核衝突の断面積(反応確率を意味する)を用いて乱
数で表現し、炉内の中性子挙動を調べること(中性子拡散現象
のシミュレーション)に使われる。
– 決定論的事象への典型的な適用例として多次元空間での定
積分の数値計算がある。
5
PHITS計算結果の例
137Cs
から放出された100,000個の光子の挙動を模擬
個々の放射線挙動を模擬することにより,全体的な挙動(平均値)を導出
6
JQMD (JAERI Quantum Molecular Dynamics) モデル
• 原子核を核子の集合体と仮定して,全ての核子間力を数値解析で解く手法
• 入射放射線の核種・エネルギーとターゲット核種の情報から核反応の終状態
を予測することができる
Iwase et al
Production
yields
of residual
nuclides
Double
differential
cross
section of
neutron
56Fe
K. Niita et al., Phys. Rev. C52 (1995) 2620
800 MeV/u on 208Pb
7
中性子発生装置周辺の電離量計算
Energy
Deposition
tt == 201000
410nsec
100
nsec
nsec
nsec
Be reflector
Fe reflector
Moderators
Proton
Hg target
Moderators
水銀ターゲット付近の電離量計算
Hg target
水銀ターゲット付近の幾何形状
M. Harada et al. J. Nucl. Material 343, 197 (2005)
8
本演習の内容
• 組み込み関数を使った一様乱数の発生(6/4)
• 一様乱数を用いたサンプリング手法(6/4)
• 数値積分への応用(6/11)
– pの計算
– モンテカルロ法による定積分
9
2.乱数
• さいころやルーレットは簡単な乱数発生器の1つ
• 乱数表や物理乱数源(ランダム物理現象を利用した電子管
の雑音、放射性物質の崩壊など)
• 一般にモンテカルロ計算では算術乱数が使われる。この乱
数を発生させる方法が、計算機内の簡単な四則演算で行わ
れるので“算術的”であり、ランダムでない方法で近似的にラ
ンダムな数列を作るので、“疑似”乱数と呼ばれる。
乱数の中でも基本となるのは、
[0,1]の区間に一様に分布する一様乱数
10
演習1: [0,1]の一様乱数発生
11
乱数発生用組み込みサブルーチンrandom_numberの使い方
10個の一様乱数を発生して画面上に出力
program random_uni
implicit none
real r
integer i
do i = 1, 10
call random_number(r)
write(*,*) r
enddo
end program random_uni
Call 文でサブルーチンを
呼び出す。結果は引数rに入る。
一様乱数の出力結果
3.9208680E-07
2.5480442E-02
0.3525161
0.6669145
0.9630555
0.8382882
0.3353550
0.9153272
0.7958636
0.8326931
何度実行しても同じ結果
が出力される。
毎回、違う乱数列が
ほしい場合
乱数の初期値設定サブ
ルーチン random_seed
(毎回、異なった乱数列を
発生できる)
何度か実行して結果が変
化することを確認すべし
program random_uni
implicit none
real r
integer i
call random_seed()
do i = 1, 10
call random_number(r)
write(*,*) r
enddo
end program random_uni
12
出席チェックタイム
下記のアドレスへメール発信してください。
[email protected]
件名: 学生番号と氏名の併記
1TE11**** 九州太郎
講義の印象、感想、要望等のコメントがあれば、
記入してください。
13
14
一様乱数の頻度分布作成
• 頻度分布をヒストグラム(柱状グラ
フ)で表すプログラム(hist_random)
を用いて乱数の一様性をテストする
• ここでは[0,1]を10個のビン(すなわ
ち、0~0.1, 0.1~0.2, …., 0.9~1.0)
に分割する。発生した乱数がどの
ビンに入るか演算して、そのビンの
個数を1つ増やしていく。
• 最終的に同じビンに入った個数を
集計してヒストグラム表示でグラフ
化する。
0
10個のビン
1
本演習のHP
http://enep.ence.kyushu-u.ac.jp/lectures06.html
15
一様乱数の頻度分布作成
program hist_random
implicit none
real r, dr, rmax
integer nb, nmax, ir, i, hist(0:10)
dr=0.1
! ヒストグラムのビン幅
rmax=1.0
! ヒストグラム横軸の最大値(上限値)
nb=rmax/dr
! ヒストグラムのビン数 = 上限値(rmax)/ビン幅(dr)
nmax = 10000
! 乱数の発生数
do i =0,nb
! ヒストグラムデータの初期化 注)do-loopを使う代わりに、
hist(i)=0
! hist(:)=0 と一行に書いて一括代入も可
enddo
call random_seed() ! 乱数の初期値設定(毎回、異なった乱数列を発生可)
do i= 1, nmax
call random_number(r) ! 乱数1個発生
ir= r / dr
! ヒストグラムのビン番号irの計算
hist(ir)=hist(ir)+1
! ヒストグラムのビンに一つ加える
enddo
do i=0,nb
write(*,*) i,hist(i)
! ヒストグラムの出力
enddo
end program hist_random
16
リダイレクション機能
集計結果をグラフ化するために、リダイレクション機能を使っ
て結果をファイル(randhist.dはファイル名)に保存する。
./a.out > randhist.d
write(*,*) : 標準出力(スクリーン上)
出力先をファイルに変更する方法
open文を使わずにファイル出力可(便利)
注) a.outはFortranコンパイラifort で作成した実行形式ファイ
ルの名称。-oオプションをつけないと, a.outが生成される。
gnuplotを用いてヒストグラム表示でグラフ化
gnuplot > plot [] [0:] ‘randhist.d’ with step
x軸はそのまま、y軸の始まりを0からに変更
17
一様乱数の頻度分布の例
nmaxを変化させて計算した結果をレポートには示して、考察すること。
nmax=100
nmax=10000
nmax=1000
nmax=100000
18
一様でない乱数の発生方法
ー 直接法 -
19
p(x)dx : 確率変数 x が [x,x+dx] にある確率とする。
p(x)は確率密度関数、区間[a,b]で規格化されているとする。

b
a
確率分布関数
(累積分布関数)
p( )d  1
p(x)
x
P( x)   p( )d  r
a
1
x  P (r )
a
b x
1
P(x)
r
単調増加関数
[0,1]の一様乱数 r より x が一意に決まる。
0
a
x
b
一様でない乱数の発生方法
ー 指数関数分布 -
確率密度関数
1
 exp(  x /  ) ( x  0)
p( x)   

0
( x  0)

(3-3)に代入して、確率分布関数 P(x) を求める。
x
1
0

r  P( x)  
exp(  )d  1  exp( x)
ここで逆変換(3-4)を行って
x   ln(1  r )
[0,1]の一様乱数 r から指数関数の確率分布に従う確率変数 x を
サンプリングすることができる。
20
21
演習課題(2)
演習課題(1)のプログラムを参考にして、上記の指数関数分布
(λ=1 とせよ)に対するサンプリングのプログラムを作成せよ。
•
•
•
•
nmax=10000
ビン幅は0.1
x軸の上限を10.0
縦軸 linear表示とlog表示の頻度分布
ヒストグラム
自然対数(底がe)
y=log(x)
ヒント: gnuplotのコマンド
set logscale y
22
演習課題(3) 発展問題
それぞれサイコロの目が出る確率が表1で与えられる”サイバー
サイコロ”をコンピュータ上で製作し、試行回数10, 100, 1000とした
場合の各目が出る頻度分布(ヒストグラム)を作成せよ。
(3-3) 式
サイの目i
1
2
3
4
5
6
確率pi
0.1
0.2
0.3
0.1
0.2
0.1
1
x
P( x)   p( )d  r
a
0.8
r=0.75
0.6
i
Pi
Pi   pk  r
k 0
ヒント: if文を使うことになる。
0.4
0.2
0
1
2
3
4
5
サイコロの目
6
レポート提出の注意点
23
• 電子ファイル形式のレポートをメール添付で提出する際、空メールで
なく、教員に対する通常のメール(手紙)の書き方をすること。(宛先、
提出する旨の簡単なメール文章、発信者の氏名等)
• Gnuplotで作成した図ファイル(PNG形式)はワードの挿入機能(各自
で使い方を調べる)を使ってワードファイル内に図として取り込むこと
ができるので、レポートは図も含めた1つのファイルにすること。
• レポートファイル名: 学生番号+氏名
• レポートをファイルとして提出する際も、通常の紙ベースのレポートと
同じく、氏名や学生番号、提出日等の情報をレポートの始めに記載
するのが望ましい。
• レポートの書き方の参考書、例えば
木下是雄「理系のための作文技術」(中公新書)
を読んで、執筆スキル(技巧)を磨くこと。(講義HP参照)