跳轉到

09.2 Lorentz 變換#

本節目標#

  • 從狹義相對論的兩條公設(相對性原理與光速不變原理)出發,用 SymPy 求解線性變換,導出 Lorentz 變換。
  • 認識 \(\gamma = 1/\sqrt{1-v^2/c^2}\) ,並快速推導時間收縮與長度收縮。
  • 從 Minkowski 幾何看 Lorentz 變換:它是 \((ct, x)\) 平面上的雙曲旋轉,參數為快度(rapidity) \(\varphi\) 。
  • 用 SymPy 驗證 Lorentz 變換保持間隔不變量 \(s^2\) 。
  • 動手實驗:用快度加法證明速度合成 \(v = 0.5c + 0.5c \ne c\) 。

兩條公設#

  1. 相對性原理:在所有慣性參考系中物理定律形式相同。
  2. 光速不變原理:真空光速 \(c\) 與光源或觀察者的運動無關。

若參考系 \(S'\) 以速度 \(v\) 沿 \(x\) 方向相對 \(S\) 運動,最一般情形變換是線性的(空間時間均勻):

\[ ct' = A\,ct + B\,x, \qquad x' = D\,ct + E\,x \]

用 SymPy 解出變換係數#

兩個約束:光速不變 ⇒ 光錐 \(x = \pm ct\) 上的點變換後仍在光錐上;原點 \(x'=0\) 滿足 \(x = vt\) ⇒ \(D\,c + E\,v = 0\) 。

import sympy as sp

A, B, D, E, v, c, ct, x = sp.symbols('A B D E v c ct x', nonnegative=True)

# 未知:A, B, D, E。兩約束:
# (1) 光線 x = ct 經變換後仍滿足 x' = c t'
#     ct' = A*ct + B*x = (A + B)*ct ;x' = D*ct + E*x = (D + E)*ct
#     ⇒ D + E = A + B
# (2) x' 對 (x = v t) 點為零: 代入 x = v*ct/c ⇒ ct' 軸 → x' = D*(ct) + E*(v*ct/c) = 0
eq1 = sp.Eq(D + E, A + B)
eq2 = sp.Eq(D + E*v/c, 0)

# 再加「原點在 S' 看來以 -v 運動」的對稱性:B*(ct) + A*(-v*ct/c) = 0
eq3 = sp.Eq(B - A*v/c, 0)

sol = sp.solve([eq1, eq2, eq3], [B, D, E], dict=True)
print(sol)

SymPy 給出 \(B = -\gamma v/c,\ D = -\gamma v/c,\ E = \gamma\) (其中 \(A=\gamma\) 待定之參數)。剩下 \(\gamma\) 由間隔不變性決定:

\[ -c^2dt'^2 + dx'^2 = -c^2dt^2 + dx^2 \;\Rightarrow\; \gamma^2(1 - v^2/c^2) = 1 \]
\[ \boxed{\;\gamma = \frac{1}{\sqrt{1 - v^2/c^2}}\;} \]

最終 Lorentz 變換(沿 \(x\) 方向,速度 \(v\) ):

\[ x' = \gamma(x - vt), \qquad ct' = \gamma\!\left(ct - \frac{v\,x}{c}\right) \]

與 \(y'=y,\ z'=z\) 一起,即完整四維變換。

時間收縮與長度收縮(快速推導)#

時間膨脹(動鐘變慢):同一地點的兩事件在 \(S'\) 中 \(\Delta x'=0\) ,用逆變換可得

\[ \Delta t = \gamma\,\Delta \tau \]

長度收縮(動尺變短):同一參考系中同時 \(\Delta t=0\) 量 rod 兩端,在 \(S\) 看

\[ L = \frac{L_0}{\gamma} \]
g = sp.symbols('gamma', positive=True)
v, c = sp.symbols('v c', positive=True)
g_expr = 1/sp.sqrt(1 - v**2/c**2)
print(sp.limit(g_expr, v, c, dir='+'))   # +oo :速度趨近光速,因子發散
print(g_expr.subs(v, 0.6*c).evalf())     # 1.25
print(g_expr.subs(v, 0.8*c).evalf())     # 1.6667

Minkowski 觀點:雙曲旋轉與快度#

定義快度 \(\varphi\) :

\[ \beta = \frac{v}{c} = \tanh\varphi, \qquad \gamma = \cosh\varphi, \qquad \gamma\beta = \sinh\varphi \]

則 Lorentz 變換可寫成矩陣:

\[ \Lambda(\varphi) = \begin{pmatrix} \cosh\varphi & -\sinh\varphi\\ -\sinh\varphi & \cosh\varphi \end{pmatrix} \begin{pmatrix}ct'\\x'\end{pmatrix} = \Lambda(\varphi)\begin{pmatrix}ct\\x\end{pmatrix} \]

這非常像歐氏旋轉矩陣 \(\begin{pmatrix}\cos\theta & -\sin\theta\\ \sin\theta & \cos\theta\end{pmatrix}\) ,只是 \(\cos \to \cosh,\ \sin \to -\sinh\) ,三角函數被雙曲函數取代,因此叫「雙曲旋轉」。角度 \(\varphi\) 直接把速度「線性化」了:

\[ v = c\tanh\varphi \]

快度的美妙之處:速度合成在快度之下就是加法!兩個速度 \(v_1 = c\tanh\varphi_1\) 與 \(v_2 = c\tanh\varphi_2\) 合成後的快度 \(\varphi = \varphi_1 + \varphi_2\) 。

SymPy 驗證:變換保 \(s^2\)#

import sympy as sp

v, c, ct, x, y, z = sp.symbols('v c ct x y z', positive=True)
beta, phi = sp.symbols('beta phi', positive=True)

# 定義 Minkowski 度量函數
def interval(vec):
    eta = sp.diag(-1, 1, 1, 1)
    return (vec.T * eta * vec)[0]

# Lorentz 變換矩陣(沿 x 方向,以 beta 表示)
g = 1/sp.sqrt(1 - beta**2)
L = sp.Matrix([
    [g,        -g*beta, 0, 0],
    [-g*beta,  g,       0, 0],
    [0,        0,       1, 0],
    [0,        0,       0, 1],
])

X  = sp.Matrix([ct, x, y, z])
Xp = L * X

s2_old = interval(X)
s2_new = interval(Xp)

diff = sp.simplify(sp.expand(s2_new - s2_old))
print(diff)   # 0 :間隔不變!

輸出是 0,即 \(s'^2 = s^2\) 。這就是狹義相對論的核心不變量:所有慣性觀察者對兩事件間隔的測量一致——就像歐氏幾何中所有旋轉對應的「長度」一致一樣。

(驗證矩陣恆等式也有幫助: \(L^T \eta L = \eta\) 。)

eta = sp.diag(-1, 1, 1, 1)
print(sp.simplify((L.T * eta * L) - eta))  # 零矩陣 → Λ 是「Minkowski 正交」矩陣

動手實驗:快度加法與速度合成#

實驗: \(v_1 = 0.5c,\ v_2 = 0.5c\) ,合成速度是多少?

import sympy as sp

c = sp.symbols('c', positive=True)

def velocity_from_rapidity(phi):
    return c * sp.tanh(phi)

def rapidity_from_velocity(v):
    return sp.atanh(v/c)

# 兩段快度
phi1 = rapidity_from_velocity(0.5*c)
phi2 = rapidity_from_velocity(0.5*c)
phi_total = phi1 + phi2

v_total = velocity_from_rapidity(phi_total)
print(sp.simplify(v_total/c))   # 4/5 = 0.8,不是 1.0 !

結果: \(v = 0.8c\) ,不是 \(c\) ! 這就是狹義相對論速度合成公式

\[ v = \frac{v_1 + v_2}{1 + v_1 v_2/c^2} = \frac{0.5c + 0.5c}{1 + 0.25} = 0.8c \]

可用 SymPy 推導這個公式:

v1, v2 = sp.symbols('v1 v2', real=True)
v_sum = (v1 + v2)/(1 + v1*v2/c**2)
print(sp.simplify(sp.tanh(sp.atanh(v1/c) + sp.atanh(v2/c)) * c - v_sum))
# 0 :速度合成公式與雙曲加法等價!

畫出快度 \(\varphi\) 與速度 \(v\) 的關係圖,觀察 \(\varphi\to\infty\) 時 \(v\to c\) 但永不超過:

import numpy as np
import matplotlib.pyplot as plt

phi = np.linspace(0, 5, 200)
v = np.tanh(phi)  # 以 c 為單位

plt.figure(figsize=(6, 4))
plt.plot(phi, v, lw=2)
plt.axhline(1, color='r', ls='--', label='$v=c$(漸近線)')
plt.xlabel('快度 $\\varphi$'); plt.ylabel('$v/c$')
plt.title('$v = c\\,\\tanh\\varphi$')
plt.legend(); plt.grid(alpha=0.3)
plt.show()

小結與練習#

本節重點

  1. 從兩公設推 Lorentz 變換,本質是把 \((ct,x)\) 平面視為 Minkowski 平面。
  2. \(\gamma = 1/\sqrt{1-v^2/c^2}\) ;時間膨脹 \(\Delta t = \gamma\Delta\tau\) ,長度收縮 \(L = L_0/\gamma\) 。
  3. Lorentz 變換 \(=\) 雙曲旋轉,角度為快度 \(\varphi\) ,速度 \(v = c\tanh\varphi\) 。
  4. 間隔 \(s^2\) 是所有慣性觀察者共享的不變量,SymPy 驗證 \(L^T\eta L = \eta\) 與 \(\Delta s^2 = 0\) 。
  5. 速度合成 \(=\) 快度相加,自動解決超光速問題。

練習

  1. 用 SymPy 求證 \(\gamma^2(1 - v^2/c^2) = 1\) ,並算出 \(v=0.9c\) 時的 \(\gamma\) 與 \(L/L_0\) 、 \(T/T_0\) 。
  2. 寫出四維 Lorentz 變換矩陣(含 \(y,z\) ),用 SymPy 驗證 \(L^T\eta L=\eta\) 。
  3. 一束光在 \(S\) 中沿 \(x\) 方向 \(v=c\) 行進。用 Lorentz 變換證明在任意參考系中仍以 \(c\) 行進。
  4. 反向變換:把 \(L\) 中 \(\beta \to -\beta\) 應該得 \(L^{-1}\) ,用 SymPy 乘一乘確認。
  5. 快度加法實驗延伸: \(v_1 = v_2 = 0.9c\) ,合成速度多少?是否仍 \(<c\) ?用 SymPy 數值驗證。