テンソル表記と座標系
テンソル表記と座標系
第3~12章でナビエ–ストークスを一行で書くために必要な表記法 — 添字表記、アインシュタインの総和規約、そして直交座標限定の約束。
はじめに
この章では新しい物理を扱わない。代わりに、第3章以降のすべての方程式を一行に圧縮するための道具を整える。学習目標は単純である — を見て「ベクトル の第 成分」と瞬時に読めるようになること、そして同じ添字が二度現れたら「 が省略されている」と自動的に解釈できるようになることだ。
本論 1 — ベクトルを成分に分解する
3次元直交座標系(Cartesian coordinate system、デカルト座標系)において、速度ベクトルは三つの成分を持つ:
ここで添字 1, 2, 3 はそれぞれ 軸に対応する。すなわち , , である。座標軸そのものも同じ流儀で と書く。
この表記の利点は、一般化された添字 を一度導入すれば、三成分に対する記述を一行に圧縮できる点である:
この一行は「 すべてについて次が成り立つ」という意味を含む。自由添字(free index) は式の両辺に同様に現れ、「成分ごとに式が三本ある」という意味になる。
本論 2 — アインシュタインの総和規約
二つのベクトル の内積(dot product)を添字表記で書くと:
ここで添字 が一つの項の中で二度繰り返されている。アインシュタイン(Einstein、アインシュタイン)が1916年の一般相対性理論論文で導入した規約は単純である — 同一項内で繰り返される添字は1から3まで自動的に和を取ると約束し、 記号を省略する:
繰り返される添字をダミー添字(dummy index)と呼ぶ。ダミー添字は名前を変えても式の意味は変わらない。すなわち である。 と が同じ値であるのと同じことだ。
同じ添字が一項に三回以上現れたら表記の誤りである。また、両辺の自由添字は正確に一致しなければならない — 左辺に が自由に残っていれば、右辺にも が自由に残っている必要がある。
本論 3 — ランク2テンソルと応力
スカラーは方向を持たない量(温度など)、ベクトルは方向が一つの量(速度など)である。ランク2テンソル(rank-2 tensor)は方向を二つ持つ量だ。最も代表的な例が応力テンソル(stress tensor) である。
は「 方向の面の単位面積に働く力の 方向成分」を意味する。二つの自由添字 がそれぞれ 1, 2, 3 を走るので、応力テンソルは合計 成分を持つ:
第3章で登場する速度勾配(velocity gradient) も同じ構造だ — はどの速度成分か、 はどの方向に微分するかを示し、全 9 個の偏微分を一つの記号にまとめる。この圧縮がなければナビエ–ストークス方程式は一ページに膨らむ。
本論 4 — 本書では直交座標のみ用いる
一般的なテンソル解析では曲線座標系(円筒・球面など)も扱い、その際にはクリストッフェル記号(Christoffel symbol、クリストッフェル)や共変(covariant)・反変(contravariant)の区別が登場する。本書はすべての章で3次元直交座標系のみを用いる。 したがって:
- 添字を上付き/下付きで区別する必要がない(すべて下付きで書く)。
- クリストッフェル記号は 0 なので無視する。
- 座標軸は直線で、単位ベクトルは位置によらず一定である。
この約束のおかげで表記がずっと簡単になる。曲線座標系が必要な応用(円管内流れ、回転機械内部の流れなど)では、通常結果式だけを座標変換で移し、導出自体は直交座標で行う。
Pythonで確かめる
内積を手で書いた三つの積の和として計算する方法と、numpy の einsum で計算する方法が同じ値になるかを確かめよう。einsum('i,i->', a, b) という表記は、「添字 が二度繰り返されるので和を取り、結果はスカラー」というアインシュタイン規約をそのままコードに移したものだ。
import numpy as np
# 任意の3次元ベクトルを二つ(再現性のためシード固定)
rng = np.random.default_rng(0)
a = rng.standard_normal(3)
b = rng.standard_normal(3)
# 方法 1 — 手で書いた三つの積の和
manual = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
# 方法 2 — アインシュタインの総和規約 (繰り返された i を自動で和)
einstein = np.einsum('i,i->', a, b)
# 参考 — np.dot も同じ結果
dot = np.dot(a, b)
print(f"a = {a}")
print(f"b = {b}")
print(f"手動計算 : {manual:.6f}")
print(f"einsum : {einstein:.6f}")
print(f"np.dot : {dot:.6f}")
print(f"三つは一致するか? {np.allclose([manual, einstein, dot], manual)}")
einsum の文法 'i,i->' はそのまま数式である — カンマの前後が二つの入力テンソルの添字、矢印の後が出力の添字。出力の添字が空ならば「スカラー」という意味で、入力で繰り返された は和を取られる。言い換えれば、アインシュタイン表記は numpy がすでにやっていたことに名前を付けただけである。
次章へ
これで表記の道具がそろった。第3章: ナビエ–ストークス方程式の復習では、この表記を用いて質量保存と運動量保存をそれぞれ一行で書く。本文の途中で のような式に違和感を覚えたら、この章に戻って「繰り返された は和」というルールを確認すればよい。