곡면 위의 운동 — 구속과 라그랑주 승수
곡면 위의 운동 — 구속과 라그랑주 승수
구슬은 고리 위에서만 움직인다 — 구속조건이 자유도를 어떻게 줄이고, 라그랑주 승수가 어떻게 구속력의 정체를 알려주는가.
들어가며
뉴턴 역학을 1장에서 정리할 때 우리는 입자가 3차원 공간을 자유롭게 떠다닌다고 가정했다. 그러나 실제 문제 대부분은 그렇지 않다. 구슬은 철사 고리 위에만 있고, 진자 추는 길이가 일정한 줄 끝에 매달려 있으며, 동전은 미끄러지지 않고 굴러간다. 이 장에서는 이런 구속조건(constraint) 을 두 종류로 나누고, 그중 가장 자주 등장하는 홀로노믹(holonomic) 구속을 곡면 위의 운동이라는 그림으로 만져본다. 그리고 7장에서 본격적으로 다룰 라그랑주 승수(Lagrange multiplier) 가 단순한 수학 트릭이 아니라 구속력 그 자체 를 측정한다는 사실을 미리 맛본다.
본론 1 — 두 종류의 구속
구속조건은 형식에 따라 두 부류로 나뉜다.
홀로노믹 구속 은 좌표만의 (그리고 경우에 따라 시간만의) 방정식
으로 쓰인다. 여기서 은 입자의 좌표 묶음이다. 이 한 줄의 식이 형상공간(configuration space, 가능한 위치들의 집합)의 차원을 하나 줄인다. 예를 들어 반지름 인 원형 고리 위의 구슬은 평면에서 을 만족하므로, 2차원에서 1차원 곡선으로 자유도가 떨어진다. 마찬가지로 단위 반지름 구면 위의 점은 을 만족하며 3차원이 2차원 곡면으로 줄어든다.
비홀로노믹 구속 은 속도에 걸리는 선형 조건
으로 쓰이지만, 이 식이 좌표만의 식으로 적분되지 않는다. 즉, 형태로 다시 쓸 수가 없다. 고전적인 예가 미끄러지지 않는 동전의 구름조건 — 동전은 평면 위 어디든 갈 수 있지만(좌표 공간은 줄어들지 않는다), 각 순간의 속도 방향은 동전이 굴러가는 쪽으로 제약된다. 이 장에서는 홀로노믹 쪽만 깊이 다룬다. 역학 교과서에서 마주치는 구속은 대부분 이쪽이고, 비홀로노믹은 7장 이후 별도 절에서 다루는 편이 깔끔하다.
본론 2 — 고리 위의 구슬, 처음부터 끝까지
질량 인 구슬이 반지름 인 수직 원형 고리 위를 미끄러진다. 중력가속도는 . 구슬의 위치를 고리의 가장 아래쪽에서 잰 각도 (theta) 하나로 잡자. 그러면
운동에너지와 위치에너지는 곧장 떨어진다:
7장에서 라그랑지언 를 정식으로 도입하지만, 여기서는 그 결과만 미리 빌려 쓰자. 상수항 은 운동방정식에 영향을 주지 않으므로 떼어내면
이걸 오일러–라그랑주 방정식
에 넣으면 , 즉
이는 바로 진자 방정식 이다. 원래는 세 좌표에 고리의 제약식 둘이 걸린 3-DOF 문제였지만, 적절한 일반좌표 하나를 잡아 단번에 1-DOF 문제로 줄였다. 이게 라그랑주 형식주의가 학생을 매료시키는 첫 번째 장면이다 — 구속을 대수적으로 풀어 없애버린다.
본론 3 — 라그랑주 승수가 가리키는 것
좌표를 일반좌표로 바꾸면 구속력은 식에서 사라진다. 그러나 가끔은 정확히 그 구속력을 알고 싶다 — 예를 들어 고리가 구슬에 가하는 수직항력 이 얼마나 큰지, 고리가 그 힘을 견딜 수 있는지가 공학 문제로 들어온다.
이때는 좌표를 줄이지 않고, 원래 좌표 를 그대로 두면서 구속식 을 별도로 부과한다. 운동방정식에 한 항을 더해
라고 쓴다. 여기서 (lambda) 가 라그랑주 승수 다. 는 구속 곡면에 수직인 벡터이므로, 추가된 항 는 곡면에 수직한 힘, 즉 정확히 우리가 찾던 수직항력의 방향이다. 그 크기 — 부호 포함 — 가 이다.
다시 말해, 라그랑주 승수는 단순히 제약식을 만족시키기 위해 동원한 수학 도구가 아니라 구속력의 진폭 그 자체를 가리키는 물리량이다. 정식 유도는 7장 변분원리와 구속 에서 다룬다. 여기서는 “라그랑주 승수 = 구속력의 크기” 라는 한 줄을 머릿속에 박아두면 충분하다.
파이썬으로 확인
# 고리 위의 구슬: theta_ddot = -(g/R) sin(theta) 를 RK4로 적분.
import numpy as np
import matplotlib.pyplot as plt
g, R = 9.81, 0.2
dt, T_end = 1e-3, 4.0
N = int(T_end / dt)
def f(state):
th, om = state
return np.array([om, -(g / R) * np.sin(th)])
state = np.array([np.pi / 3, 0.0]) # theta0 = 60도, 정지에서 출발
ts = np.linspace(0, T_end, N + 1)
ths = np.empty(N + 1)
oms = np.empty(N + 1)
ths[0], oms[0] = state
for i in range(N):
k1 = f(state)
k2 = f(state + 0.5 * dt * k1)
k3 = f(state + 0.5 * dt * k2)
k4 = f(state + dt * k3)
state = state + (dt / 6) * (k1 + 2*k2 + 2*k3 + k4)
ths[i + 1], oms[i + 1] = state
fig, ax = plt.subplots(2, 1, sharex=True)
ax[0].plot(ts, ths); ax[0].set_ylabel(r'$\theta$ [rad]')
ax[1].plot(ts, oms); ax[1].set_ylabel(r'$\dot\theta$ [rad/s]')
ax[1].set_xlabel('t [s]')
plt.tight_layout(); plt.show()
궤적은 한 주기를 닫고 다시 같은 진폭으로 돌아온다. 진폭이 작았다면 거의 사인 곡선이지만, 처럼 큰 진폭에서는 마루 근처에서 약간 평평해지는 비조화성(anharmonicity) 이 눈에 띈다. 의 비선형성이 만들어내는 효과다.
다음 장으로
3장: 텐서와 공변미분에서는 이 장에서 곡면이라 부른 대상 — 자유도가 줄어든 부드러운 공간 — 을 다양체 라는 정식 이름으로 다시 만나고, 그 위에서 벡터를 어떻게 미분해야 좌표 선택에 의존하지 않는지를 본다. 라그랑지언이 “좌표를 자유롭게 바꿔도 같은 방정식을 준다”는 점이 우연이 아니라는 사실도 그때 분명해진다.