我想在MATLAB中創建一個計算R^n中的n球體積的函數。爲此,我使用Monte-Carlo方法在n立方體中隨機生成點,然後使用n球內的點與所有生成點相乘的比率乘以n立方體的體積。這裏是我迄今爲止產生的代碼:使用Monte-Carlo方法計算n球的體積
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
的數據依賴性外,它似乎很容易並行化?
我可以使用R來驗證一般的方法應該工作。你使用了什麼「半徑」?你知道['randi'](http://www.mathworks.de/de/help/matlab/ref/randi.html)返回*整數*嗎?你可能更喜歡['rand'](http://www.mathworks.de/de/help/matlab/ref/rand.html),你可以對它進行矢量化處理以放棄你的'for'循環。 – MvG
你的循環也不需要依賴'radius'。 'number_within_sphere'可以計算一個單位的n球。不要問兩個單獨的問題是個好主意。 – horchler