티스토리 뷰

matlab

n차원 구의 부피는?

게으른 the lazy 2023. 8. 7. 17:57

위키피디아

 

 

n차원 구의 부피는 어떻게 계산할까요? 어...음... n차원 구가 무엇인지부터 말을 할 수 있어야겠군요.

 

3차원 구는 3차원 공간의 점들 중 어떤 한 점에서 떨어진 거리가 어떤 고정된 상수인 점들의 집합입니다. 3차원 단위구는 한 점에서 떨어진 거리가 1인 점들의 집합이죠. 그렇다면 2차원 구는 한 점에서 떨어진 거리가 어떤 고정된 상수인 2차원 공간의 점들의 집합이라고 볼 수 있겠군요. 네, 원입니다.

 

위키피디아

 

이 개념을 n차원으로 확장하지 못할 이유는 없습니다. n차원 구는 n차원 공간의 점들 중 어떤 한 점에서 떨어진 거리가 고정된 상수인 점들의 집합이고, n차원 단위구는 이 거리가 1인 점들의 집합일 겁니다.

 

2차원 구(원)의 부피는

 

V(2)=πr2

 

이죠. 3차원 구의 부피는

 

V(3)=43πr3

 

입니다. 오호라. 패턴이 보이는군요. n차원 구의 부피는 왠지 아래처럼 생겼을 것 같습니다.

 

V(n)=crn

 

c는 어떤 상수일텐데, 이 상수가 n에 따라 어떻게 변할지가 궁금해집니다. 부피가 무엇인가에 대한 고민도 동반되어야 하긴 하겠으나, 수학 얘기는 자세히 하지 않겠습니다. 사실 저도 몰라요.

 


앞에서 '거리'라는 단어를 자연스럽게 사용했습니다. 사실 두 점 사이의 거리를 정의하는 방법도 한 가지가 아닙니다. 하지만 자연스럽게 은근슬쩍 유클리드 거리만 생각합시다.

 

d((x1,x2,...xn),(y1,y2,...yn))=i=1n(xiyi)2

 

그렇다면 매트랩을 이용해서 n 차원 공간의 임의의 두 점 간의 거리를 계산 못할 이유도 없겠네요. 사실 이미 함수가 있습니다. norm을 이용하면 됩니다. (pdist도 있습니다.)

 

>> x = [1, 2, 3, 4];
>> y = [4, 3, 2, 1];
>> norm(x-y)
ans =
       4.4721
>> sqrt(sum((x-y).^2))
ans =
       4.4721

 

아하? 그렇다면 매트랩으로 n차원 구의 부피를 계산할 수 있을까요?

 


 

원주율을 계산하는 방법은 여러 가지가 있는데, 그 중 재밌는 방법을 하나 소개합니다. 몬테 카를로 시뮬레이션을 돌리는 건데... 자세한 내용은 아래 영상을 보시죠.

 

 

이 아이디어를 차용하도록 하죠. n차원 공간의 각 축 좌표가 [1,1] 범위로 정의되는 어떤 공간을 생각해봅시다. 2차원이면 정사각형, 3차원이면 정육면체겠네요. 이 공간에 랜덤하게 점을 뿌리고 그 중 거리가 1보다 작은 점의 개수를 세어보는 겁니다.

 

order = 1:23; % 2^order개만큼의 점을 생성

ndim = 4; % 4차원

vol_ndim = zeros(size(order));

for n=1:length(order)
    N = 2^n; % 전체 점 개수
    r = rand([N, ndim])*2 - 1; % ndim 차원에 점 생성
    
    radius = vecnorm(r');
    vol_ndim(n) = sum(radius<=1)/N*2^ndim;
    fprintf('vol. of %2d-dim sphere (2^%d points) = %6.4f R^%d\n', ...
        ndim, n, vol_ndim(n), ndim)
end

 

vecnorm은 2차원 행렬의 각 column의 norm을 계산하는 함수입니다. 위 코드처럼 for문을 통해 n차원 공간에 뿌릴 점의 개수를 점점 늘려가면 언젠가 단위구에 들어간 점의 비율이 수렴하지 않을까요?

 

plot(order, vol_ndim)
xlabel('dimension')
ylabel('ratio of points with dist<=1')
set(gca, 'FontSize', 14)

 

 

수렴했네요. 수렴값은 4.934 정도입니다. 같은 방식으로 5, 6, 7차원에 대해 코드를 돌려봤더니,

V(4)4.9342r4

V(5)5.2686r5

V(6)5.1727r6

V(7)4.7218r7

라는 값들이 나왔군요. 사실 정확한 값이 이미 계산되어 있습니다. 아래는 위키피디아에 나온 표입니다.

 

 

매트랩 계산 결과와 꽤 비슷한 값이 나왔습니다. 점을 더 많이 찍으면 더 정확한 값이 나오겠으나, 정확한 값이 있는데 굳이 그럴 필요는 없겠습니다. 단지 이 방식이 동작한다는 걸 확인했으면 충분한거죠.

 

- 게으른

 

'matlab' 카테고리의 다른 글

fprintf에 세미콜론이 없어도 되는 이유  (0) 2023.09.05
함수 핸들 이해하기  (0) 2023.08.31
숫자를 통화 표기로 바꾸기  (0) 2023.08.02
매트랩 숫자야구  (0) 2023.03.07
행렬식이 평행사변형의 면적이라고?  (0) 2023.03.03
댓글