我使用球体上的粒子进行了Metropolis蒙特卡洛模拟,并对在给定时间步长内的随机运动存在疑问。
我知道,要开始获得球体上随机点的均匀分布,使用最简单的方法(使用具有常数R的球坐标并选择随机角度theta和phi)是不够的,但是必须使用这些方法之一:http://mathworld.wolfram.com/SpherePointPicking.html
查看球面上的蒙特卡洛的另一代码,我看到了一种生成随机运动的相当复杂的方法:选择一个随机粒子,计算将其移至北极的旋转矩阵,找到一个小于一定长度的随机笛卡尔矢量并移动将其移至北极,将笛卡尔向量归一化,然后将其旋转回原始粒子位置附近。
这都是为了获得无偏的新随机位置。尽管我怀疑其原理与详细的平衡有关,但我并不完全理解其原理。但是我的感觉是应该有一种更简单(即更快)的方法来做到这一点。实际上,从直觉上说,我觉得在这种情况下可以找到两个小的随机角度theta和phi并将它们添加到粒子的位置上-否则这是错误的吗?
最佳答案
您描述的算法背后的原理是,将点映射到一个极点,生成一个切平面,以通常的方式均匀地生成一个笛卡尔矢量,然后将其映射回球体,并最终反转旋转。由于切线平面是导数,因此对于大球体和小步长,这是一个很好的近似值。
我们可以做得更好吗?还是至少窃取了别人的代码?也许。考虑一下:由于有了article on MathWorld,您已经可以在球体上生成均匀的随机点分布。
不失一般性,您可以将当前点视为球体的一个极点。如果使用MathWorld算法生成随机点,则知道所得的点在任何方位角上的概率均一。
然后将问题简化为在球体上找到轴承,给定两个点的phi/theta值,然后沿该轴承的大圆路径生成一个新点,即一个增量曲面距离。
对于这个新版本的问题,您可以通过导入自己喜欢的GIS或projection库并使用地球的球形模型(具有适当的缩放比例)来获取所需的所有代码。
许多人似乎将this site视为具有大量关于球形导航的好数学。
关于montecarlo - 球面: unbiased random steps的蒙特卡洛模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12900861/