裏 RjpWiki

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

球面上で一様に分布する点を表す x, y, z 座標値を生成する

2021年02月12日 | ブログラミング

Julia でビュフォンの針」を書いたのには,速度比較だけではなく,もう一つ別の目的があったからなのだ。

ビュフォンの針のシミュレーションで,原点からのベクトルを考えるときに,方向がランダムなベクトルを作るときに,「長さが1以上のベクトルは除く」という操作をした後のベクトルだけを使わないと方向がランダムなベクトルは作れないということだった。

3次元空間でも同じで,球面に一様分布する点を表す座標を求めるときにも同じなのだ。-1 <= x, y, z <= 1 の一様乱数 x, y, z を発生させ,原点を起点,x, y, z を終点とするベクトルの内,ノルムが 1 より大きいは捨てる。ノルムが 1 以下のベクトルはノルムが 1 になるように伸ばすそうすれば,ベクトルの終点は球面に一様分布する。

以下のプログラムでできる x, y, z を,3次元空間にプロットできる。

グラフをぐりぐり動かすと点が一様分布している(らしい)ことが確認できる。

using Plots
plotly()

n=10000
xyz = (rand(n, 3) .- 0.5) .* 2
r = vec(sum(xyz.^2, dims=2))
xyz = xyz[r .<= 1, :] #@@@
r = r[r .<= 1] #@@@
factor = sqrt.(r)
xyz = xyz ./ factor
p = scatter(xyz[:, 1], xyz[:, 2], xyz[:, 3], markersize=0.1)

#@@@ を付けた 2 行を省いて,わかりやすくするために点の数を 5 倍にして図を描いてみると以下のようになる。濃淡があるということは,球面上で点が一様分布していないということである。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia でビュフォンの針 | トップ | 3 次元空間の単位ベクトルを... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事