R^n의 n 볼의 볼륨을 계산하는 MATLAB에서 함수를 생성하려고합니다. 이를 위해 저는 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
그러나 이것은 매우 부정확 한 것으로 보입니다. Wikipedia에 따르면, 단위 10 구슬의 부피는 다음과 같아야합니다. V_10 = pi^5/5! = 2.5502, 그러나 1000000 반복으로 함수를 실행하면 11.0067을 반환하지만 실제로 여러 번 실행하면 항상 11보다 큰 값이 반환됩니다.
또한 GPGPU 프로그래밍을 사용하여이 기능의 성능을 향상시키는 방법이 있습니까? number_within_sphere
의 데이터 종속성을 제외하고는 쉽게 병렬 처리가 가능합니까?
R을 사용하여 일반적으로 접근법이 작동한다는 것을 확인할 수있었습니다. 'radius'에 무엇을 사용 했습니까? ['randi'] (http://www.mathworks.de/de/help/matlab/ref/randi.html)가 정수 *를 반환한다는 것을 알고 계십니까? ['rand'] (http://www.mathworks.de/de/help/matlab/ref/rand.html)를 선호 할 수도 있고, 그것을 내부적으로'for' 루프를 만들도록 벡터화 할 수도 있습니다. – MvG
또한 루프는 '반지름'에 의존 할 필요가 없습니다. 'number_within_sphere'는 유닛 n-ball에 대해 계산 될 수 있습니다. 두 가지 질문을하지 않는 것이 좋습니다. – horchler