bg10.png
在渲染中,经常使用,读取或听到术语蒙特卡罗(通常缩写为MC)。但是这是什么意思?事实上,既然你花了相当多的时间来回顾统计和概率的概念,你就会意识到(它可能是一种欺骗)它所指的是实际上是一个非常简单的想法。无论多么简单,它功能强大且具有一些有趣的特性,使其对解决各种问题非常有吸引力。简而言之,蒙特卡罗方法指的是一系列统计方法,主要用于找到事物的解决方案,例如计算函数的期望值,或者集成无法通过分析方式集成的函数,因为它们没有封闭形式例如解决方案(我们在着色介绍中已经提到了这个术语)。统计方法的意思是他们使用类似于我们在最后几章中详细研究的那些采样技术来计算这些解决方案。为什么我们说蒙特卡罗方法呢?仅仅因为可以使用相同的原理来解决不同的问题,并且这些问题中的每一个都与不同的技术或算法相关联。所有这些算法的共同点是它们使用随机(或随机)采样。如俄罗斯数学家Sobol所述:蒙特卡罗方法是通过随机抽样(或通过随机变量的模拟)解决数学问题的数值方法。
MC方法都共享使用随机抽取的样本来计算给定问题的解决方案的概念。这些问题通常分为两大类:模拟: 蒙特卡罗或随机抽样用于运行模拟。如果你想计算从A点到B点所需的时间,考虑到一些条件,例如你的旅程会下雨或者会下雪的可能性,那么会有交通拥堵的可能性,您将不得不停下来获取燃气等等。您可以在模拟开始时设置这些条件并运行模拟1,000次以获得估计的时间。像往常一样,运行或试验次数(此处为1,000)越高,您的估计值越高。
整合: 这是一种对数学家有用的技术。在“着色简介”一课中,我们在“着色数学简介”一章中学习了如何使用黎曼和技术计算简单积分。由此可以简单地说,随着积分的尺寸增加,这种方法在计算上可能非常昂贵。虽然MC集成虽然没有与积分的实际解决方案具有最大收敛速度,但可以为我们提供一种以“更便宜”的计算成本获得合理接近结果的方法。
但是,让我们重新说明这一点,以强调一些对这种方法非常重要的东西(实际上它真正和根本上令人兴奋和美丽)。如果您使用的样本越多,MC方法越接近实际解决方案,因为我们使用随机样本,MC方法也可以“只是”随机地随机地落在精确值上。换句话说,运行单个MC仿真或集成有时会提供正确的解决方案。然而,在大多数情况下它不会,但平均这些结果仍然会收敛到确切的解决方案(我们已经在前面章节中了解了这个和大数定律)。
例如,考虑到有关一周和一天的天气和时间的一些条件,您将从A行进到B,我们的第一次模拟给出了1小时32分钟的时间。现在让我们说,我们使用完全相同的条件运行的其他1,000,000,000,000次模拟中没有一个给出了这个数字,但是当我们得到1小时32分钟的平均结果时。换句话说,你的第一个模拟给了你似乎是你的问题的实际解决方案(你可能期望一万亿次模拟的平均值非常接近)。当然,你不知道只有一次试验才得到正确的答案,但这是方法的一个很大的特点:我们很少有样本,有时,你可能会得到精确或非常接近的确切解决方案。
然而,在MC方法的力量也是他们的主要弱点。如果偶然你有时只用少量样本得到正确或接近正确的解决方案,你可能在其他时候也不走运,并且在接近正确的答案之前需要大量的样本。通常,MC方法的收敛速度(随着样本数量的增加,MC方法收敛到正确结果的速率)非常低(并不差)。我们将在本章中再次讨论这个问题。这是您需要记住的MC方法的另一个重要特征。
蒙特卡洛方法
我们将在下一章详细介绍每种技术(蒙特卡罗模拟和集成),并提供MC方法实际用于电脑图形,特别是渲染领域的示例。但是,在我们谈到这一点之前,通过一个简单的例子介绍这个概念很有用也很容易。想象一下,我们想要估计任意形状的面积,例如我们在图1中绘制的面积。我们所知道的是包含这种形状并由边界ac和ab定义的矩形区域。因为这些边界定义了一个简单的矩形,所以我们知道这个矩形的面积
Ashape≈NhitsNtotal×A where A=ab×ac.Ashape≈NhitsNtotal×A where A=ab×ac.
这是一个非常基本而简单的例子,说明了如何使用随机抽样来解决特定问题(这个设备实际上最初由von Neumann自己开发,你可以在本章末尾的照片中看到)。应该注意一些事情。当然,我们使用的样本越多,估计就越好。同样重要的是要注意,矩形区域上的样本分布必须是均匀的。如果由于某种原因,更多的点落在矩形的某个区域内(如图2所示,当我们到达图的中心时样本的密度增加),那么结果将是有偏差的(即,结果将是通过某种偏移与真正的解决方案不同)。我们将在下一课中看到重要性抽样,统一抽样不是使用MC方法的绝对条件。当我们知道使用非均匀分布时,我们可以通过其他方法补偿它通常会引入的偏差。为什么我们会对使用非均匀采样感兴趣呢?因为,正如我们将在下一课重要性抽样中看到的那样,这可以用作方差减少技术。如前几章所述,差异是衡量我们的估计与真实解决方案之间误差的指标。在MC方法中,可以减少方差的唯一蛮力和最明显的方法是增加N
,样本总数。然而,一些其他方法涉及生成随机样本的方式(参见本课结尾的准或伪随机数章节)和重要性采样(使用非均匀采样分布)也可用于减少方差。然而(在我们研究这些更先进的方法之前),请记住,基本或天真的蒙特卡罗方法要求样本均匀分布。请记住,如果随机数的所有可能结果具有相同的概率(称为等概率性质),则该随机数具有均匀分布。 作为一个实际例子,假设我们想要使用命中或未命中蒙特卡罗方法估计单位磁盘的面积。我们知道单位圆盘的半径是1,因此单位圆被刻在长度为2的正方形内。我们可以在该正方形内生成样本并计算落在磁盘内的点数。为了测试点在磁盘的内部(击中)或外部(未命中),我们只需要测量样品距离原点(单位圆盘的中心)的距离,并检查该距离是否小(或等于)比磁盘半径(单位磁盘等于1)。请注意,因为我们可以将磁盘划分为四个相等的部分(或象限),每个部分以单位正方形(图3)为单位,我们可以将此测试限制为单位平方并将得到的数字乘以4。为了计算单位圆盘四分之一的面积,我们然后简单地将总点击数(图7中的绿点)除以样本总数,并将该比率乘以单位平方的面积(相等)到1)。以下C ++代码实现了此算法:
此代码使用随机C ++ 11随机库中的函数,使用给定的随机数生成器生成随机数(有关在电脑上生成随机数的更多信息,请参阅本课程的下一章)和给定的 概率分布(在这种情况下,均匀分布)。 查看文档以获取有关这些C ++ 11库的更多信息(到2013年,C ++ 11是C ++编程语言标准的最新版本)。
如果你编译并运行这个程序,你应该得到:
001
002
003
clang++ -o pi -O3 -std=c++11 -stdlib=libc++ pi.cpp
./pi 1000000
Area of unit disk: 3.141864 (785466)
正如您所看到的,我们非常接近确切的解决方案(即π因为单位圆的面积是A =πR2和R = 1),当你增加样本数量(你可以作为程序的参数)时,估计值会越来越接近这个数字(如预期的那样)。 如果您过去使用过3D应用程序,那么您可能已经使用过随机抽样,可能不知道它。 通过这个程序(以及接下来的程序),你现在可以实际上说你不仅知道MC方法是什么,而且还实现了你自己的实际例子来说明这种方法。

