裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

3 次元空間の単位ベクトルを表す乱数(その3)

2014年08月06日 | ブログラミング

新しい記事「3 次元空間の単位ベクトルを表す乱数(その4)」を参照

n 次元空間に拡張するには,(その2)の PearsonProblem3 が都合がよい。というか,2 箇所にある 3 を引数(dimension としよう)で指定してやるだけだ。

PearsonProblem4 = function(n = 4, dimension = 5, dR = 0.1, trial = 1e+05) {
    xyz = array(runif(dimension * n * trial, min = -1, max = 1), dim = c(dimension, n, trial))
    xyz = apply(xyz, 2:3, function(xyz2) xyz2/sqrt(sum(xyz2^2)))
    apply(xyz, 3, function(xyz2) sqrt(sum(rowSums(xyz2)^2)))
}
ans = PearsonProblem4(n = 2, dimension = 2, trial = 1e+06)
mean(ans)
hist(ans, nclass = 50)

で,上のように,2 次元で 2 歩進む場合をやってみると,原点と到達点の距離が 2 に近いというのが意外と多い。

プログラムを間違えたかと,図に描いてみた。

PearsonProblem5 = function(n = 4, dR = 0.1, trial = 1e+05) {
    dimension = 2
    theta = seq(0, 2 * pi, length = 500)
    x = n * cos(theta)
    y = n * sin(theta)
    plot(x, y, type = "l", asp = 1)
    xyz = array(runif(dimension * n * trial, min = -1, max = 1), dim = c(dimension, n, trial))
    xyz = apply(xyz, 2:3, function(xyz2) xyz2/sqrt(sum(xyz2^2)))
    apply(xyz, 3, function(xyz2) {
        lines(c(0, cumsum(xyz2[1, ])), c(0, cumsum(xyz2[2, ])), col="gray80")
        points(cumsum(xyz2[1, ])[n], cumsum(xyz2[2, ])[n], col = "red", pch = 16)
    })

}
PearsonProblem5(n = 2, trial = 100)

確かに,半径2の円周の近くに達する場合が結構ある。



パラドックスかなあ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

3 次元空間の単位ベクトルを表す乱数(その2)

2014年08月06日 | ブログラミング

新しい記事「3 次元空間の単位ベクトルを表す乱数(その4)」を参照

昨日のピアソン問題では,極座標において角度をランダムに選択すると仮定した。そのようにすると,直交座標におけるベクトルの要素値は一様分布しないことになる。
そこで,直交座標で一様分布するように x, y, z を [-1, 1] の一様乱数から取り出し,ノルムが 1 になるように正規化するようにした。
プログラムは非常に簡単になった(オリジナルの作者のプログラムは VBA で書かれていたので判読が難しい)。
また,n 歩進んだ後の X, Y, Z 座標にも偏りはない(平均値は 0 に近い)。

PearsonProblem3 = function(n = 4, dR = 0.1, trial = 1e+05) {
    xyz = array(runif(3 * n * trial, min = -1, max = 1), dim = c(3, n, trial))
    xyz = apply(xyz, 2:3, function(xyz2) xyz2/sqrt(sum(xyz2^2)))
    apply(xyz, 3, function(xyz2) sqrt(sum(rowSums(xyz2)^2)))
}
ans = PearsonProblem3(n = 3, trial = 1e+06)
mean(ans)
hist(ans, nclass = 50)

結果は,下図のようになった。分布の形が違う(オリジナルの作者のものとも違う)。

このシミュレーションでは,平均値は 1.624884 であった。

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村