我正在尝试在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
?
答案 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是单位球,然后可以使用相同的算法来找到单位球的体积。