Python在4维球面上的点的均匀分布

Sam*_*tel 7 python trigonometry distribution montecarlo polar-coordinates

我需要在4维球体上均匀分布点.我知道这不像拾取3个角度和使用极坐标那样微不足道.

在我使用的3个维度

from random import random

u=random()
costheta = 2*u -1 #for distribution between -1 and 1
theta = acos(costheta)
phi = 2*pi*random

x=costheta
y=sin(theta)*cos(phi)
x=sin(theta)*sin(phi)
Run Code Online (Sandbox Code Playgroud)

这给出了x,y和z的均匀分布.

如何获得4个维度的类似分布?

unu*_*tbu 8

但是,标准方法可能不是最快的,是使用Muller方法在N球上生成均匀分布的点:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

N = 600
dim = 3

norm = np.random.normal
normal_deviates = norm(size=(dim, N))

radius = np.sqrt((normal_deviates**2).sum(axis=0))
points = normal_deviates/radius

fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
ax.scatter(*points)
ax.set_aspect('equal')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

只需更改dim = 3dim = 4在4球上生成点.

  • @GuillaumeChevalier:我承认我不明白细节,但也许你会发现[这个证明大纲很有用](https://stats.stackexchange.com/questions/7977/how-to-generate-uniformly-distributed-points-在 3-d-unit-sphe 表面#comment13055_7984)。关于除以零的问题:我相信除数为 0 的概率本身就是 0。在实际层面上,NumPy 通过发出 *警告* 并返回 `NaN` 来处理除以零(并且 Matplotlib 会跳过等于 NaN 的点) )。 (2认同)

Man*_*rth 2

取4D空间中坐标呈正态分布的一点,计算其单位向量。这将位于单位 4 球体上。

from random import random
import math
x=random.normalvariate(0,1)
y=random.normalvariate(0,1)
z=random.normalvariate(0,1)
w=random.normalvariate(0,1)
r=math.sqrt(x*x + y*y + z*z + w*w)
x/=r
y/=r
z/=r
w/=r
print (x,y,z,w)
Run Code Online (Sandbox Code Playgroud)