Python 在球体上绘制点

Python 在球体上绘制点,python,numpy,matplotlib,mplot3d,Python,Numpy,Matplotlib,Mplot3d,我试图在球体上生成随机、均匀分布的点。但是,代码创建的点似乎创建了一个磁盘。我认为问题在于“菲兰德”的定义。那里的数学不正确吗?我在Matlab中使用了相同的代码,它在Matlab中工作 代码: 将numpy导入为np 进口派拉布 从scipy.integrate导入odeint 将matplotlib.pyplot作为plt导入 #随机输入 将mpl_toolkits.mplot3d.axes3d作为p3导入 随机导入为rand particlecount=产生能量的10个粒子 binsize

我试图在球体上生成随机、均匀分布的点。但是,代码创建的点似乎创建了一个磁盘。我认为问题在于“菲兰德”的定义。那里的数学不正确吗?我在Matlab中使用了相同的代码,它在Matlab中工作

代码:

将numpy导入为np
进口派拉布
从scipy.integrate导入odeint
将matplotlib.pyplot作为plt导入
#随机输入
将mpl_toolkits.mplot3d.axes3d作为p3导入
随机导入为rand
particlecount=产生能量的10个粒子
binsize=15#确定电子能量直方图的bin大小
RStart=0.02
phi1=0
φ2=180
phi1rad=phi1*(np.pi/180)
phi2rad=phi2*(np.pi/180)
#为s1和s2之间的每个粒子生成随机位置
ICPositions=np.array([])
对于范围(0,粒子计数)内的i:

#在球面:生成边界为:S1的随机位置中,我找到了解决方案,但不明白它为什么有效。从数学上讲,我对x、y和z的转换定义没有任何错误(在我用谷歌搜索并在教科书中查找之后)。然而,我看到另一篇文章,其中有人对这些坐标的定义略有不同(用余弦替换所有phi分量的正弦),但没有解释原因。当我更换此部件时,以下各项起到了作用:

xrand = RStart*np.sin(phirand)*np.cos(thetarand)
yrand = RStart*np.sin(phirand)*np.sin(thetarand)
zrand = RStart*np.cos(phirand)
为此:

xrand = RStart*np.cos(phirand)*np.cos(thetarand)
yrand = RStart*np.cos(phirand)*np.sin(thetarand)
zrand = RStart*np.sin(phirand)

同样,我也不知道为什么会这样,但是@Jenny在另一篇帖子上给出了一个提示,该帖子对同一代码提出了不同的问题。使用[-90,90]而不是[0180]可能是需要进行此更改的原因,但我同样不确定为什么sin[0,90180]-->[0,1,0],而cos[-90,0,90]-->[0,1,0]和两者都覆盖相同的数值范围。如果有人对此有可靠的数学/编码原因,请对我的答案进行评论,以便进一步解释。

phirand
公式看起来很奇怪。它应该与
thetarand
(假设您希望在一个shpere上均匀分布)相同,不应该这样定义
phirand
phirand=np.arcin(np.sin((phi2rad-phi1rad)*rand.uniform(0,1))+np.sin(phi1rad))
@Marat这绝对是不同的,因为θ的范围是[0,2pi],phi的范围是[0,pi]@Ondro这确实改变了绘图,但点遵循的是三维抛物线形状,而不是圆盘。@Tom no,[0,pi]将只产生一半的球体。[-pi/2,pi/2]应该可以工作,但是[0,2pi]也可以工作,你需要一个完整的球体,或者换句话说,zrand必须从[-1,1]开始运行。从[-90,90]定义phirand时,正弦函数将从[-1,1]开始运行(但余弦仅覆盖[0,1])。类似地,如果定义phirand=[0180],余弦将从[-1,1]开始计算。@Jenny我明白了,谢谢你的解释。我想我犯了一些代数错误。
xrand = RStart*np.cos(phirand)*np.cos(thetarand)
yrand = RStart*np.cos(phirand)*np.sin(thetarand)
zrand = RStart*np.sin(phirand)