我想生成位于n维环面上的随机点。我找到了如何在3-dimensional torus:
表面上生成点的公式x = (c + a * cos(v)) * cos(u)
y = (c + a * cos(v)) * sin(u)
z = a * sin(v)
u,v∈[0,2 * pi]; c,a> 0
我现在的问题是:如何将此公式扩展到n维。对此事的任何帮助将不胜感激。
答案 0 :(得分:1)
我猜你可以递归地做到这一点。从矢量空间的完整标准正交基础开始,并将当前位置作为原点。在每个步骤中,选择由前两个坐标向量跨越的平面中的点,即取w1 = cos(t)* v1 + sin(t)* v2。移动其他基矢量,即w2 = v3,w3 = v4,....也可以从w1方向的当前位置向前迈出一步,并在前面选择半径r1。当你只剩下一个基础向量时,那么当前点就是最外层递归调用的n维环面上的一个点。
请注意,虽然上述内容可用于随机选择点,但不会统一选择它们。这可能是一个更难的问题,你绝对应该在Math SE或者Cross Validated (Statistics SE)上询问数学问题,以便在你担心实施之前得到正确的数学。
答案 1 :(得分:0)
n圆环(n是圆环表面的维数;百吉饼或圆环因此是2圆环,而不是3圆环)是n矩形的平滑映射。解决这个问题的一种方法是在矩形上生成点,然后将它们映射到环面上。除了弄清楚如何将矩形映射到圆环上的问题(我现在还不知道),存在这样的问题:即使点的分布是圆的,圆环上的点的分布也是不均匀的。矩形上的均匀。但必须有一种方法来调整矩形上的分布,使其在圆环上均匀。
答案 2 :(得分:0)
仅均匀地生成u
和v
并不一定要从圆环表面均匀采样。需要额外的步骤。
J.F。威廉姆森(Williamson),“随机选择分布在曲面上的点”,物理学与生物学 32(10),1987年,描述了一种选择参量表面上均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将这种方法用于参数化曲面,必须了解该曲面的几件事,即
x(u, v)
,y(u, v)
和z(u, v)
,它们是从二维坐标u
和v
生成3维坐标的函数,< / p>
u
和v
的范围,
g(point)
,表面上每个点的梯度范数(“拉伸因子”),以及gmax
,整个表面的最大值g
。对于您在问题中给出的带有参数化的3维环面,g
和gmax
如下:
g(u, v) = a * (c + cos(v) * a)
。gmax = a * (a + c)
。在环面半径为c
和管半径为a
的3维环面的表面上生成均匀随机点的算法如下(其中RNDEXCRANGE(x,y)
返回一个数字[x,y)
和RNDRANGE(x,y)
中的数字返回[x,y]
中的数字):
// Maximum stretch factor for torus
gmax = a * (a + c)
while true
u = RNDEXCRANGE(0, pi * 2)
v = RNDEXCRANGE(0, pi * 2)
x = cos(u)*(c+cos(v)*a)
y = sin(u)*(c+cos(v)*a)
z = sin(v)*a
// Norm of gradient (stretch factor)
g = a*abs(c+cos(v)*a)
if g >= RNDRANGE(0, gmax)
// Accept the point
return [x, y, z]
end
end
如果您具有n维圆环生成公式,则可以使用类似的方法在该圆环上生成均匀的随机点(如果梯度范数等于或超过[0,{{ 1}}),其中gmax
是最大梯度范数。