テンソルと共変微分 — 座標が変わっても式が同じであるために
テンソルと共変微分 — 座標が変わっても式が同じであるために
テンソルは座標ではなく多重線形写像そのものであり、共変微分は座標が曲がっているときに偏微分をテンソルへ戻す補正装置である。
はじめに
解析力学とはつまるところ「座標を取り換えても同じ運動方程式を得るための言語」を整える作業である。本章ではその言語の最も基礎にある二つの概念 — テンソルと共変微分 — を手にする。読み終えたあと読者は「ベクトルの成分はどう変換するか」というおなじみの問いを、「テンソルという写像そのものは座標に依らない」という一段上の視点から書き直せるはずだ。次章で多様体の上に運動を載せるための準備でもある。本文全体で アインシュタインの和の規約 — 同じ添字が上下に一度ずつ現れたらその添字について自動的に和をとる — を用いる。
本論 1 — テンソルとは何か
テンソルに初めて出会うとき、もっともよくある誤解は「添字が二つ以上ついた数表」という定義である。それはテンソルの 成分表示 であってテンソルそのものではない。
点 における 階数 のテンソル とは、 個の共変ベクトルと 個の反変ベクトルを受け取り、実数を一つ返す多重線形写像である。噛み砕けばこうだ。スロットが 個ある機械。各スロットに決まった種類のベクトルあるいは共変ベクトル(コベクトル)を差し込むと数値が一つ返り、各スロットについて 独立に線形 である。
この定義を握って馴染みの量を見直すと、収まりが格段によくなる。
- 階数 テンソル = スカラー。スロットが無いので単なる数。
- 階数 テンソル = ベクトル。コベクトルを一枚受け取って数を返す。
- 階数 テンソル = コベクトル(共変ベクトル)。ベクトルを一枚受け取って数を返す。
- 階数 テンソル = 双線形形式。ベクトルを二枚受け取って数を返す。代表例が計量テンソル — 二本のベクトルから内積を作る機械。
- 階数 テンソル = 線形写像。ベクトルとコベクトルを一枚ずつ受け取って数を返す。行列とまったく同じに扱える。
肝心なのは、これら全ての定義に座標が一度も出てこないという点だ。座標はテンソルに 名札を貼るための道具 にすぎず、テンソル自体は座標より先にある。
本論 2 — 成分の変換則
もちろん実際の計算は座標で行う。座標系 から に乗り換えるとき、テンソルの成分はどう変化するか。
ベクトル(反変、添字は上)の成分は次のように変換する:
コベクトル(共変、添字は下)はちょうど逆向きのヤコビアンを使う:
階数 テンソル は上の添字には上向きヤコビアン、下の添字には下向きヤコビアンを一回ずつ掛ける:
規則は単純で、上の添字には新座標/旧座標のヤコビアン、下の添字には旧座標/新座標のヤコビアンを、添字一つにつき一回ずつ掛けるだけだ。
具体例。2次元のデカルト座標を角度 (アルファ) だけ回転させた新しい座標を考える。ヤコビアンは回転行列の転置 で、旧座標でベクトル だった量を新座標で見ると 、すなわち となる。同じ矢印を別のものさしで読み直しただけのことだ。
本論 3 — 共変微分を一文で
デカルト座標では、ベクトル場 の偏微分 はそのまま階数 テンソルの成分になる。ところが極座標のように 基底ベクトルが位置に依存する 座標では、この素朴な偏微分はもはやテンソルではない。微分が成分しか拾わず、基底自身の回転を見落とすからだ。
直し方は補正項を足してテンソルに戻すことだ。共変微分 を次のように定義する:
ここに現れる を クリストッフェル記号(Christoffel symbol) と呼ぶ。これは「デカルト以外の座標を使うことの代償」と理解しておけば十分である。一行で言えば、任意の座標系で は計量 から定まり、デカルト座標では である。導出は後の章で必要になったときに行う。
Pythonで確かめる
# 座標(=基底)回転の下で、ベクトルの長さ、テンソルのトレース・行列式が保存されることを確認。
# 客体ではなく基底の回転なので、いずれも同じ値が出るはず。
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章: 多様体では、この章のテンソルを 多様体 の上に載せる。一点の近傍でしか意味を持たなかった階数 テンソルが、滑らかな座標パッチたちの間でどう整合的に定義されるかを見る。クリストッフェル記号の座標変換則と、計量から を引き出す公式は、その後の章で必要になったとき改めて取り出す。