数学的準備 — 多様体力学のための道具箱
数学的準備 — 多様体力学のための道具箱
ニュートンの法則を平面の外へ持ち出すには新しい語彙が要る — 基底、行列指数、そして接ベクトルへ至る最短経路。
はじめに
本書はラグランジュ・ハミルトン力学を多様体(manifold)の言葉で書き直す学習ノートである。その作業は第1章から始まるが、その前に読者の手元に揃えておきたい道具がいくつかある。この章を終えれば、読者は「基底の取り換え」をインデックス一行で書けるようになり、行列指数 がなぜフロー(flow)の最初の実例なのかを一文で言えるようになる。第4章の接空間、第5章のベクトル場が突然出てくる抽象ではなく、ここで見た絵の形式化だと見抜けるようになるはずだ。
本論 1 — なぜ道具箱が必要なのか
ニュートンが手渡した は、位置ベクトルが に住んでいるという暗黙の仮定の上で動く。教科書の単振り子、惑星運動、衝突問題までならこの仮定で十分だ。しかし二重振り子(double pendulum)を考えてみよう。二本の棒の角度 が座標になるが、この座標空間は平面ではなくトーラス(torus) である。座標 と は同じ点なのに、平面の微積分はそれを認めない。
同じく剛体の姿勢は回転群 という曲面の上に住み、球面上の質点は の上に住む。こうした空間をまとめて呼ぶ名前が多様体 — 局所的には のように見えるが大域的にはそうでない空間である。正式な定義は第4章に回すが、本書の前提は単純だ:配位空間が平面でない場合を扱うには、微積分の語彙を座標に依存しない形で書き直さなければならない。 その代償として、線形代数の語彙をもう一段磨くことになる。
本論 2 — 線形代数の復習
ベクトル空間 上の基底(basis)とは、線形独立かつ 全体を張るベクトルの集合である。基底 を選べば任意のベクトル は一意な成分 で書ける。本書ではアインシュタインの総和規約を採用する — 同じインデックスが上下に繰り返したら和をとる、という約束だ。だから
これだけ書けば十分。上付きが成分(反変)、下付きが基底(共変)を表す。新しい基底 が で与えられれば、同じベクトル の新しい成分 は逆行列 を掛けた形になる — これが座標変換(change of basis)であり、テンソル概念の出発点である。
次の道具は固有値と固有ベクトルだ。 行列 に対して を満たす零でない があるとき、 を固有値という。固有値は行列を回転・伸縮に分解する座標を教えてくれる。
そしてこの章の主役が登場する — 行列指数(matrix exponential)である。スカラーの指数関数 をそのまま行列に移したものだ。 が 行列のとき
この級数は任意の に対し絶対収束する。線形ODE の解は — 証明はひとまず事実として受け入れよう — と書ける。ここで強調したい: を変えながら を に作用させること、すなわち時間 の間だけシステムを流す行為こそ、これからフロー(flow)と呼ぶ対象の最初の実例である。 は で媒介された線形写像の一径数族であり、第5章で一般化される絵の最も素朴な見本だ。
本論 3 — 接ベクトルの直観
平面上のベクトルはどこに持っていっても同じベクトルである。平行移動は自由だ。しかし球面 上ではそうはいかない。赤道のある点で東を指す矢印を北極まで平行移動したとき、その矢印がどこを向けばよいかは自明ではない。
解決策は点ごとに自分専用のベクトル空間を持たせることだ。点 の上の接ベクトル(tangent vector)とは、直観的には「点 で曲面が許す速度」のことである。点 における接ベクトル全体がつくるベクトル空間を接空間 と呼ぶ。球面の北極における接空間 は、北極で球面に接する水平面 — 直観そのままだ。
もう少し形式的に見よう。点 を通る曲線 , をとる。その曲線の時刻0における速度 が一つの接ベクトルである。座標 をとれば と書け、基底 が の基底の役目を果たす。この式が本論 2 の と完全に同じ形式であることだけ覚えておけばよい。
この章では絵と語彙を押さえれば十分だ。正式な定義・同値性・基底の取り換えは第4章に譲る。しかし一つだけ釘を刺しておこう:ベクトル場とは「空間の各点に接ベクトルを一つずつ」滑らかに敷いたものであり、それに沿って点を流した結果がフローである。 はそのすべての絵の平面板にすぎない。
Pythonで確かめる
# 行列指数が本当に回転を生み出すかを確かめる。
# A = [[0,-1],[1,0]] は平面回転の生成子で、
# その指数 e^{tA} を x0 = (1,0) に作用させると単位円になるはず。
import numpy as np
import matplotlib.pyplot as plt
A = np.array([[0.0, -1.0], [1.0, 0.0]])
x0 = np.array([1.0, 0.0])
def expm_series(M, terms=20):
# 打ち切りテイラー級数:小さい ||M|| で十分高精度
n = M.shape[0]
result = np.eye(n)
term = np.eye(n)
for k in range(1, terms):
term = term @ M / k
result = result + term
return result
ts = np.linspace(0.0, 2 * np.pi, 200)
xs = np.array([expm_series(t * A) @ x0 for t in ts])
# 閉じた形 cos t, sin t と比較
closed = np.array([[np.cos(t), np.sin(t)] for t in ts])
err = np.max(np.abs(xs - closed))
print(f"級数解と閉形式の最大誤差 = {err:.2e}")
plt.plot(xs[:, 0], xs[:, 1])
plt.gca().set_aspect("equal")
plt.title(r"$e^{tA} x_0$ が描くフロー")
plt.show()
誤差が オーダーに落ち、図が単位円を描けば、「 とは初期ベクトルに時間 だけ作用するフローだ」という定義が手につかめたといってよい。
次章へ
第1章: 運動方程式では、ニュートンの を一般座標 の言葉で書き直し、そこからラグランジアンが自然に浮かび上がる過程を追う。本章で揃えたインデックス記法とフローの絵が、その作業の基本語彙として働く。