Simulation_assignment2

12
提出日:2014年 7 月18 課題 2(公開用) T2C_Twitter : @T2C_

description

This is a class about learning simulation's assignment. Using a composite function as a probability density function. In other words, to generate variable of composite function by uniform random number.

Transcript of Simulation_assignment2

Page 1: Simulation_assignment2

提出日:2014年 7月18日

課題 2(公開用)

T2C_(Twitter : @T2C_)

Page 2: Simulation_assignment2

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)

Page 3: Simulation_assignment2

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上)でプログラミングを行った。

Page 4: Simulation_assignment2

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

Page 5: Simulation_assignment2

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

Page 6: Simulation_assignment2

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

Page 7: Simulation_assignment2

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

Page 8: Simulation_assignment2

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

Page 9: Simulation_assignment2

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

Page 10: Simulation_assignment2

9

表 1 例 1の実行結果 表 2 例 2の実行結果

図 1 例 1の実行結果のグラフ化

図 2 例 2の実行結果のグラフ化

Page 11: Simulation_assignment2

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

Page 12: Simulation_assignment2

11

この事からビン数の決定もプロットの上で大きな役割を果たしている事が見て取れるだろう。

速度は 3.4GHz 4コアの PC上で、例 1乱数 50万個でコンマ秒、500万個で数秒、

それから 5000万個で 30秒ほどであった。

■課題・今後の展望

○別の合成関数(βが多くなるものや条件が面白いもの)との比較

○応用方法の検討

今回において合成関数の確率分布を持つ乱数生成法を習得したので、

その応用方法も考えてみるべきと感じた。

しかし不勉強からか日常においてあまり触れる機会が無かった為直感的に浮かばなかったので

書籍などを参照した上で考えると良いだろう。

■結び

様々な乱数を生成出来れば、それぞれ恐らく使い道が多岐に渡り、

またこれから始まる研究にも応用が利く事は想像に易いので、

自らの糧としてゆきたいとする想いを以て本レポートの結びとする。