적분 가능한 계 — 토러스 위의 운동
적분 가능한 계 — 토러스 위의 운동
개의 서로 가환하는 보존량이 있으면 운동은 차원 토러스 위에 갇힌다 — 케플러 문제가 그렇게 닫힌 타원이 되는 이유.
들어가며
해밀턴 형식의 한 가지 매력은 “운동을 푼다”는 행위가 곧 “충분히 많은 보존량을 찾는다”는 행위로 환원된다는 점이다. 충분히 많다는 게 정확히 얼마인지, 그리고 그 보존량들이 갖춰야 할 대수적 조건이 무엇인지를 답한 것이 리우빌–아르놀트 정리(Liouville–Arnold theorem) 다. 이 장을 마치면 독자는 “적분 가능”이라는 단어가 막연한 표현이 아니라 위상공간이 토러스로 잘게 잘린다는 기하학적 진술임을 이해하고, 케플러 궤도가 닫히는 것이 라플라스–룽게–렌츠 벡터라는 숨은 보존량 때문임을 한 문장으로 말할 수 있다.
본론 1 — 리우빌–아르놀트 정리
자유도 인 해밀턴 계의 위상공간은 차원이다. 좌표를 , 로 쓰자. 위상공간 위의 두 함수 에 대해 푸아송 괄호(Poisson bracket) 를
로 정의한다. 두 함수가 가환(involution)이라는 말은 이라는 뜻이다.
이제 정의를 적는다. 차원 위상공간 위의 해밀턴 계가 리우빌 적분 가능(Liouville-integrable) 하다는 것은, 매끄럽고 함수적으로 독립인 개의 함수 이 존재하여 모든 에 대해 이고, 그중 하나가 해밀토니안 자체인 경우를 말한다.
리우빌–아르놀트 정리의 결론은 두 줄로 요약된다. 공통 등위집합 이 콤팩트하고 연결되어 있다면, 그 집합은 차원 토러스 와 미분동형(diffeomorphic)이다. 그리고 그 위에서 적당한 좌표계 — 작용–각 변수(action–angle variables) — 를 잡으면 해밀턴 방정식이 다음과 같이 자명해진다:
각 토러스마다 고유한 진동수 벡터 가 있고, 운동은 그 토러스를 등속으로 감는 직선이 된다. 진동수들이 유리수 비율이면 궤적은 닫히고, 무리수 비율이면 토러스 전체를 빽빽이 채운다.
본론 2 — 적분 가능한 계는 왜 드문가
위상공간 어디서나 개의 가환 보존량을 찾을 수 있다는 조건은 사실 매우 강한 조건이다. 일반적인(generic) 해밀토니안은 자기 자신 외의 보존량을 갖지 않는다. 따라서 적분 가능성은 비일반적(non-generic) 성질이며, 임의의 작은 섭동만 가해도 깨질 수 있다.
그럼에도 불구하고 물리에서 자주 만나는 모형 중 적분 가능한 것의 목록은 짧지만 강력하다: 자유 입자, 임의 자유도의 조화진동자, 케플러 문제, 강체의 오일러 자유 회전, 그리고 일차원 다입자 모형인 칼로제로–모저(Calogero–Moser) 모형 등이다. 이 목록이 짧다는 사실 자체가 한 가지 메시지를 던진다: 우리가 분석적으로 풀 수 있는 모형은 위상공간 전체에서 보면 측도 0의 예외라는 것이다.
4장에서 다룰 KAM(콜모고로프–아르놀트–모저) 이론은 이 적분 가능성이 얼마나 부서지기 쉬운지를 정량화한다. 어떤 토러스는 살아남고, 어떤 토러스는 사라지며, 그 경계는 진동수 비율의 수론적 성질이 결정한다는 사실이 미리 예고편이다.
본론 3 — 케플러의 숨은 대칭
3차원 케플러 문제의 해밀토니안은
이고 , 이다. 명백한 보존량은 에너지 , 각운동량 크기 제곱 , 그리고 성분 의 세 개 — 3 자유도이므로 이것만으로 이미 리우빌 적분 가능 조건을 만족한다.
그런데 케플러는 추가로 하나 더 가지고 있다. 라플라스–룽게–렌츠 벡터(Laplace–Runge–Lenz vector)
는 모든 케플러 궤도를 따라 보존된다. 이 벡터의 방향은 타원 궤도의 장축, 즉 근일점을 향한다. 일반적인 중심력 — 예컨대 이 아닌 다른 거듭제곱 — 에서는 이 양이 보존되지 않으며, 그래서 행성 궤도가 한 바퀴 돌고도 닫히지 않고 세차(precession) 한다. 케플러 궤도가 정확히 닫힌 타원이라는 사실, 즉 모든 행성이 마다 같은 자리로 돌아온다는 사실은 이 숨은 대칭의 직접적인 결과다. 증명은 생략하고, 다음 절에서 수치적으로 확인한다.
파이썬으로 확인
# 2차원 케플러: m=k=1, 손으로 짠 RK4 적분으로 닫힌 타원을 그린다.
import numpy as np
import matplotlib.pyplot as plt
m, k = 1.0, 1.0
def accel(r):
# 중력 가속도: -k * r / |r|^3
return -k * r / np.linalg.norm(r)**3
def rhs(state):
r, v = state[:2], state[2:]
return np.concatenate([v, accel(r) / m])
def rk4_step(s, dt):
k1 = rhs(s)
k2 = rhs(s + 0.5*dt*k1)
k3 = rhs(s + 0.5*dt*k2)
k4 = rhs(s + dt*k3)
return s + (dt/6.0) * (k1 + 2*k2 + 2*k3 + k4)
dt, T = 0.005, 30.0
N = int(T / dt)
s = np.array([1.0, 0.0, 0.0, 0.8]) # r0=(1,0), v0=(0,0.8)
traj = np.empty((N+1, 4)); traj[0] = s
for i in range(N):
s = rk4_step(s, dt); traj[i+1] = s
def E_L_A(s):
r, v = s[:2], s[2:]
rn = np.linalg.norm(r)
p = m * v
E = 0.5*m*np.dot(v, v) - k/rn
Lz = r[0]*v[1] - r[1]*v[0] # 2D 각운동량의 z성분
A = np.array([p[1]*Lz, -p[0]*Lz]) - m*k*r/rn # LRL 벡터
return E, Lz, A
E0, L0, A0 = E_L_A(traj[0])
E1, L1, A1 = E_L_A(traj[-1])
print(f"E: {E0:+.8f} -> {E1:+.8f}")
print(f"Lz: {L0:+.8f} -> {L1:+.8f}")
print(f"A: {A0} -> {A1}")
plt.plot(traj[:,0], traj[:,1]); plt.axis('equal')
plt.xlabel('x'); plt.ylabel('y'); plt.title('Kepler orbit')
plt.show()
와 가 이하의 오차로 보존되고, 의 두 성분도 거의 변하지 않으면 라플라스–룽게–렌츠 벡터의 보존성을 손으로 만져본 셈이다. 궤도 그림은 정확히 한 바퀴 돈 뒤 같은 자리에 돌아오는 닫힌 타원이어야 한다.
다음 장으로
4장: 섭동 이론에서는 적분 가능성이 깨질 때 토러스가 어떻게 부서지는지를 본다. 작은 섭동을 가했을 때 어떤 진동수 비율의 토러스가 살아남고 어떤 것이 카오스의 바다에 잠기는지 — 이것이 KAM 정리의 본론이며, 적분 가능이라는 이상화가 실제로 우리에게 무엇을 가르쳐주는지에 대한 답이기도 하다.