问题描述
双曲面有公式
-x^2/a^2 - y^2/b^2 + z^2/c^2 = 1。
如何在 Python 中从这个双曲面生成样本? (比如说,a=b=c=1。)
我想在 [0,1] 中随机选择 x 和 y,然后填写 z 值,使公式等于 1。但是这不会均匀采样。有没有更好的办法?
解决方法
这只是部分答案。
J.F. Williamson,“随机选择分布在曲面上的点”,医学与生物物理学 32(10),1987 年,描述了在参数曲面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将这种方法用于参数曲面,必须了解有关曲面的几件事,即——
x(u,v)
、y(u,v)
和z(u,v)
,它们是从二维坐标u
和v
生成三维坐标的函数,-
u
和v
的范围, -
g(point)
,表面上每个点的梯度范数(“拉伸因子”),以及 -
gmax
,整个表面g
的最大值。
算法为:
- 在曲面上生成一个点,
xyz
。 - 如果
g(xyz) >= RNDU01()*gmax
,其中RNDU01()
是 [0,1) 中的统一随机数,接受该点。否则,重复此过程。
对于参数为 a=b=c=1 的双曲面:
- 梯度为
[2*x,-2*y,2*z]
。 - 梯度范数的最大值为:
2*sqrt(3)
,如果x
、y
和z
都在区间[0,1]内。立>
剩下的就是将隐式公式转化为二维坐标u
和v
的函数的参数方程。我知道这个算法适用于参数化曲面,但我不知道如果我们在步骤 1 中“在 [0,1] 中随机选择 x 和 y,然后填写使公式相等的 z 值”,它是否仍然有效.