공간 곡선: 화살표 사슬을 3차원으로
지금까지 펜은 종이 위에 있었다. 드론 불빛 공연이 밤하늘에 그리는 자취, 철사로 꼰 매듭, 로봇 팔 끝이 지나는 자취는 공간 곡선이다. 자리가 x, y, z 세 값이라 복소수 하나에 담기지 않는다. 복소수가 평면의 화살표였으니 공간에서는 막히는 걸까, 아니면 평면에서 한 일을 그대로 공간으로 넓힐 길이 있을까?
역사: 기울인 주전원
프톨레마이오스의 체계도 평면에 머물지 않았다. 행성은 해가 지나는 길(황도)에서 조금씩 위아래로 벗어나는데, 『알마게스트』는 이 벗어남(위도)까지 다루었다. 핸슨은 「주전원 천문학의 수학적 힘」의 끝에서 이렇게 짚었다. 지금까지의 그림이 모두 평면에 있었던 것은 「기술적인 한계일 뿐」이고, 주전원이 도는 축을 기울이기만 하면 평면에 수직인 움직임도 쉽게 얻는다. 같은 증명을 조금 넓히면 유한 개의 주전원으로 점을 정육면체나 피라미드의 겉면 위로 움직이게 할 수도 있다는 것이다.
삼잎 매듭은 타원 셋
세 성분을 하나씩 따로 보자. x(t)는 실수 하나가 되풀이되는 함수라서 실수 푸리에 급수로, 다시 말해 주파수 k와 −k인 화살표 짝들로 적힌다. 실수 함수에서는 c₋ₖ가 cₖ의 켤레라서, 짝 하나는 2 Re(cₖ eikt) = aₖ cos kt + bₖ sin kt로 묶인다. y(t), z(t)도 같다. 같은 주파수 k의 세 성분을 한데 모으면 aₖ와 bₖ는 숫자가 아니라 공간의 벡터가 되고, aₖ cos kt + bₖ sin kt는 두 벡터 aₖ, bₖ가 펼치는 평면 위의 타원을 시간 2π 동안 k바퀴 돈다. 공간의 에피사이클은 기울어진 타원들의 사슬이다.
가장 유명한 매듭인 삼잎 매듭으로 해 보자. 이 매듭은 x = sin t + 2 sin 2t, y = cos t − 2 cos 2t, z = −sin 3t로 그릴 수 있다. 식에 이미 주파수 1, 2, 3만 있으므로 타원도 셋이면 끝나는데, 계산하면 다음과 같다.
| 주파수 k | aₖ | bₖ | 모양 |
|---|---|---|---|
| 1 | (0, 1, 0) | (1, 0, 0) | 수평면(xy 평면)의 반지름 1 원 |
| 2 | (0, −2, 0) | (2, 0, 0) | 수평면의 반지름 2 원, 주파수 1 의 원과 반대 방향 |
| 3 | (0, 0, 0) | (0, 0, −1) | 위아래로 1만큼 오르내리는 선분(납작한 타원) |
타원 하나로 되살리면 원래 매듭과의 가장 큰 거리 오차가 1.414, 둘이면 1.000, 셋이면 0이다. 수평면의 두 원이 반대로 돌며 세 잎 모양을 그리고, 셋째 타원이 한 바퀴에 세 번 오르내리며 잎이 겹치는 곳에서 한 가닥을 위로, 다른 가닥을 아래로 보내 매듭을 만든다.

모서리가 있는 공간 곡선은 평면에서처럼 타원이 많이 필요하다. 핸슨이 말한 정육면체로, 한 변 2인 정육면체의 모서리 여섯 개를 지나는 닫힌 길을 같은 간격 1024점으로 뽑아 보았다. 큰 타원 1개면 원래 길과의 평균 거리 오차가 한 변의 15.08%, 3개면 2.36%, 10개면 0.35%, 30개면 0.05%다. 살아남는 주파수는 1, 3, 5, 7, … 홀수뿐이다.
곡선의 차원이 2에서 3으로 늘어도 바뀐 것은 계수 하나가 품은 숫자의 개수뿐이다. 평면에서는 주파수마다 복소수 하나였고, 공간에서는 복소수 셋, 다시 말해 실수 벡터 두 개(aₖ, bₖ)다. 이렇게 주파수마다 성분 수만큼의 숫자를 모은 것을 계수 벡터 (주파수마다 모은 성분별 계수 / vector-valued Fourier coefficient)라 하자. 곡선이 몇 차원 공간에 있든 「주파수마다 계수 벡터 하나」라는 틀은 그대로이고, 계수를 구하는 평균 내기도 성분마다 똑같다.
ML에서: 로봇 팔의 궤적을 계수 몇 개로
로봇 팔 끝이 1초 동안 지나는 길도 공간 곡선이다. 언어 모델처럼 토큰을 하나씩 내놓는 로봇 제어 모델은 이 궤적을 토큰으로 바꿔야 하는데, 칸마다 자리를 그대로 토큰으로 만들면 이웃한 칸끼리 값이 거의 같아 토큰이 많고 쓸모없이 겹친다. 퍼치(Karl Pertsch)와 동료들의 FAST(2025)는 궤적을 성분마다 이산 코사인 변환으로 계수로 바꾸고, 계수를 반올림한 뒤 자주 나오는 묶음을 합쳐(BPE) 토큰으로 만들었다. 부드러운 팔 동작은 느린 물결 몇 개의 계수가 크고 나머지는 작으므로 토큰 수가 크게 준다. 도는 화살표 대신 왜 굳이 코사인만의 꼴을 썼는지는 아래 문제 14와 15에서 따진다.
문제 13. 회전 그네
회전 그네의 의자는 반지름 5 m 원을 20초에 한 바퀴 시계 반대 방향으로 돌면서, 한 바퀴 동안 두 번, 가운데 높이에서 위아래로 1 m까지 오르내린다(높이 sin 2t m). (가) 의자의 자리를 타원의 사슬로 적으면 주파수마다 어떤 타원이 있는가? (나) 의자가 가장 높을 때는 출발 뒤 몇 초이고 그때 방위각은? (다) 한 바퀴에 지나는 길이는 평평한 원보다 얼마나 긴가?

(가)는 수평으로 원을 도니까 주파수 1이고, 오르내림은 따로 위아래 주파수 2요. 근데 오르내림은 타원이 아니라 선분이잖아요.

삼잎 매듭의 주파수 3인 타원은 어땠죠?

아, 그것도 위아래 선분이었어요. 한쪽 벡터가 0인 납작한 타원이요.

그럼 주파수마다 두 벡터를 적어 보면?

주파수 1은 a = (5, 0, 0), b = (0, 5, 0)인 원이고, 주파수 2는 a = 0, b = (0, 0, 1)이에요.

(나)는 sin 2t = 1인 2t = π/2, 5π/2니까 t = π/4, 5π/4. 20초에 2π라서 2.5초와 12.5초, 방위각 45°와 225°야.

(다)는요?

32.64 m예요. 평평한 원 31.42 m보다 1.22 m 길어요. 어, 생각보다 조금이네요.

+1 m와 −1 m 사이를 두 번 오가면 위아래로만 8 m 움직인 건데?

응, 위아래로 8 m인데 길이는 1.22 m만 늘었어. 그냥 더하면 안 되나 봐.

위아래로 8 m를 움직이는 동안 옆으로는 얼마나 가죠?

31 m쯤이요. 아, 위아래 8 m를 옆으로 가는 31 m에 나눠 실으니까 길이 조금씩만 비스듬해지는 거예요.

회전 그네 탈 때 위아래로 움직이는 게 별로 안 크게 느껴지던 게 이거였네요.
문제 14. 닫히지 않은 나선
한 바퀴 돌며 1만큼 오르는 나선 x = cos t, y = sin t, z = t/2π (0 ≤ t < 2π) 를 같은 방법으로 타원 사슬로 적는다. (가) z 성분의 화살표 길이 |ck| 는 k = 1, 2, 3, … 에서 어떻게 줄어드는가? (나) 타원 3개, 10개, 30개로 되살린 z 와 원래 z 의 가장 큰 차이는? (다) 이 나선에서 무엇이 「닫힌 곡선」이라는 조건을 어겼고, 어떻게 하면 계수가 빨리 줄게 할 수 있는가?

z = t/2π는 그냥 직선인데요. 화살표는 하나만 있으면 되겠죠.

급수는 곡선이 시간 2π마다 되풀이된다고 봐요. z를 2π 너머까지 되풀이해 그리면 어떤 모양이죠?

0에서 1까지 오르고 다시 0으로 뚝 떨어지고… 톱니 모양이에요. 끝에서 끊기네요.

끊긴 곳이 있으면 화살표가 몇 개나 필요할까요?

많이 필요하겠죠. 계산하면 |ck|가 0.1592, 0.0796, 0.0531로 1/(2πk)예요. 1/k로밖에 안 줘요.

(나)는 타원 3개, 10개, 30개에서 원래 z와의 가장 큰 차이가 0.497, 0.490, 0.470이야. 타원을 늘려도 거의 안 줄어.

곡선 전체가 다 그렇게 안 맞아?

아니, 가운데 절반에서는 0.056, 0.019, 0.007로 잘 줄어드는데, 끊긴 곳 근처에서 되살린 z가 0과 1의 중간쯤을 지나가 버려. 30개일 때 되살린 z의 가장 큰 값은 1.073이라 끝에서 넘치기도 하고.

그래요. 「닫힌」이라는 조건을 빼면 끝과 처음 사이가 끊긴 곡선이 되고, 끊긴 곳은 계수를 1/k로 느리게 만들어요. (다)는요?

끊긴 데를 없애면 되겠네요. 처음과 끝을 잇는 직선, 여기서는 z = t/2π 자체를 먼저 빼 보면… 남는 값이 0이에요. 끊긴 데가 없어요.

뺀 직선은 어떻게 해?

직선 하나는 따로 적고 나머지만 급수로 펼치면 돼. 아니면 구간을 거울에 비춰 이어 붙여서 되풀이해도 끊기지 않게 할 수 있고.

반복 재생하는 짧은 영상도 마지막 장면에서 첫 장면으로 넘어갈 때 툭 튀면 어색하잖아요. 그 튀는 곳을 없애려면 처음과 끝을 맞춰야 하고요.
문제 15. 로봇 팔 궤적을 계수 몇 개로
로봇 팔 끝이 1초 동안 앞으로 30 cm, 옆으로 살짝 비켜 갔다 돌아오고, 위로 5 cm 오르면서 가운데에서 8 cm 들린다. 이 궤적을 50칸으로 적고 성분마다 계수를 몇 개만 남긴다. (가) 복소 푸리에 급수에서 주파수 0…3 만 남기면(성분마다 실수 7개) 원래 궤적과의 가장 큰 거리 오차는 몇 cm인가? 주파수 0…6 이면? (나) 코사인만으로 적는 이산 코사인 변환에서 계수 4개, 7개를 남기면? (다) 왜 차이가 나는가? FAST 가 코사인 꼴을 고른 이유와 이어서 말하라.

(가)는 주파수 0…3이면 가장 큰 거리 오차가 12.90 cm, 0…6이면 11.10 cm요. 계수를 거의 두 배로 늘렸는데 별로 안 나아져요.

(나)는 코사인 계수 4개면 1.66 cm, 7개면 0.62 cm야. 숫자는 더 적게 쓰는데 훨씬 잘 맞아.

처음 칸과 끝 칸의 자리를 봐요.

처음은 (0, 0.01, 0.3) cm, 끝은 (30, 0.01, 5.2) cm예요. 앞으로 30 cm 갔으니까 처음과 끝이 안 맞아요. 문제 14의 닫히지 않은 나선이랑 같아요.

그럼 복소 푸리에 급수한테는 끝에서 처음으로 30 cm 뚝 떨어지는 톱니로 보이겠네.

그래서 계수가 느리게 줄었구나.

그런데 코사인 꼴은 같은 궤적에서 잘 맞았어요. 나선 문제에서 끊긴 곳을 없애는 방법이 두 가지 나왔죠?

직선 빼기하고 거울 비추기요. 아, 코사인 꼴은 구간을 거울에 비춰 이어 붙인 것처럼 되풀이하니까 끝과 처음이 끊기지 않는 거예요. 거울 비추기를 변환이 알아서 해 주는 거네요.

로봇 팔 동작 한 토막은 처음과 끝이 다른 게 보통이니까 FAST가 코사인 꼴을 고른 거고요.

그래요. 계수가 빨리 줄면 남길 숫자가 적고, 남길 숫자가 적으면 토큰도 적어요. 닫힌 곡선이면 도는 화살표가, 열린 구간이면 코사인이 그 일을 잘해요.

실험 보고서 그래프를 그릴 때 양 끝이 안 맞는 데이터에 주기 함수를 억지로 맞추면 끝이 출렁이던 게 이거였어요.