用Monte-Carlo方法计算n球的体积

时间:2014-01-20 17:47:42

标签: matlab math parallel-processing montecarlo

我正在尝试在MATLAB中创建一个函数来计算R ^ n中n球的体积。为此,我使用Monte-Carlo方法在n-cube中随机生成点,然后使用n-sphere内的点与所生成的所有点的比率乘以n-cube的体积。这是我到目前为止生成的代码:

function [ approximate_volume ] = MonteCarloHypersphereVolume( radius, dimension, number_of_generations )
%MonteCarloHypersphereVolume Computes the volume of a
%'dimension'-dimensional hypersphere by the Monte Carlo method

number_within_sphere = 0;
parfor i = 1 : number_of_generations
    randoms = zeros( 1, dimension );
    for j = 1 : dimension 
        randoms(j) = randi(radius * 2) - radius;
    end

    if sum( randoms .^ 2 ) <= radius^2
        number_within_sphere = number_within_sphere + 1;
    end
end

approximate_volume = (number_within_sphere/number_of_generations) * (2*radius)^dimension;

end

但是,这似乎非常不准确;根据维基百科,单位10球的体积应为:V_10 = pi ^ 5/5! = 2.5502,但是当运行1000000次迭代的函数时它返回11.0067,确实多次运行它总是返回一个大约11的值,这比应该的值高得多吗?

此外,有没有办法使用GPGPU编程来提高此功能的性能?除了对number_within_sphere

的数据依赖之外,它似乎很容易并行化

2 个答案:

答案 0 :(得分:2)

您必须使用rand而不是randi来对每个维度进行连续均匀分布。也就是说,替换行

randoms(j) = randi(radius * 2) - radius;

通过

randoms(j) = rand*radius*2 - radius;

答案 1 :(得分:2)

这种方法不能扩展,因为n维单位球的体积与n维立方体[-1,1] ^ n的体积之比趋于零指数快(因此几乎每个随机点内部)单位立方体将位于单位球之外;例如,对于n = 30,立方体的体积比球的体积大约5 * 10 ^ 13倍。

相反,人们应该在这里使用多项式复杂度蒙特卡罗算法来找到凸体的体积,例如在

中所描述的

http://www.cs.berkeley.edu/~sinclair/cs294/n16.pdf

然而,在写下来的形式中,人们已经假定了音量的公式 n维球(我们需要知道文本中B_0的体积)。 然而,可以采用如文本中增加同心球的序列而不是增加具有相似属性的立方体的序列(第一个立方体是刻在单位球中的立方体,最后一个是[-1,1] ^ n,并且连续立方体的边之间的比率是(最多)1 + 1 / n),凸体K是单位球,然后可以使用相同的算法来找到单位球的体积。