テンソル表記と座標系

第3~12章でナビエ–ストークスを一行で書くために必要な表記法 — 添字表記、アインシュタインの総和規約、そして直交座標限定の約束。

はじめに

この章では新しい物理を扱わない。代わりに、第3章以降のすべての方程式を一行に圧縮するための道具を整える。学習目標は単純である — uiu_i を見て「ベクトル u\vec{u} の第 ii 成分」と瞬時に読めるようになること、そして同じ添字が二度現れたら「\sum が省略されている」と自動的に解釈できるようになることだ。

本論 1 — ベクトルを成分に分解する

3次元直交座標系(Cartesian coordinate system、デカルト座標系)において、速度ベクトルは三つの成分を持つ:

u=(ux,uy,uz)=(u1,u2,u3)\vec{u} = (u_x, u_y, u_z) = (u_1, u_2, u_3)

ここで添字 1, 2, 3 はそれぞれ x,y,zx, y, z 軸に対応する。すなわち u1uxu_1 \equiv u_x, u2uyu_2 \equiv u_y, u3uzu_3 \equiv u_z である。座標軸そのものも同じ流儀で (x1,x2,x3)(x_1, x_2, x_3) と書く。

この表記の利点は、一般化された添字 ii を一度導入すれば、三成分に対する記述を一行に圧縮できる点である:

ui,i{1,2,3}u_i, \quad i \in \{1, 2, 3\}

この一行は「u1,u2,u3u_1, u_2, u_3 すべてについて次が成り立つ」という意味を含む。自由添字(free index)ii は式の両辺に同様に現れ、「成分ごとに式が三本ある」という意味になる。

本論 2 — アインシュタインの総和規約

二つのベクトル a,b\vec{a}, \vec{b} の内積(dot product)を添字表記で書くと:

ab=i=13aibi=a1b1+a2b2+a3b3\vec{a} \cdot \vec{b} = \sum_{i=1}^{3} a_i b_i = a_1 b_1 + a_2 b_2 + a_3 b_3

ここで添字 ii が一つの項の中で二度繰り返されている。アインシュタイン(Einstein、アインシュタイン)が1916年の一般相対性理論論文で導入した規約は単純である — 同一項内で繰り返される添字は1から3まで自動的に和を取ると約束し、\sum 記号を省略する:

aibii=13aibi=a1b1+a2b2+a3b3a_i b_i \equiv \sum_{i=1}^{3} a_i b_i = a_1 b_1 + a_2 b_2 + a_3 b_3

繰り返される添字をダミー添字(dummy index)と呼ぶ。ダミー添字は名前を変えても式の意味は変わらない。すなわち aibi=ajbj=akbka_i b_i = a_j b_j = a_k b_k である。i=13f(i)\sum_{i=1}^{3} f(i)j=13f(j)\sum_{j=1}^{3} f(j) が同じ値であるのと同じことだ。

同じ添字が一項に三回以上現れたら表記の誤りである。また、両辺の自由添字は正確に一致しなければならない — 左辺に ii が自由に残っていれば、右辺にも ii が自由に残っている必要がある。

本論 3 — ランク2テンソルと応力

スカラーは方向を持たない量(温度など)、ベクトルは方向が一つの量(速度など)である。ランク2テンソル(rank-2 tensor)は方向を二つ持つ量だ。最も代表的な例が応力テンソル(stress tensor)σij\sigma_{ij} である。

σij\sigma_{ij} は「jj 方向の面の単位面積に働く力の ii 方向成分」を意味する。二つの自由添字 i,ji, j がそれぞれ 1, 2, 3 を走るので、応力テンソルは合計 3×3=93 \times 3 = 9 成分を持つ:

σij=(σ11σ12σ13σ21σ22σ23σ31σ32σ33)\sigma_{ij} = \begin{pmatrix} \sigma_{11} & \sigma_{12} & \sigma_{13} \\ \sigma_{21} & \sigma_{22} & \sigma_{23} \\ \sigma_{31} & \sigma_{32} & \sigma_{33} \end{pmatrix}

第3章で登場する速度勾配(velocity gradient)ui/xj\partial u_i / \partial x_j も同じ構造だ — ii はどの速度成分か、jj はどの方向に微分するかを示し、全 9 個の偏微分を一つの記号にまとめる。この圧縮がなければナビエ–ストークス方程式は一ページに膨らむ。

本論 4 — 本書では直交座標のみ用いる

一般的なテンソル解析では曲線座標系(円筒・球面など)も扱い、その際にはクリストッフェル記号(Christoffel symbol、クリストッフェル)や共変(covariant)・反変(contravariant)の区別が登場する。本書はすべての章で3次元直交座標系のみを用いる。 したがって:

  • 添字を上付き/下付きで区別する必要がない(すべて下付きで書く)。
  • クリストッフェル記号は 0 なので無視する。
  • 座標軸は直線で、単位ベクトルは位置によらず一定である。

この約束のおかげで表記がずっと簡単になる。曲線座標系が必要な応用(円管内流れ、回転機械内部の流れなど)では、通常結果式だけを座標変換で移し、導出自体は直交座標で行う。

Pythonで確かめる

内積を手で書いた三つの積の和として計算する方法と、numpy の einsum で計算する方法が同じ値になるかを確かめよう。einsum('i,i->', a, b) という表記は、「添字 ii が二度繰り返されるので和を取り、結果はスカラー」というアインシュタイン規約をそのままコードに移したものだ。

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->' はそのまま数式である — カンマの前後が二つの入力テンソルの添字、矢印の後が出力の添字。出力の添字が空ならば「スカラー」という意味で、入力で繰り返された ii は和を取られる。言い換えれば、アインシュタイン表記は numpy がすでにやっていたことに名前を付けただけである。

次章へ

これで表記の道具がそろった。第3章: ナビエ–ストークス方程式の復習では、この表記を用いて質量保存と運動量保存をそれぞれ一行で書く。本文の途中で ui/xi\partial u_i / \partial x_i のような式に違和感を覚えたら、この章に戻って「繰り返された ii は和」というルールを確認すればよい。