我正在尝试在球体上生成随机、均匀分布的点。但是,代码正在创建似乎创建磁盘的点。我认为问题在于“phirand”定义。那里的数学不正确吗?我在 Matlab 中使用了相同的代码,它在其中工作。代码:import numpy as npimport pylabfrom scipy.integrate import odeintimport matplotlib.pyplot as plt#import randomimport mpl_toolkits.mplot3d.axes3d as p3import random as randparticlecount = 10 ## of particles to generate energies for energy generationbinsize = 15 #Determines bin size for historgram of electron energiesRStart = 0.02phi1 = 0phi2 = 180phi1rad = phi1*(np.pi/180)phi2rad = phi2*(np.pi/180)#Generate random positions for each particle between s1 and s2ICPositions = np.array([])for i in range(0,particlecount): #In Spherical: Generates random position with boundaries of: S1<r<S2 thetarand = (2*np.pi)*rand.uniform(0,1) #Random # generation for component y between s1 and s2 phirand = np.arcsin((np.sin(phi2rad) - np.sin(phi1rad))*rand.uniform(0,1) + np.sin(phi1rad)) xrand = RStart*np.sin(phirand)*np.cos(thetarand) yrand = RStart*np.sin(phirand)*np.sin(thetarand) zrand = RStart*np.cos(phirand) randArray = np.array([xrand,yrand,zrand]) randArray = np.array(randArray,dtype = float) if ICPositions.size == 0: ICPositions = np.array([randArray]) else: ICPositions = np.append(ICPositions,[randArray],axis = 0)print(ICPositions)fig = plt.figure()ax = fig.add_subplot(111,projection='3d')ax.scatter(ICPositions[:,0],ICPositions[:,1],ICPositions[:,2],c='r',marker='o')ax.set_xlabel('x axis')ax.set_ylabel('y axis')ax.set_zlabel('z axis')plt.show()
1 回答
慕斯王
TA贡献1864条经验 获得超2个赞
我想出了解决方案,但不明白它为什么起作用。从数学上讲,我对 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] 而不是 [0,180] 可能是需要此更改的原因,但我再次不确定为什么作为 sin[0,90,180] --> [0,1,0] 而 cos[-90,0 ,90] --> [0,1,0] 并且都覆盖相同的数值范围。如果有人对此有可靠的数学/编码原因,请评论我的答案以进一步解释。
添加回答
举报
0/150
提交
取消