Simulation_assignment2
-
Upload
t2c -
Category
Data & Analytics
-
view
89 -
download
2
description
Transcript of Simulation_assignment2
提出日:2014年 7月18日
課題 2(公開用)
T2C_(Twitter : @T2C_)
1
■課題内容
合成関数の確率密度を持つ乱数を生成し、ヒストグラムを作成し、また理論値との比較を行う。
■合成法
○計算内容・概要
一様分布乱数から合成関数の確率密度を持つ乱数を生成する。
n個の確率密度 hi(x)の合成関数 f(x)の標準系は
f(x) = ∑ βi hi(x)
𝑛
𝑖=1
, (𝑎 ≤ x ≤ b), βi ∶ 合成比率。また βi ≥ 0
また
∫ ℎ𝑖(𝑥)𝑑𝑥𝑏
a
= 1 , ∑ βi
𝑛
𝑖=1
= 1
を満たす。
この標準系を基に確率密度 hk(x)で xを生成する。
(1) a=0 , b =1 とし、区間(a , b)で一様乱数ξ1、ξ2を生成する
(2) ξ1により kを決める。
(3)
β0 = 0 として ∑ βi
𝑘−1
𝑖=0
< ξ1 < ∑ βi
𝑘
𝑖=0
(1 ≤ k ≤ n) である。
(4) ξ2により確率密度 hk(x)に従って xを生成する。
これを利用して
例 1. f(x) = 3
5 (1 + 𝑥 +
1
2𝑥2) , (0 < x < 1)
例 2. f(x) = 1
4 (
1
√𝑥 +
1
√1 − 𝑥) , (0 < x < 1)
2
の密度を持つ確率変数 xを生成する。
まず標準系への変換を施し、
例 1.f(x) = 3
5 × 1 +
3
5 ×
1
2 × 2𝑥 +
3
5 ×
1
2 ×
1
3 × 3𝑥2
∴ β1 = 3
5 , β2 =
3
10 , β3 =
1
10 また h1(x) = 1 , h2(x) = 2𝑥 , h1(x) = 3𝑥2
これより以下の手順で生成する。
① ξ1を発生
② ξ1 ≦ 3
5 であればξ2を発生し xとする
③ 3
5 < ξ1 ≦
9
10 であればξ2、ξ3を発生しその最大の値を xとする
④ ξ1 > 9
10 であればξ2、ξ3、ξ4を発生しその最大の値を xとする
しかしこれはプログラミング上効率化が出来るので、
① ξ1を発生、またもう一つ生成した乱数を xとする
② ξ1 < 3
5 でなければ再び乱数を発生し元の xと比較して大きい方を xとする
③ ξ1 < 9
10 でなければ再び乱数を発生し元の xと比較して大きい方を xとする
とする。
例 2.f(x) = 1
2 ×
1
2√𝑥 +
1
2 ×
1
2√1 − 𝑥
∴ β1 = 1
2 , β2 =
1
2 また h1(x) =
1
2√𝑥 , h2(x) =
1
2√1 − 𝑥
また H1(X) = ∫ ℎ1(𝑥)𝑑𝑥𝑥
0
= √𝑥 , H2(X) = ∫ ℎ2(𝑥)𝑑𝑥𝑥
0
= 1 − √1 − 𝑥
これより以下の手順で生成する。
① ξ1を発生し 2乗にしたものを xとする
② ξ2を発生し 1
2 以上であれば x = 1 - x とする
以上を踏まえて VBA(Excel2010上)でプログラミングを行った。
3
――――― 以下 ソースコード ―――――
Const beta1 As Double = 3 / 5, _
beta2 As Double = 9 / 10, _
beta3 As Double = 1 / 2
Function Rei1() As Double
Dim xi As Double
Randomize
xi = Rnd()
Rei1 = Rnd()
If (xi < beta1) Then
Else
Rei1 = max(Rei1, Rnd())
End If
If (xi < beta2) Then
Else
Rei1 = max(Rei1, Rnd())
End If
End Function
4
Function Rei2() As Double
Randomize
Rei2 = (Rnd()) ^ 2
If (Rnd() > beta3) Then
Rei2 = 1 - Rei2
End If
End Function
Function max(a As Double, b As Double) As Double
If (a > b) Then
max = a
Else
max = b
End If
End Function
Function F(ex As Integer, x1 As Double, x2 As Double)
If ex = 1 Then
F = 3 / 5 * ((x2 + 1 / 2 * x2 * x2 + 1 / 6 * x2 * x2 * x2) _
- (x1 + 1 / 2 * x1 * x1 + 1 / 6 * x1 * x1 * x1))
ElseIf ex = 2 Then
F = -1 / 2 * ((Sqr(1 - x2) - Sqr(x2)) - (Sqr(1 - x1) - Sqr(x1)))
End If
5
End Function
Function histogramming()
Dim N As Long, Nbin As Integer, Nbin1 As Integer, _
NRnd As Long, i As Integer, ex As Integer
Dim a As Double, b As Double, dx As Double, _
x As Double, x2 As Double, y As Double
With Sheet1
.Cells(4, 11) = InputBox("例題番号を入力してください(1 or 2)", "例題番号の決定")
.Cells(4, 12) = InputBox("Nbin数を入力してください。(30-50)", "Nbinの決定")
.Cells(4, 13) = InputBox("発生する乱数の個数を入力してください。型:Long", "乱数の個数の決定")
ex = .Cells(4, 11)
Nbin = .Cells(4, 12)
Nbin1 = Nbin + 1
NRnd = .Cells(4, 13)
a = 0#
b = 1#
Dim H(0 To 51) As Long
For i = 0 To Nbin1
H(i) = 0
Next i
dx = (b - a) / Nbin
For N = 1 To NRnd
If ex = 1 Then
x1 = Rei1()
ElseIf ex = 2 Then
x1 = Rei2()
End If
6
x2 = x1 - a '3つの乱数の最大値 0~1
i = Int(x2 / dx) + 1 '(x * Nbin) + 1 ->添字
If (i < 0) Then
i = 0
End If
If (i > Nbin) Then
i = Nbin1
End If
H(i) = H(i) + 1
Next N
For i = 1 To Nbin
x = a + (i - 0.5) * dx ' / Nbin
y = H(i) / (NRnd * dx)
.Cells(i + 3, 2) = x
.Cells(i + 3, 3) = y
Next i
End With
End Function
Sub Analytic()
Dim N As Long, Nbin As Integer, Nbin1 As Integer, _
i As Integer, a As Integer, b As Integer, ex As Integer
Dim dx As Double, H As Double, _
x As Double, x1 As Double, x2 As Double
7
With Sheet1
.Cells(4, 11) = InputBox("例題番号を入力してください(1 or 2)", "例題番号の決定")
.Cells(4, 12) = InputBox("Nbin数を入力してください。(30-50)", "Nbinの決定")
.Cells(4, 13) = InputBox("発生する乱数の個数を入力してください。型:Long", "乱数の個数の決定")
ex = .Cells(4, 11)
Nbin = .Cells(4, 12)
Nbin1 = Nbin + 1
NRnd = .Cells(4, 13)
a = 0
b = 1
dx = (b - a) / Nbin
For i = 1 To Nbin
x1 = a + (i - 1) * dx
x2 = x1 + dx
x = (x1 + x2) / 2
H = F(ex, x1, x2) / dx
.Cells(i + 3, 4) = x
.Cells(i + 3, 5) = H
Next i
End With
End Sub
Sub clear()
With Sheet1
Range(.Cells(4, 2), Cells(100, 5)).clear
End With
End Sub
8
――――― ソースコード 終わり ―――――
○実行結果
例 1、例 2のいずれもビンの数は 50個、乱数の個数は 50万個で行った。
実行結果とそのグラフは以下の様になった。
x Histogram X Theoritical Value
0.01 0.7152 0.01 0.606040.03 0.6728 0.03 0.618280.05 0.5958 0.05 0.630760.07 0.6875 0.07 0.643480.09 0.6543 0.09 0.656440.11 0.7266 0.11 0.669640.13 0.6355 0.13 0.683080.15 0.5861 0.15 0.696760.17 0.6384 0.17 0.710680.19 0.5642 0.19 0.724840.21 0.8228 0.21 0.739240.23 0.8703 0.23 0.753880.25 0.7671 0.25 0.768760.27 0.7129 0.27 0.783880.29 0.8393 0.29 0.799240.31 0.9365 0.31 0.814840.33 0.9266 0.33 0.830680.35 0.8699 0.35 0.846760.37 0.9245 0.37 0.863080.39 0.7719 0.39 0.879640.41 0.9901 0.41 0.896440.43 0.7176 0.43 0.913480.45 1.0522 0.45 0.930760.47 0.8322 0.47 0.948280.49 0.8968 0.49 0.966040.51 1.0948 0.51 0.984040.53 1.0348 0.53 1.002280.55 1.0004 0.55 1.020760.57 1.0629 0.57 1.039480.59 1.0859 0.59 1.058440.61 1.0651 0.61 1.077640.63 0.9816 0.63 1.097080.65 1.1712 0.65 1.116760.67 1.3133 0.67 1.136680.69 1.1663 0.69 1.156840.71 1.2546 0.71 1.177240.73 1.2766 0.73 1.197880.75 1.2152 0.75 1.218760.77 1.1574 0.77 1.239880.79 1.249 0.79 1.261240.81 1.2604 0.81 1.282840.83 1.1411 0.83 1.304680.85 1.2497 0.85 1.326760.87 1.4273 0.87 1.349080.89 1.2282 0.89 1.371640.91 1.3643 0.91 1.394440.93 1.4689 0.93 1.417480.95 1.3478 0.95 1.440760.97 1.4289 0.97 1.464280.99 1.5472 0.99 1.48804
x Histogram X Theoritical Value
0.01 3.8108 0.01 3.7867965640.03 1.7192 0.03 1.7183060080.05 1.368 0.05 1.3802224980.07 1.1645 0.07 1.2065851250.09 1.1282 0.09 1.0967015040.11 1.0232 0.11 1.019563540.13 1.0023 0.13 0.9619219890.15 0.918 0.15 0.9170242970.17 0.8887 0.17 0.8810173470.19 0.8458 0.19 0.851521240.21 0.8462 0.21 0.8269771210.23 0.8057 0.23 0.8063167620.25 0.7912 0.25 0.788781620.27 0.7501 0.27 0.7738175030.29 0.7438 0.29 0.7610101550.31 0.7587 0.31 0.7500442210.33 0.7434 0.33 0.740676230.35 0.7719 0.35 0.7327162740.37 0.7054 0.37 0.7260153220.39 0.7028 0.39 0.7204562470.41 0.6919 0.41 0.7159474120.43 0.7267 0.43 0.7124180370.45 0.7262 0.45 0.7098148690.47 0.6879 0.47 0.7080998110.49 0.6833 0.49 0.7072483020.51 0.7262 0.51 0.7072483020.53 0.7131 0.53 0.7080998110.55 0.6952 0.55 0.7098148690.57 0.6936 0.57 0.7124180370.59 0.7342 0.59 0.7159474120.61 0.7449 0.61 0.7204562470.63 0.6946 0.63 0.7260153220.65 0.7427 0.65 0.7327162740.67 0.7314 0.67 0.740676230.69 0.7591 0.69 0.7500442210.71 0.7435 0.71 0.7610101550.73 0.8042 0.73 0.7738175030.75 0.7761 0.75 0.788781620.77 0.7885 0.77 0.8063167620.79 0.8547 0.79 0.8269771210.81 0.8377 0.81 0.851521240.83 0.9191 0.83 0.8810173470.85 0.905 0.85 0.9170242970.87 0.9055 0.87 0.9619219890.89 1.0345 0.89 1.019563540.91 1.0666 0.91 1.0967015040.93 1.2394 0.93 1.2065851250.95 1.4225 0.95 1.3802224980.97 1.6871 0.97 1.7183060080.99 3.7767 0.99 3.786796564
9
表 1 例 1の実行結果 表 2 例 2の実行結果
図 1 例 1の実行結果のグラフ化
図 2 例 2の実行結果のグラフ化
10
■考察
今回は合成関数の確率密度を持つ確率変数を生成してヒストグラムを出力するプログラムを作り、
生成されたヒストグラムと確率密度関数のグラフを同じグラフに可視化して一致することを確認した。
まず例 2は数回行っても比較的に理論値とは相違が少なかったのに対し、
例 1の方は回毎にバラつきが大きかったことについて考察する。
これはβの値による相違、つまり元の関数の係数や値による違いによるものであると考えられる。
今回の場合であれば β1 = 3
5 , β2 =
3
10 , β3 =
1
10 であったが、それぞれと(効率化もして)
比較を行い乱数を数個生成した為、よりランダム性が高まったのではないだろうか。
一方例 2の方では乱数を一つ生成し 2乗し次の乱数によって足して 1となる数と入れ替えを行うのみで
あった為、バラつきは少なかったと考えられる。
或いはβの個数による違いであるかもしれないとも考えられるだろう。
また試しに例 1を乱数は 50万個で同じまま 500ビンで行ってみると、
図 3 ビン数 500の例 1
このように非常に理論値とのズレが顕著となった。
この状態で乱数生成数を 500万個にすると、
図 4 ビン数 500 乱数 500万個の例 1
と、当然なだらかにはなるもののそれでも大きくズレる。
0
0.5
1
1.5
2
2.5
0.0
01
0.0
85
0.1
69
0.2
53
0.3
37
0.4
21
0.5
05
0.5
89
0.6
73
0.7
57
0.8
41
0.9
25
Histogram
Theoritical Value
0
0.5
1
1.5
2
0.0
01
0.0
79
0.1
57
0.2
35
0.3
13
0.3
91
0.4
69
0.5
47
0.6
25
0.7
03
0.7
81
0.8
59
0.9
37
Histogram
Theoritical Value
11
この事からビン数の決定もプロットの上で大きな役割を果たしている事が見て取れるだろう。
速度は 3.4GHz 4コアの PC上で、例 1乱数 50万個でコンマ秒、500万個で数秒、
それから 5000万個で 30秒ほどであった。
■課題・今後の展望
○別の合成関数(βが多くなるものや条件が面白いもの)との比較
○応用方法の検討
今回において合成関数の確率分布を持つ乱数生成法を習得したので、
その応用方法も考えてみるべきと感じた。
しかし不勉強からか日常においてあまり触れる機会が無かった為直感的に浮かばなかったので
書籍などを参照した上で考えると良いだろう。
■結び
様々な乱数を生成出来れば、それぞれ恐らく使い道が多岐に渡り、
またこれから始まる研究にも応用が利く事は想像に易いので、
自らの糧としてゆきたいとする想いを以て本レポートの結びとする。