2. 1
■課題内容
3 次元のピアソン問題[ 1 ]を解くプログラムを作り、歩数と到達距離の関係を調べる。
歩数を変え到達距離 R の確率分布、平均値、標準偏差から考察する。
■ピアソン問題
○計算内容・概要
ある点(原点 O)から出発して決められた歩数(n 回)分ランダムに動いた時の到達点が
半径 r と r + dR の間(図の円と円の間の部分)である確率はどれほどであるか、という問題。
元の問題では 1 回 1 ヤードとしているが簡単のため単位は省略した。
図 1 半径 r と r+dR の範囲
これは 2 次元上であるが、今回の課題では 3 次元上でのシミュレーションを行う。
(図は描画が難しいので割愛)
3 次元上で動かす為に、X 方向、Y 方向、Z 方向の 3 成分を持つ単位ベクトル(一歩分)を生成する。
まず一様乱数ξ1,2,3 を発生させ、3 つの変数(u,v,w とする)にそれぞれ
u = 2 *ξ1 - 1 , v = 2 *ξ2 -1 , w = ξ3
を代入し、u,v,w それぞれ 2 乗したものの和が 1 を下回った場合に
cosθ1 = 2 * u * w / d , cosθ2 = 2 * v * w / d , cosθ3 = (w2 -u2-v2) / d
とする事で、単位ベクトルの 3 成分が生成される。
これを用いて、距離を歩数を最大値としてビン数で割った分に分割し、確率密度を調べる。
dR
半径 r
3. 2
以上を踏まえて VBA(Excel2010 上)でプログラミングを行った。
――――― 以下 ソースコード ―――――
Const Nbin As Integer = 30, _
Nbin1 As Integer = Nbin + 1, _
X0 As Double = 0#, _
Y0 As Double = 0#, _
Z0 As Double = 0#
Function Randomwalk3D()
'place
Dim R(0 To Nbin1) As Double, X As Double, Y As Double, Z As Double
Dim Nstep As Integer, Nsample As Long, i As Long, j As Long
Dim xi1 As Double, xi2 As Double, xi3 As Double, P As Double 'p = f(R)
'result of calculation(xi1,xi2,xi3) , to judge, dR = Nstep/Nbin, distance
Dim u As Double, v As Double, w As Double, _
d As Double, dist As Double, dR As Double
'element of vector & IR = Int(Z/dR)
Dim costh1 As Double, costh2 As Double, costh3 As Double, IR As Integer
Randomize
With Sheet1
Nstep = .Cells(2, 3)
Nsample = .Cells(3, 3)
dR = Nstep / Nbin
.Cells(4, 3) = dR
4. 3
For i = 1 To Nsample
X = X0
Y = Y0
Z = Z0
For j = 1 To Nstep
Do
xi1 = Rnd()
xi2 = Rnd()
xi3 = Rnd()
u = 2 * xi1 - 1
v = 2 * xi2 - 1
w = xi3
d = u ^ 2 + v ^ 2 + w ^ 2
Loop Until d <= 1
costh1 = 2 * u * w / d
costh2 = 2 * v * w / d
costh3 = (w ^ 2 - u ^ 2 - v ^ 2) / d
X = X + costh1
Y = Y + costh2
Z = Z + costh3
Next j
dist = Sqr(X ^ 2 + Y ^ 2 + Z ^ 2)
IR = Int(dist / dR)
If IR > Nbin Then
R(Nbin1) = R(Nbin1) + 1
Else
R(IR) = R(IR) + 1
End If
Next i
5. 4
For IR = 0 To Nbin1
P = R(IR) / Nsample
.Cells(IR + 9, 2) = IR * dR
.Cells(IR + 9, 3) = R(IR)
.Cells(IR + 9, 4) = P
.Cells(IR + 9, 5) = P * dR
Next IR
End With
End Function
――――― ソースコード 終わり ―――――
○実行結果
ここで、R の確率分布はソースコード上で算出しているが、
平均値、誤差、分散、標準誤差は Excel 上の関数(以下に列挙)を用いて算出した。
・平均 =AVERAGE( 範囲 )
・誤差 =STDEV.P( 範囲 ) / SQRT( COUNT( 同範囲 ) )
・分散 =VAR.P( 範囲 )
・標準偏差 =STDEV.P(範囲)
また実行結果は以下の様になった。
表 1 歩数 3、標本数 10 万、Nbin50 での結果(平均など)
歩数 3 Rの平均値 1.55
標本 100000 R平均値の誤差 0.003397
dR 0.1 Rの分散 0.000369
Nbin 50 Rの標準偏差 0.019215