텐서와 공변 미분 — 좌표가 바뀌어도 식이 같으려면

텐서는 좌표가 아니라 다중선형 사상 그 자체이고, 공변 미분은 좌표가 휘어 있을 때 편미분을 텐서로 되돌려 놓는 보정 장치다.

들어가며

해석역학은 결국 “좌표를 갈아끼워도 같은 운동방정식을 얻는 언어”를 만드는 작업이다. 이 장에서는 그 언어의 가장 기초가 되는 두 개념 — 텐서공변 미분 — 을 손에 쥔다. 이 장을 끝내면 독자는 “벡터의 성분이 어떻게 변환되는가”라는 익숙한 질문을, “텐서라는 사상 자체는 좌표와 무관하다”는 한 단계 위의 관점으로 다시 쓸 수 있어야 한다. 다음 장에서 다양체 위에 운동을 얹기 위한 준비 단계다. 본문 전체에서 아인슈타인 합 규약 — 같은 인덱스가 위아래에 한 번씩 나타나면 그 인덱스에 대해 자동으로 합 — 을 사용한다.

본론 1 — 텐서란 무엇인가

텐서를 처음 만날 때 가장 흔한 오해는 “인덱스가 두 개 이상 달린 숫자 표”라는 정의다. 그건 텐서의 성분 표현이지 텐서가 아니다.

한 점 pp 에서의 계수 (p,q)(p, q) 텐서는, 공변 벡터 pp 개와 반변 벡터 qq 개를 받아 실수 하나를 돌려주는 다중선형 사상이다. 평이하게 다시 말하면: 슬롯이 p+qp + q 개 있는 기계다. 각 슬롯에 정해진 종류의 벡터 또는 공변 벡터(코벡터)를 꽂으면 숫자 하나가 나오고, 그 기계는 각 슬롯에 대해 독립적으로 선형이다.

이 정의를 잡고 익숙한 양들을 다시 보면 자리가 깔끔하게 잡힌다.

  • 계수 (0,0)(0, 0) 텐서 = 스칼라. 슬롯이 없으므로 그냥 숫자.
  • 계수 (1,0)(1, 0) 텐서 = 벡터. 코벡터 한 장을 받아 숫자를 돌려준다.
  • 계수 (0,1)(0, 1) 텐서 = 코벡터(공변 벡터). 벡터 한 장을 받아 숫자를 돌려준다.
  • 계수 (0,2)(0, 2) 텐서 = 이중선형 형식. 벡터 두 장을 받아 숫자를 돌려준다. 대표 예가 계량 텐서 gijg_{ij} — 벡터 두 개의 내적을 만들어 주는 기계.
  • 계수 (1,1)(1, 1) 텐서 = 선형 사상. 벡터 한 장과 코벡터 한 장을 받아 숫자를 돌려준다. 행렬과 똑같이 다룰 수 있다.

핵심은 이 모든 정의에 좌표가 한 번도 등장하지 않는다는 점이다. 좌표는 텐서를 이름표 붙여 적기 위한 도구일 뿐, 텐서 자체는 좌표 이전에 존재한다.

본론 2 — 성분 변환 법칙

물론 실제 계산은 좌표로 한다. 좌표계 xx 에서 xx' 로 갈아탈 때, 텐서의 성분은 어떻게 바뀔까?

벡터(반변, 인덱스 위)의 성분은 다음과 같이 변환된다:

Ti=xixjTjT'^{i} = \frac{\partial x'^{i}}{\partial x^{j}} \, T^{j}

코벡터(공변, 인덱스 아래)는 정확히 반대 방향의 야코비안을 쓴다:

Ti=xjxiTjT'_{i} = \frac{\partial x^{j}}{\partial x'^{i}} \, T_{j}

계수 (1,1)(1, 1) 텐서 TijT^{i}{}_{j} 는 위 인덱스에는 위쪽 야코비안, 아래 인덱스에는 아래쪽 야코비안을 한 번씩 곱한다:

Tij=xixkxlxjTklT'^{i}{}_{j} = \frac{\partial x'^{i}}{\partial x^{k}} \frac{\partial x^{l}}{\partial x'^{j}} \, T^{k}{}_{l}

규칙은 단순하다: 위 인덱스는 새 좌표/옛 좌표 야코비안, 아래 인덱스는 옛 좌표/새 좌표 야코비안, 각 인덱스마다 한 번씩.

구체적인 예. 2차원 카르테시안 좌표를 각도 α\alpha (alpha) 만큼 회전한 새 좌표를 생각하자. 야코비안은 회전행렬의 전치 R(α)TR(\alpha)^{T} 이고, 옛 좌표에서 벡터 v=(1,0)v = (1, 0) 이었던 양을 새 좌표에서 보면 vi=(R1)ijvjv'^{i} = (R^{-1})^{i}{}_{j} v^{j}, 즉 v=(cosα,sinα)v' = (\cos\alpha, \sin\alpha) 가 된다. 같은 화살표를 다른 자에서 읽었을 뿐이다.

본론 3 — 공변 미분 한 문장

카르테시안 좌표계에서는 벡터장 VjV^{j} 의 편미분 iVj\partial_{i} V^{j} 가 그대로 계수 (1,1)(1, 1) 텐서의 성분이 된다. 그러나 극좌표처럼 기저 벡터가 위치에 따라 달라지는 좌표계에서는 이 단순한 편미분이 더 이상 텐서가 아니다. 미분이 성분만 잡아내고 기저의 회전을 놓치기 때문이다.

해법은 보정항을 더해 텐서로 되돌리는 것이다. 공변 미분은 다음과 같이 정의된다:

iVj=iVj+ΓjikVk\nabla_{i} V^{j} = \partial_{i} V^{j} + \Gamma^{j}{}_{ik} \, V^{k}

여기 등장하는 Γjik\Gamma^{j}{}_{ik}크리스토펠 기호(Christoffel symbol) 라 부른다. 이것은 “비-카르테시안 좌표를 쓴 대가”로 이해하면 충분하다. 한 줄로 말하면: 임의의 좌표계에서 Γ\Gamma 는 계량 gijg_{ij} 로부터 정해지고, 카르테시안 좌표에서는 Γ=0\Gamma = 0 이다. 유도는 뒤 장에서 필요해질 때 한다.

파이썬으로 확인

# 회전 변환 아래에서 벡터의 길이, 텐서의 트레이스/행렬식이 보존되는지 확인.
# 좌표(=기저) 회전이지 객체 회전이 아니므로 모두 동일하게 나와야 한다.
import numpy as np

alpha = np.pi / 6                                        # 회전각 (라디안)
R = np.array([[np.cos(alpha), -np.sin(alpha)],
              [np.sin(alpha),  np.cos(alpha)]])
R_inv = R.T                                              # 회전행렬은 직교

# 벡터: A 기저에서 (1, 0), B 기저에서의 성분은 R^{-1} v
v = np.array([1.0, 0.0])
v_prime = R_inv @ v
print(f"|v|^2  = {v @ v:.6f}")
print(f"|v'|^2 = {v_prime @ v_prime:.6f}")               # 같아야 함

# 랭크-2 텐서: T' = R^{-1} T R
T = np.array([[2.0, 1.0],
              [1.0, 0.0]])
T_prime = R_inv @ T @ R
print(f"tr T   = {np.trace(T):.6f},  tr T'   = {np.trace(T_prime):.6f}")
print(f"det T  = {np.linalg.det(T):.6f},  det T'  = {np.linalg.det(T_prime):.6f}")

네 줄 출력이 짝지어 같게 나오면, 좌표를 갈아끼워도 변하지 않는 스칼라 불변량(길이, 트레이스, 행렬식)이 무엇인지 손으로 확인한 셈이다.

다음 장으로

4장: 다양체에서는 이 장의 텐서를 다양체 위에 얹는다. 즉, 한 점 근방에서만 의미를 가지던 계수 (p,q)(p, q) 텐서가 어떻게 매끄러운 좌표 패치들 사이에서 일관되게 정의되는지를 본다. 크리스토펠 기호의 좌표 변환 규칙과, 계량으로부터 Γ\Gamma 를 끌어내는 공식은 그 다음 장에서 필요해질 때 다시 꺼낸다.