티스토리 뷰

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) = \pi r^2 $$

 

이죠. 3차원 구의 부피는

 

$$ V(3) = \frac{4}{3} \pi r^3 $$

 

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

 

$$ V(n) = c r^n $$

 

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

 


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

 

$$d((x_1, x_2, ... x_n), (y_1, y_2, ... y_n)) = \sqrt{ \sum_{i=1}^{n} (x_i - y_i)^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) \cong 4.9342 r^4$$

$$ V(5) \cong 5.2686 r^5$$

$$ V(6) \cong 5.1727 r^6$$

$$ V(7) \cong 4.7218 r^7$$

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

 

 

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

 

- 게으른

 

'matlab' 카테고리의 다른 글

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