텐서와 공변 미분 — 좌표가 바뀌어도 식이 같으려면
텐서와 공변 미분 — 좌표가 바뀌어도 식이 같으려면
텐서는 좌표가 아니라 다중선형 사상 그 자체이고, 공변 미분은 좌표가 휘어 있을 때 편미분을 텐서로 되돌려 놓는 보정 장치다.
들어가며
해석역학은 결국 “좌표를 갈아끼워도 같은 운동방정식을 얻는 언어”를 만드는 작업이다. 이 장에서는 그 언어의 가장 기초가 되는 두 개념 — 텐서와 공변 미분 — 을 손에 쥔다. 이 장을 끝내면 독자는 “벡터의 성분이 어떻게 변환되는가”라는 익숙한 질문을, “텐서라는 사상 자체는 좌표와 무관하다”는 한 단계 위의 관점으로 다시 쓸 수 있어야 한다. 다음 장에서 다양체 위에 운동을 얹기 위한 준비 단계다. 본문 전체에서 아인슈타인 합 규약 — 같은 인덱스가 위아래에 한 번씩 나타나면 그 인덱스에 대해 자동으로 합 — 을 사용한다.
본론 1 — 텐서란 무엇인가
텐서를 처음 만날 때 가장 흔한 오해는 “인덱스가 두 개 이상 달린 숫자 표”라는 정의다. 그건 텐서의 성분 표현이지 텐서가 아니다.
한 점 에서의 계수 텐서는, 공변 벡터 개와 반변 벡터 개를 받아 실수 하나를 돌려주는 다중선형 사상이다. 평이하게 다시 말하면: 슬롯이 개 있는 기계다. 각 슬롯에 정해진 종류의 벡터 또는 공변 벡터(코벡터)를 꽂으면 숫자 하나가 나오고, 그 기계는 각 슬롯에 대해 독립적으로 선형이다.
이 정의를 잡고 익숙한 양들을 다시 보면 자리가 깔끔하게 잡힌다.
- 계수 텐서 = 스칼라. 슬롯이 없으므로 그냥 숫자.
- 계수 텐서 = 벡터. 코벡터 한 장을 받아 숫자를 돌려준다.
- 계수 텐서 = 코벡터(공변 벡터). 벡터 한 장을 받아 숫자를 돌려준다.
- 계수 텐서 = 이중선형 형식. 벡터 두 장을 받아 숫자를 돌려준다. 대표 예가 계량 텐서 — 벡터 두 개의 내적을 만들어 주는 기계.
- 계수 텐서 = 선형 사상. 벡터 한 장과 코벡터 한 장을 받아 숫자를 돌려준다. 행렬과 똑같이 다룰 수 있다.
핵심은 이 모든 정의에 좌표가 한 번도 등장하지 않는다는 점이다. 좌표는 텐서를 이름표 붙여 적기 위한 도구일 뿐, 텐서 자체는 좌표 이전에 존재한다.
본론 2 — 성분 변환 법칙
물론 실제 계산은 좌표로 한다. 좌표계 에서 로 갈아탈 때, 텐서의 성분은 어떻게 바뀔까?
벡터(반변, 인덱스 위)의 성분은 다음과 같이 변환된다:
코벡터(공변, 인덱스 아래)는 정확히 반대 방향의 야코비안을 쓴다:
계수 텐서 는 위 인덱스에는 위쪽 야코비안, 아래 인덱스에는 아래쪽 야코비안을 한 번씩 곱한다:
규칙은 단순하다: 위 인덱스는 새 좌표/옛 좌표 야코비안, 아래 인덱스는 옛 좌표/새 좌표 야코비안, 각 인덱스마다 한 번씩.
구체적인 예. 2차원 카르테시안 좌표를 각도 (alpha) 만큼 회전한 새 좌표를 생각하자. 야코비안은 회전행렬의 전치 이고, 옛 좌표에서 벡터 이었던 양을 새 좌표에서 보면 , 즉 가 된다. 같은 화살표를 다른 자에서 읽었을 뿐이다.
본론 3 — 공변 미분 한 문장
카르테시안 좌표계에서는 벡터장 의 편미분 가 그대로 계수 텐서의 성분이 된다. 그러나 극좌표처럼 기저 벡터가 위치에 따라 달라지는 좌표계에서는 이 단순한 편미분이 더 이상 텐서가 아니다. 미분이 성분만 잡아내고 기저의 회전을 놓치기 때문이다.
해법은 보정항을 더해 텐서로 되돌리는 것이다. 공변 미분은 다음과 같이 정의된다:
여기 등장하는 를 크리스토펠 기호(Christoffel symbol) 라 부른다. 이것은 “비-카르테시안 좌표를 쓴 대가”로 이해하면 충분하다. 한 줄로 말하면: 임의의 좌표계에서 는 계량 로부터 정해지고, 카르테시안 좌표에서는 이다. 유도는 뒤 장에서 필요해질 때 한다.
파이썬으로 확인
# 회전 변환 아래에서 벡터의 길이, 텐서의 트레이스/행렬식이 보존되는지 확인.
# 좌표(=기저) 회전이지 객체 회전이 아니므로 모두 동일하게 나와야 한다.
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장: 다양체에서는 이 장의 텐서를 다양체 위에 얹는다. 즉, 한 점 근방에서만 의미를 가지던 계수 텐서가 어떻게 매끄러운 좌표 패치들 사이에서 일관되게 정의되는지를 본다. 크리스토펠 기호의 좌표 변환 규칙과, 계량으로부터 를 끌어내는 공식은 그 다음 장에서 필요해질 때 다시 꺼낸다.