PBRT学习笔记:利用Monte Carlo算法模拟积分

Monte Carlo算法经常会被用来进行定积分的运算。在光线跟踪中,经常会有一些不定积分的运算,由于引入了场景、光源等诸多因素,这些积分很难通过分析模型计算出积分的结果。从而这些积分的运算必须通过其他的方式进行,而Monte Carlo算法刚好可以解决其中的诸多渲染积分,从而被广泛应用到光线跟踪算法中。
对于Monte Carlo算法本身,我现在了解的十分有限,所以不乱介绍了……
我们先来看一个最简单的Monte Carlo算法的例子吧。求一个单位圆的面积,结果很简单,就是π。当然这是前人的工作所总结的结果,计算方法有很多种,那么利用Monte Carlo算法是如何计算呢。其实很简单,就是以圆心为中心,做一个边长为2的正方形,这个单位圆正好和正方形内切。随即在正方形内部采样点,当采样数量为N,计算N个采样点中有多少是在圆的内部(这里用K表示),然后K/N就为圆与正方形的面积比例了,由于正方形的面积是4,所以圆的面积就是4*K/N。
上述计算为Monte Carlo的一个简单应用,那么下面我们看下Monte Carlo是如何应用来模拟定积分的。假设对于下列积分:
image首先,按照均匀分布,随即采样区域[a,b],记采样点为Xi,每个采样点的PDF值p(x)=1/(b-a)。利用Monte Carlo算法,上述积分可以模拟为:
image 当N趋近于无穷大的时候,我们认为两者的值是一致的,所以可以利用上述离散的方式模拟这个积分。其推倒方法并不难理解:
PBRT学习笔记:利用Monte Carlo算法模拟积分_第1张图片
上述方法就可以模拟定积分了,即在积分范围内采样,然后找到被积函数在采样点的值,通过上述计算就可以得到积分的近似值。当N越大的时候,这种逼近就越接近真实结果。
当然,在实际应用中,上述计算法方法虽然可以计算出正确的结果,但是收敛速度未必会很好。可能为了得到一个可以接受的结果,我们需要N的值特别特别大,从而带来了非常大的计算量。所以我们需要更好的方法来改进上述模拟过程,使得收敛速度提高。
事实上,我们在对于[a,b]进行采样的时候,完全没有必要进行均匀采样,这样做只是简单而已,我们可以根据一种概率分布来进行采样,从而使得某些区域的采样密度更大。加入采样点的概率分布函数(PDF)为P(x),那么我们可以利用如下公式计算定积分的值:
image 
可以看到,前面的均匀采样的公式无非就是p(x)=1/(b-a)的特例而已。上述公式可以理解为利用Monte Carlo模型进行定积分运算的一个基本模型。这个证明方法如下:
PBRT学习笔记:利用Monte Carlo算法模拟积分_第2张图片利用这种模拟方式,我们可以模拟光线跟踪中的诸多定积分运算,而这些定积分运算本身是很难通过理论模型进行计算的,其被积函数是没有原函数的,甚至被积函数中还包含着同样类似的积分。
无论利用何种PDF分布进行采样,理论上讲,我们都是可以得到正确的积分结果的,但是不同的PDF分布所带来的收敛速度差距是非常大的。所以PDF的选取对于定积分的模拟也是非常重要的,毕竟计算机的计算能力有限,而且采样点的多少直接线性影响了计算时间,所以一个好的PDF分布是至关重要的。
当PDF的形状接近于被积函数的时候,我们认为这种采样时候非常合适的。考虑最理想情况,PDF的形状和被积函数只差一个比例系数,即f(x)/p(x)=c,由此可以推出函数的积分即为c。那么即使仅仅取一个采样点,我们同样可以得到完全正确的结果。当然,这只是一种极端理想的情况。而且如果我们知道了被积函数的形状,很可能我们就可以通过理论分析模型计算出定积分的值了,而根本不用Monte Carlo算法了。

你可能感兴趣的:(算法,工作,c)