ハミルトン–ヤコビ方程式 — 作用を直接解く道
ハミルトン–ヤコビ方程式 — 作用を直接解く道
本のハミルトン ODE を一つの非線形 1 階偏微分方程式に圧縮し、その解 自体が運動を丸ごと含む — 自由粒子で手順を最初から最後まで一度通す。
はじめに
I 巻ではラグランジアンからハミルトニアンへ、ラグランジュ方程式からハミルトン方程式へと一段ずつ抽象化の梯子を登ってきた。本章はその次の段である — 座標と運動量の組 個を追いかける代わりに、作用 という ただ一つの関数 を解き、その導関数から運動全部を読み取る。終わるころには、ハミルトン–ヤコビ(Hamilton–Jacobi, HJ)方程式が量子力学のシュレーディンガー方程式と式の形がなぜ似ているのか、その最初の手がかりも掴めているはずだ。
本論 1 — HJ 方程式の舞台設定
I 巻では作用は経路の汎関数だった。すなわち二つの端点を結ぶ経路 ひとつに実数ひとつを対応させる量 。今回は視点を変える。固定した初期点 から出発して 実際の古典解 に沿って に至ったとき、その経路上で計算した作用の値を関数 と呼ぶ。つまり はもはや経路の関数ではなく、終点の座標と時刻の関数である。
ハミルトンはこの が次の偏微分方程式を満たすことを示した。
ここで鍵となる観察は 運動量が作用の空間微分そのものだ という点である。
解析学の言葉で言えば、 本のハミルトン常微分方程式が座標 次元だけの関数 に対する 1 階非線形偏微分方程式 ただ一つ に圧縮されている。1 階 PDE を解くときに自然に現れる ODE 系 — PDE の特性曲線(characteristic curves) — は、ちょうどハミルトン流と一致する。作用は位相空間の流れ全体を自分のグラフの中に抱えているのだ。
本論 2 — 時間が抜けると変数が分離する
が時刻に陽に依存しないとき、すなわち のときには、保存量 — エネルギー — が一つ現れる。この事実を PDE を解く出発点に据える。時間と空間を分離して
と置くと となり、HJ 方程式は時間が消えた形に縮まる。
これを 時間に依らない HJ 方程式、あるいは ハミルトンの特性関数方程式 と呼び、 を 特性関数(characteristic function) と呼ぶ。保存される定数 が 分離定数(separation constant) の役目を果たしている。
多変数系で HJ が威力を発揮する理由はここにある — 保存量がひとつ見つかるごとに分離定数がひとつ取れ、運よく独立な分離定数が 個揃えば は積分だけで構成できる。こうした系を 完全可積分(completely integrable) と呼ぶ。ケプラー問題、調和振動子、剛体回転はいずれもこの仲間である。
本論 3 — 自由粒子で最初から最後まで
もっとも簡単な例 — 1 次元自由粒子 — で手順を一度通す。 なので
ここに を代入すると 、ゆえに
(ここで はエネルギー に対応する一定の運動量。)したがって
ここでヤコビ(Jacobi)の処方を使う — 作用を分離定数について微分した量はまた別の定数になる。
整理すれば
これは見慣れた自由粒子の直線運動である。自由粒子 1 体に HJ を持ち出すのは明らかに大袈裟だが、この例で手順の五段階 — PDE を書く、変数を分離する、 を求める、 を別の定数と等値する、時間の関数として解く — がいちばんきれいに見える。この流れが次章の正準変換と出会うと、HJ の本領がいよいよ姿を現す。
Pythonで確かめる
# 自由粒子の HJ 解: W(x) = p x を描き、
# ヤコビ処方で得た x(t) が直接積分と一致するかを確かめる。
import numpy as np
import matplotlib.pyplot as plt
m, E = 1.0, 0.5
p = np.sqrt(2 * m * E) # 一定の運動量
# 1) 特性関数 W(x) = p x
x_grid = np.linspace(0, 10, 200)
W = p * x_grid
# 2) ヤコビ処方: ∂S/∂E = m x / p - t = -t0 → x(t) = (p/m)(t - t0)
t = np.linspace(0, 10, 200)
t0 = 0.0
x_hj = (p / m) * (t - t0)
# 3) 比較: ẋ = p/m を直接積分 (オイラーで十分)
dt = t[1] - t[0]
x_dir = np.zeros_like(t)
for i in range(1, len(t)):
x_dir[i] = x_dir[i-1] + (p / m) * dt
err = np.max(np.abs(x_hj - x_dir))
print(f"HJ 経路と直接積分の最大誤差 = {err:.2e}")
fig, ax = plt.subplots(1, 2, figsize=(8, 3))
ax[0].plot(x_grid, W); ax[0].set(xlabel="x", ylabel="W(x)", title="特性関数")
ax[1].plot(t, x_hj, label="HJ"); ax[1].plot(t, x_dir, "--", label="直接積分")
ax[1].set(xlabel="t", ylabel="x(t)"); ax[1].legend()
plt.tight_layout()
誤差が浮動小数の限界 程度まで落ちれば、PDE を解いて得た経路と ODE を積分して得た経路の二本が同じ運動を指していることを手で確かめたことになる。
次章へ
2 章: 正準変換の深化では、本章で見た作用 が自然と 生成関数 の資格を得て、HJ 方程式が「ハミルトニアンをゼロにする正準変換を探す」という巧みな一行に読み替えられる過程を見る。この時点で HJ はもう自由粒子に使うのが惜しい道具ではなく、可積分系の作用–角変数を自動で汲み上げる機械になっている。