双曲面的采样点

问题描述

双曲面有公式

-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),它们是从二维坐标uv 生成三维坐标的函数,

  • uv 的范围,

  • g(point),表面上每个点的梯度范数(“拉伸因子”),以及

  • gmax,整个表面g的最大值。

算法为:

  1. 在曲面上生成一个点,xyz
  2. 如果 g(xyz) >= RNDU01()*gmax,其中 RNDU01() 是 [0,1) 中的统一随机数,接受该点。否则,重复此过程。

对于参数为 a=b=c=1 的双曲面:

  • 梯度为 [2*x,-2*y,2*z]
  • 梯度范数的最大值为:2*sqrt(3),如果xyz都在区间[0,1]内。立>

剩下的就是将隐式公式转化为二维坐标uv的函数的参数方程。我知道这个算法适用于参数化曲面,但我不知道如果我们在步骤 1 中“在 [0,1] 中随机选择 x 和 y,然后填写使公式相等的 z 值”,它是否仍然有效.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...