
털이 난 공 정리 (The Hairy Ball Theorem)
요약
3Blue1Brown의 영상을 통해 '털이 난 공 정리(The Hairy Ball Theorem)'의 개념과 수학적 증명을 다룹니다. 이 정리가 게임 개발 시 비행기 모델의 회전 방향을 결정하는 등 실질적인 기하학적 문제에 어떻게 적용되는지 설명합니다.
핵심 포인트
- 털이 난 공의 털을 모두 빗으려 해도 반드시 삐죽 솟은 지점이 존재함
- 위상수학적 정리를 통해 수학적 증명의 우아함을 보여줌
- 게임 개발 시 3D 모델의 궤적에 따른 회전(자유도) 정의에 활용 가능
영상: 털이 난 공 정리 (The Hairy Ball Theorem)
채널: 3Blue1Brown
길이: 29분 39초
출처: 자막 (수동, 영어)
스크립트:
[criblate.com에서 자막 수정을 제출하세요]
요즘 저는 제가 사랑하는 7개월 된 아기의 뒷머리를 볼 때마다, 이 작은 머리카락의 소용돌이를 보며 수학에서 가장 터무니없는 이름을 가진 사실 중 하나인 '털이 난 공 정리 (The Hairy Ball Theorem)'를 떠올리곤 합니다.
이것이 진정으로 진지한 수학적 사실임을 약속드립니다. 비공식적으로 이 정리의 내용은 이렇습니다. 만약 털로 덮인 공이 있고, 그 털을 차분하게 빗어 내리려고 한다면, 적어도 한 지점에서는 털이 삐죽 솟아오르지 않게 할 방법이 없다는 것입니다.
예를 들어, 어떤 축을 중심으로 모든 털을 시계 반대 방향으로 빗는다고 가정해 봅시다. 그러면 맨 위와 맨 아래에는 작은 소용돌이들이 생기게 되고, 그 소용돌이의 정중앙에 있는 털은 갈 곳이 없게 됩니다. 결국 삐죽 솟아오를 수밖에 없습니다.
머리카락을 어떻게 평평하게 펴려고 시도하더라도, 적어도 이와 같은 한 뭉치의 털이 남게 된다는 것은 수학적으로 보장된 사실입니다. 머릿속으로 이를 상상해 보는 것은 매우 즐거운 일입니다.
사실, 두 개의 문제 지점이 아닌 단 하나의 문제 지점으로 줄이는 것조차 꽤 도전적인 일입니다. 그것은 가능하며, 퍼즐을 좋아하신다면 어떻게 그것이 가능할지 직접 생각해 보시기를 권합니다. 이 영상의 뒷부분에서 저는 그것을 생각할 수 있는 적어도 한 가지 방법을 보여드릴 것입니다.
하지만 지금 당장은 더 절실한 질문이 있을 것이라 생각합니다. 수학자들이 왜 이런 솜털이 난 구체를 빗는 것에 관심을 갖는지 궁금하실 것입니다. 물론 정답은, 관심이 없다는 것입니다.
이 이름과 비공식적인 설명은 일종의 농담 섞인 표현입니다. 물론 저는 더 공식적인 정의를 공유할 것입니다. 사실 제가 이 영상을 만드는 진짜 이유는 수학을 사랑하는 사람이라면 누구나 즐거워할 만한, 매우 우아한 증명 방법을 공유하기 위해서입니다.
하지만 그전에, 처음에는 완전히 관련이 없어 보이는 맥락 속에서 이러한 솜털 같은 구(sphere)들이 실제로 자연스럽게 발생하는 상황의 예시를 통해 동기를 부여해 보겠습니다.
자, 당신이 게임 개발자라고 상상해 봅시다. 당신은 비행기의 3D 모델이 포함된 게임을 프로그래밍하고 있습니다. 당신이 원하는 것은 이 비행기가 따라갈 임의의 궤적(trajectory)—아마도 사용자가 정의한 무언가겠죠—을 설정하는 것이고, 당신의 임무는 비행기가 그 궤적을 따라 이동할 때 올바른 방향을 향하도록 하는 함수를 작성하는 것입니다.
예를 들어, 주어진 어떤 궤적 위의 특정 지점에 있다고 가정해 봅시다. 당신은 당연히 모델의 중심을 그 지점에 위치시키고 싶겠지만, 3D 공간에서 비행기가 어떻게 회전해야 하는지에 대해서는 모호함이 남습니다. 여기서 명백한 제약 조건은 비행기의 코(nose)가 경로의 접선 벡터(tangent vector)를 따라 향해야 한다는 것이지만, 그조차도 약간의 모호함을 남깁니다. 비행기가 이 코에서 꼬리로 이어지는 축을 중심으로 어떻게 회전할까요?
이 마지막 자유도(degree of freedom)를 정의하는 한 가지 방법은 왼쪽 날개 방향을 따라가는 이 수직 벡터(perpendicular vector)가 어디를 향하는지로 생각하는 것입니다. 이 비디오 게임의 프로그래머로서 당신의 과제는 주어진 궤적을 따라가는 모든 지점에서 그 수직 날개 방향이 무엇이어야 하는지를 찾아내는 것입니다.
물론 이를 수행하는 올바른 방법이 있긴 합니다. 궤적의 2계 도함수(second derivative)를 계산하여, 이것이 중력과 함께 날개에서 발생하는 양력(lift force)과 일치하도록 만드는 방법을 찾아내는 방식이죠. 하지만 지금 당장은 조금 복잡해 보일 수도 있습니다. 기지(resourceful)가 있으면서도 게으른 프로그래머인 당신은 이렇게 생각할지도 모릅니다. '이봐, 주어진 속도 벡터, 즉 비행기의 헤딩 방향(heading direction)에 수직인 날개 방향을 선택할 수 있는 적당한 방법은 없을까?'
여기 당신이 생각해 볼 수 있는 한 가지 방법이 있습니다. 이 비행기가 공간에서 향할 수 있는 모든 가능한 방식들, 즉 제가 빨간색으로 표시하고 있는 다양한 헤딩 방향들은 단위 구(unit sphere)의 점들을 구성합니다.
여러분이 원하는 것은 이 구(sphere) 위의 주어진 벡터를 입력받아,
그 벡터에 수직인 어떤 벡터를 반환하는 함수를 작성하는 것입니다.
제가 분홍색으로 색칠하고 있는 것들 말이죠.
유일한 실제 제약 조건은 이 연관 관계가 연속적(continuous)이어야 한다는 점입니다.
그렇지 않으면 평면의 방향이 급격하게 튀어버릴 수 있는데,
이는 게임 내에서 매우 명확한 글리치(glitch)가 될 것입니다.
그리고 다른 건 몰라도, 이것은 정말로 가능한 작업처럼 느껴집니다.
결국, 주어진 헤딩 방향(heading direction)에 대해 선택지가 부족한 것은 아니니까요.
선택할 수 있는 날개 방향은 무한히 많으며,
원 하나 전체에 달하는 옵션들이 있습니다.
그렇다면 구 위의 모든 점에 대해 연속적으로 변화하는
합리적인 선택을 만드는 것이 얼마나 어렵겠습니까?
제가 어디로 가고 있는지 눈치채셨을 겁니다.
이와 같이 수직인 방향을 선택하는 것은
해당 구의 점에 대한 단위 접벡터(unit tangent vector)를 선택하는 것과 동일합니다.
따라서 평면이 향할 수 있는 모든 가능한 방향에 대해 특정 수직 벡터를 할당한다면,
그것은 기본적으로 구 위의 모든 점에 접벡터(tangent vector)를 정의하는 것과 같습니다.
이제 이것은 조금씩 털이 난 공(hairy ball)처럼 보이기 시작합니다.
사실, 지금이 잠시 물러나서
털이 난 공 정리(hairy ball theorem)가 실제로 무엇을 말하는지
더 공식적으로 설명하기에 아주 좋은 시점입니다.
만약 여러분에게 구가 있고, 그 구 위의 어떤 점과
그 점에서의 구에 접하는 평면(tangent plane)을 선택한다면,
그 점에 뿌리를 두고 해당 평면 내에서 선택한 임의의 벡터를
구의 접벡터(tangent vector)라고 부릅니다.
만약 여러분이 구 위의 모든 점에 대해,
가능한 각 접평면에 대해 하나씩 접벡터를 할당한다면,
우리는 그것을 구 위의 벡터장(vector field)이라고 부릅니다.
그리고 이와 같이 벡터장(vector field)을 그릴 때는,
복잡함을 피하기 위해 벡터의 크기를 줄여서 표현하는 것이 항상 표준적인 방식입니다.
그리고 또 하나 명심해야 할 점은, 이와 같은 삽화가 구(sphere) 위의 유한한 점들에 뿌리를 둔 유한한 벡터 집합만을 필연적으로 보여주고 있더라도, 실제 벡터장 (vector field)은 연속적인 표면 위의 모든 단일 점에 대해 하나씩 존재하는 무한히 많은 벡터로 구성된다는 사실입니다.
따라서 오늘 우리의 주인공인 이 정리는, 만약 당신의 벡터장 (vector field)이 연속적(continuous)이라면, 즉 방향에 갑작스러운 도약(jump)이 없다면, 반드시 길이가 0인 벡터인 영벡터 (null vector)를 갖는 지점이 적어도 하나 존재해야 한다고 명시합니다.
예를 들어, 우리의 3D 모델 사례를 다시 살펴보겠습니다. 제가 그곳의 많은 애니메이션에서 사용했던 함수는 본질적으로 평면의 기수(nose)가 가능한 한 위쪽을 향하도록 유지하려고 시도하는 것이었습니다. 그리고 이 함수를 벡터장 (vector field)으로 표현할 때, 다시 말해 평면의 기수가 가질 수 있는 각 방향을 구 위의 한 점으로 간주하고, 그에 대응하는 날개 방향을 구의 해당 점에서의 접벡터 (tangent vector)로 간주한다면, 제가 사용했던 그 함수는 수직축을 중심으로 나선형으로 회전하는 벡터장 (vector field)을 생성한다는 것이 밝혀집니다.
이 방식은 대부분의 경우 실제로 충분히 합리적인 애니메이션을 보여주지만, 문제는 극점 (poles)에서 불연속성 (discontinuity)을 가진다는 점입니다. 따라서 제가 이 함수를 사용하여 평면이 수직 위쪽이나 수직 아래쪽을 향하게 만들 때마다, 해당 방향을 통과할 때 글리치 (glitch) 현상이 발생하게 됩니다.
만약 당신이 단순히 이것을 가지고 노는 프로그래머라면, 그런 글리치를 피하기 위해 무언가를 미세하게 조정할 수 있다고 생각할지도 모릅니다. 하지만 사실, 털이 난 공 정리 (Hairy Ball Theorem)는 당신이 아무리 영리하더라도 어떤 방향에서는 반드시 이러한 종류의 글리치가 발생할 수밖에 없음을 보장합니다.
따라서 견고한 (robust) 애니메이션을 위해서는 단순히 평면 기수의 방향만을 사용하여 전체 방향 (orientation)을 결정할 수 없습니다. 한 걸음 물러나서 속도 벡터 (velocity vector) 하나만 사용하는 것보다 궤적 (trajectory)으로부터 더 많은 정보를 포함시키는 방법 외에는 선택의 여지가 없습니다.
또 다른 예로, 지구상의 모든 지점, 예를 들어 어떤 일정한 고도에서의 풍속 (wind velocity)을 생각해 봅시다. 풍속이 연속적으로 변한다는 것은 꽤 합리적인 가정이며, 따라서 털이 난 공 정리 (Hairy Ball Theorem)가 적용되어야 합니다. 제가 여기서 애니메이션으로 보여주는 바람의 패턴은 기상학적 관점에서 보면 완전히 비현실적이지만, 핵심은 당신이 현실적이든 아니든 어떤 바람 패턴을 상상하든 간에, 털이 난 공 정리는 주어진 고도에서 지구상의 어느 한 곳에서는 반드시 풍속이 정확히 0이 되는 지점이 존재한다는 것을 보장한다는 점입니다.
이제, 아주 까다롭게 따지자면 대기는 3차원이므로, 지면과 평행한 풍속 성분이 0이라고 말하는 것이 더 정확한 진술일 것입니다. 바람이 수직 위나 아래로 불 수도 있겠지만, 그럼에도 여전히 이는 다소 직관에 어긋나는 일입니다.
조금 더 실용적인 예로는, 3차원 공간의 모든 방향에서 완전히 동일한 라디오 신호를 원하는 경우를 들 수 있습니다. 즉, 소스로부터 특정 거리만큼 떨어진 모든 사람이 모든 시간대에 동일한 위상 (phase)과 진폭 (amplitude)을 가진 동일한 라디오파를 수신하는 경우입니다. 이것이 합리적인 목표처럼 보일 수 있지만, 전자기파 (electromagnetic waves)에 대해 조금이라도 안다면, 전자기파는 두 개의 별개인 벡터장 (vector field), 구체적으로는 전기장 (electric field)과 자기장 (magnetic field)에서의 진동이라는 것을 알게 될 것입니다. 중요한 점은, 이 각 장의 진동 방향은 적어도 소스에서 멀리 떨어진 곳에서는 항상 전파 (propagation) 방향에 수직이라는 것입니다.
그것이 무엇을 의미하는지 생각해 보십시오. 소스로부터 주어진 거리에서, 이 두 장 중 하나는 구 (sphere) 위의 접벡터장 (tangent vector field)처럼 보이게 되며, 털이 난 공 정리에 따르면 해당 벡터장의 적어도 한 지점은 반드시 0이어야 합니다. 따라서 3차원 공간의 모든 방향에서 완전히 동일한 신호를 가질 수 있는 유일한 방법은 신호 자체가 0인 경우뿐이며, 이는 아마도 신호를 보내려는 목적 자체를 무색하게 만들 것입니다.
제가 이러한 예시들을 드는 이유는, 솜털이 난 구(fluffy spheres)에 관한 이 겉보기에 장난스러운 사실이 정말로 예상치 못한 곳에서 나타난다는 점을 말씀드리기 위해서입니다. 하지만 제가 이 영상으로 정말 하고 싶은 것, 제가 즐기고 싶은 것은 여러분이 순수 수학자(pure mathematician)가 하는 방식대로 이 아이디어를 탐구해 보도록 하는 것입니다. 먼저, 제가 처음에 언급했던 그 퍼즐은 사실 여러분의 사고력을 유연하게 확장하고, 당연하게 느껴지는 것이 항상 진실은 아니라는 점을 확인해 볼 수 있는 정말 좋은 방법입니다. 그러고 나서, 저는 이 정리(theorem)가 왜 참인지 설명해 주는 완전히 아름다운 증명(proof)을 공유하고 싶습니다.
자, 그럼 퍼즐로 넘어가 봅시다. 여러분은 어떨지 모르겠지만, 제가 직관(intuition)을 쌓기 위해 처음 이 아이디어를 머릿속으로 다루었을 때는, 단 하나의 영점(null point)으로 줄이는 것이 가능한지조차 전혀 자명하지 않았습니다. 제가 상상할 수 있는 대부분의 벡터장 (vector fields)에 대해서는, 적어도 한 방향으로 회전하는 소용돌이(swirl)가 하나 있고, 다른 방향으로 회전하는 소용돌이가 또 하나 있는 식이었으니까요. 혹은 어떤 지점에는 발산점(source)이 있고, 다른 지점에는 수렴점(sink)이 있을 수도 있죠. 이 때문에 서로 상쇄되어야 하는 반대되는 성질을 가진 최소 두 개의 서로 다른 영점이 필요하다는 보편적인 법칙이 있을 것이라고 제안하고 싶은 유혹이 강하게 듭니다. 마치 자석의 북극과 남극처럼 말이죠.
그럴듯한 생각이지만, 약간의 기발함을 발휘하면 단 하나의 영점만을 얻는 것이 가능합니다. 이를 정의하는 좋은 방법은 스테레오그래픽 투영 (stereographic projection)이라고 알려진 것을 사용하는 것입니다. 이 방식에서는 북극(north pole)을 제외한 구 위의 모든 점이 xy-평면 (xy-plane) 위의 고유한 점으로 매핑 (mapped)됩니다. 이 작동 방식은 매우 아름답습니다. 북극에서 빛이 비치고 있다고 상상해 보세요. 구 위의 어떤 점을 통과하는 모든 빛의 광선은 xy-평면의 단 하나의 점에만 닿게 됩니다. 그리고 그 반대 방향도 마찬가지입니다. xy-평면의 모든 점은 구 위의 고유한 점에 대응하며, 이는 그 평면이 북극을 제외한 구 위의 모든 점으로 매핑될 수 있음을 의미합니다.
이것은 수학자들이 즐겨 사용하는 매핑(mapping)이며,
여기서 우리가 이를 활용하는 방법은 xy-평면 위에 결코 0이 되지 않는 어떤 벡터장 (vector field)이 있다고 상상하는 것입니다.
이를 정의하는 것은 충분히 간단합니다.
항상 오른쪽으로 1단위만큼 가리키는 상수 벡터장 (constant vector field)을 취할 수도 있습니다.
만약 그 벡터장을 다시 구 위로 투영 (project)한다면,
이는 북극을 제외한 모든 곳에서 0이 아닌 무언가를 만들어냅니다.
인정하건대, 지금 제가 보여드리는 방식은 북극 주변에서 정확히 어떤 일이 일어나고 있는지 파악하기를 다소 어렵게 만듭니다.
기본적인 이유는 평면 위의 점들을 균일하게 샘플링할 경우,
이 투영 하에서 북극 주변의 점들이 무한히 조밀해지기 때문입니다.
그래서 제가 상황을 설명할 수 있는 두 번째 방법을 보여드리겠습니다. 참고로 이 방법은 제가 벡터장을 이와 같이 구 위로 투영한다는 것이 정확히 무엇을 의미하는지에 대해 더 엄밀한 정의 (rigorous definition)를 제공하기도 합니다.
평면 위에서 초당 1단위의 속도로 오른쪽으로 균일하게 흐르는 유체 (fluid)를 상상해 보고, 그 유체의 각 입자가 움직이는 동안 구 위로 투영된 모습이 어떠할지 생각해 보십시오.
구 위로 투영된 그 입자들의 속도 벡터 (velocity vectors)를 취한다면, 그것이 바로 제가 말하고 있는 벡터장을 정의하게 됩니다.
그리고 이것을 시각화하면
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube 3Blue1Brown (수학/ML)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기