我正在使用球体上的粒子进行大都会蒙特卡罗模拟,并且在给定时间步长中有关于随机运动的问题。
我理解为了在球体上获得随机点的均匀分布以开始它是不够的,使用天真最简单的方法(使用具有常数R的球面坐标并选择随机角度theta和phi),但是必须例如,使用以下方法之一:http://mathworld.wolfram.com/SpherePointPicking.html
查看球体上蒙特卡罗的另一个代码,我看到一种生成随机移动的相当复杂的方法:选择一个随机粒子,计算将其移动到北极的旋转矩阵,找到一个小于某个值的随机笛卡尔向量长度并将其移动到北极,标准化笛卡尔矢量,然后将其旋转回原始粒子位置附近。
这是为了获得一个无偏见的新随机位置。虽然我怀疑它与详细的平衡有关,但我完全不理解这个理由。但我的感觉是应该有一种更简单(即更快)的方式来做到这一点。实际上,直觉上我觉得在这种情况下可以找到两个小的随机角度theta和phi并将它们添加到粒子的位置 - 或者这会是一个错误吗?
答案 0 :(得分:1)
您描述的算法背后的基本原理是该点被映射到一个极点,一个切线平面被生成,一个笛卡尔向量以通常的方式均匀生成,然后被映射回球体,并且旋转是终于逆转了。由于切平面是导数,对于大球体和小步长,这是一个很好的近似值。
我们可以做得更好吗?或者至少偷别人的代码?也许。考虑一下:由于article on MathWorld,您已经可以在球体上生成随机点的均匀分布。
在不失一般性的情况下,您可能会认为您当前的观点是球体的极点。如果使用MathWorld算法生成随机点,则您知道结果点具有处于任何方位角的均匀概率。
然后问题被减少为在球体上找到一个方位,给定两个点的phi / theta值,然后沿着该轴承的大圆路径生成一个新的点增量表面距离。
对于此问题的新版本,您可以通过导入自己喜欢的GIS或projection库并使用地球的球形模型(具有适当的缩放比例)来获取所需的所有代码。
很多人似乎都提到this site在球形导航方面有很多好的数学。
答案 1 :(得分:0)
我想自己使用评论来回答上述评论,但我不能使用为评论保留的有限空间来做到这一点。如果这违反了准则,我很抱歉。
既然你问过,以防其他人在这里结束 - 我对这个问题有了新的见解:
我们真正需要担心的是详细的平衡;如果P(a)是处于状态a的概率而P(a-> b)是转换到状态b的概率,则详细平衡需要P(a)P(a-> b)= P( b)P(B->一种)。
如果P(b)/ P(a)> P,则大都市算法基本上通过使P(a-> b)= 1来满足这一点。另外,1和P(a-> b)= P(b)/ P(a)。在我的(量子力学)系统中我使用P(a)〜| psi(a)| ^ 2,波函数平方(在统计力学应用中我猜我们会用P(a)~exp [-β* E]) 。在球体上使用此问题的问题是在角度空间{theta,phi} = {t,p}中从均匀分布获得的步骤如下:假设我们处于给定角度t的点(从北极沿z轴测量一个角度)。从表面元素dS = sin(t)dt dp我们看到,如果我们的随机角位移是Dt和Dp,则所选择的新试验点位于区域S = 4 * Dp * sin(Dt)* sin(t)内,所以选择给定点p_b的机会是~1 / S~1 / sin(t)。
除了评估| psi(a)| ^ 2之外,这个尝试给定点的概率当然会影响P(a-> b);事实上,我们看到它会将后者与sin(t)因子分开。因此,保持详细平衡的一种简单方法是乘以相同的:P(a-> b) - > P(a-> b)sin(t)其中t是粒子a的θ角。
这将恢复详细的平衡。另一个问题是这将如何影响收敛等,因为极点附近的粒子现在具有较小的步长但接受概率较大。