はじめに
SS 433 は、歳差運動するジェットを持つ天体として知られています。ジェットの方向は時間とともに少しずつ変化し、私たちが観測する姿も周期的に変わって見えます。
このような三次元的な動きを理解するためには、天球面上での見かけの運動(固有運動) と、視線方向の運動(ドップラーシフト) をあわせて記述できる数式モデルが必要になります。
本記事では、SS 433 のジェットを「三次元空間でどのように向きを変えているか」という観点から整理し、角度パラメータのみでシンプルに表せるモデルを導出します。
導出した式は、見かけ運動やドップラーシフトの解析にもそのまま接続できる形となっています。
基本的な考え方は SS 433 に関する博士論文(Jeffrey 2016, Oxford) に基づいています。
以降で説明する三次元モデルは、Sakai et al. (2025) で示したモデルと整合しています。論文中で用いた $(\ell, \delta, \alpha)$ 軸は、本記事の $(x, y, z)$ 軸にそれぞれ対応します。なお、ここでの $\alpha$ と $\delta$ は軸の向きを表すための記号であり、赤経 (RA)・赤緯 (Dec) のような天球上の角度座標という意味ではありません。
本記事で使用したコードは、Google Colab の こちら から閲覧できます。
実際の解析や可視化にご活用ください。
三次元歳差モデルの導出
この記事の目的は、SS 433 の歳差運動モデルを三次元的に表現することです。
歳差軸の傾きや位置角は論文によって定義が異なるため、まず「どの軸を基準に観測しているのか」を整理します。
座標系の考え方
下図は、本記事で用いる座標系の概念を示しています。
上図を描くためのコード
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
# === パラメータ設定 ===
chi = np.deg2rad(98.2) # 歳差軸の方位角 χ(Stirling et al. 2002)
inc = np.deg2rad(78.83) # 歳差軸の傾斜角 i(Gies et al. 2002)
theta = np.deg2rad(19.85) # コーンの半開き角 θ(Gies et al. 2002)
s_rot = -1 # 歳差運動の回転方向(Hjellming & Johnston 1981)
# --- 標準の回転行列(右手系) ---
def Rx(theta):
"""x軸まわりの右手系回転行列"""
return np.array([
[1, 0, 0],
[0, np.cos(theta), -np.sin(theta)],
[0, np.sin(theta), np.cos(theta)]
])
def Ry(theta):
"""y軸まわりの右手系回転行列"""
return np.array([
[np.cos(theta), 0, np.sin(theta)],
[0, 1, 0],
[-np.sin(theta),0, np.cos(theta)]
])
def draw_angle(ax, origin, a, b, radius=0.2, n_points=50, label=None, color='k'):
"""
2ベクトル a, b のなす角を円弧で描く(3D)
"""
a = a / np.linalg.norm(a)
b = b / np.linalg.norm(b)
axis = np.cross(a, b)
axis /= np.linalg.norm(axis)
angle = np.arccos(np.clip(np.dot(a, b), -1, 1))
ts = np.linspace(0, angle, n_points)
arc_points = np.array([
np.cos(t)*a + np.sin(t)*np.cross(axis, a) + (1-np.cos(t))*np.dot(axis, a)*axis
for t in ts
]) * radius
ax.plot(origin[0] + arc_points[:,0],
origin[1] + arc_points[:,1],
origin[2] + arc_points[:,2],
color=color, lw=1.5)
if label:
mid = arc_points[len(ts)//3]
ax.text(*(origin + mid*1.3), label, color=color, fontsize=12, ha='center', va='center')
# --- SS 433 の角度設定 ---
# 歳差軸の方位角 χ と傾斜角 i から、視線方向への回転を求める。
theta_x = -(chi - np.pi/2)
theta_y = -(np.pi/2 - inc)
R_yx = Ry(theta_y) @ Rx(theta_x)
R_viz = R_yx.T # 可視化用(転置で変換)
# === 座標変換関数(y軸を上、z軸を左にする表示系) ===
def to_yup_frame(vecs):
"""(x, y, z) → (x, z, -y) に変換して、天文画像と同じ向きで表示"""
return np.array([vecs[0], vecs[2], -vecs[1]])
# --- 観測者系とジェット系の基底ベクトル ---
e_tilde = np.eye(3) # 観測者座標系(LOS, Dec, RA)
e = R_viz @ e_tilde # ジェット座標系
e_tilde_disp = to_yup_frame(e_tilde)
e_disp = to_yup_frame(e)
# === コーン軌道の生成 ===
psi = np.linspace(0, 2*np.pi, 200) # 歳差位相(0〜2π)
i, ch = inc, chi
th = theta
# --- 歳差運動ベクトル n(t) の各成分(観測者系での表現)---
nx = np.cos(i)*np.cos(th) + np.sin(i)*np.sin(th)*np.cos(psi)
ny = (np.cos(ch)*(np.sin(i)*np.cos(th) - np.cos(i)*np.sin(th)*np.cos(psi))
+ s_rot*np.sin(ch)*np.sin(th)*np.sin(psi))
nz = (np.sin(ch)*(np.sin(i)*np.cos(th) - np.cos(i)*np.sin(th)*np.cos(psi))
- s_rot*np.cos(ch)*np.sin(th)*np.sin(psi))
n_vec = np.vstack([nx, ny, nz])
n_disp = to_yup_frame(n_vec)
# === 4つの視点 ===
angles = [
(195, 165), # メインビュー:右上から見下ろす(コーン形が最も立体的に見える)
(90, 180), # 上面図(真上から)
(180, 180), # 正面(真下から)
(15, 100), # 反対側のサイドビュー(やや下から見上げる)
]
fig = plt.figure(figsize=(12, 12))
for idx, (elev, azim) in enumerate(angles, 1):
ax = fig.add_subplot(2, 2, idx, projection="3d")
# --- 観測者座標系(灰色) ---
for i, label in enumerate([r'$\tilde{e}_x$ (LOS)', r'$\tilde{e}_y$ (Dec)', r'$\tilde{e}_z$ (RA)']):
ax.quiver(0, 0, 0, e_tilde_disp[0,i], e_tilde_disp[1,i], e_tilde_disp[2,i],
color='gray', alpha=0.3, arrow_length_ratio=0.1, linewidth=2)
ax.text(1.1*e_tilde_disp[0,i], 1.1*e_tilde_disp[1,i], 1.1*e_tilde_disp[2,i],
label, color='gray', fontsize=12, ha='center', va='center')
# --- ジェット座標系(赤・緑・青) ---
colors = ['red', 'green', 'blue']
labels = [r'$e_x$', r'$e_y$', r'$e_z$']
for i, (color, label) in enumerate(zip(colors, labels)):
ax.quiver(0, 0, 0, e_disp[0,i], e_disp[1,i], e_disp[2,i],
color=color, arrow_length_ratio=0.1, linewidth=3)
ax.text(1.15*e_disp[0,i], 1.15*e_disp[1,i], 1.15*e_disp[2,i],
label, color=color, fontsize=12, ha='center', va='center')
# --- 歳差運動の円錐軌道 ---
ax.plot(n_disp[0], n_disp[1], n_disp[2], color='tab:blue', lw=2, label='approaching')
ax.plot(-n_disp[0], -n_disp[1], -n_disp[2], color='tab:red', lw=2, label='receding')
# --- 回転方向(矢印で可視化) ---
step = 25
for k in range(0, len(psi)-step, step*2):
# approaching 側(青)
ax.quiver(n_disp[0,k], n_disp[1,k], n_disp[2,k],
n_disp[0,k+step]-n_disp[0,k],
n_disp[1,k+step]-n_disp[1,k],
n_disp[2,k+step]-n_disp[2,k],
color='tab:blue', lw=1.5, arrow_length_ratio=0.4)
# receding 側(赤、逆方向)
ax.quiver(-n_disp[0,k], -n_disp[1,k], -n_disp[2,k],
-(n_disp[0,k+step]-n_disp[0,k]),
-(n_disp[1,k+step]-n_disp[1,k]),
-(n_disp[2,k+step]-n_disp[2,k]),
color='tab:red', lw=1.5, arrow_length_ratio=0.4)
# --- 基準面と枠線 ---
xx, yy = np.meshgrid(np.linspace(-1, 1, 2), np.linspace(-1, 1, 2))
zz = np.zeros_like(xx)
ax.plot_surface(xx, yy, zz, color='lightgray', alpha=0.2, zorder=-1)
r = [-1, 1]
points = np.array(list(product(r, r, r)))
points_disp = to_yup_frame(points.T).T
for s, e_ in combinations(points_disp, 2):
if np.sum(np.abs(s - e_)) == 2:
ax.plot3D(*zip(s, e_), color="black", alpha=0.3, lw=0.6)
# --- 各角度の弧を描画(i, θ, χ) ---
draw_angle(ax, origin=np.zeros(3),
a=e_tilde_disp[:,0], b=e_disp[:,2],
radius=0.4, label=r"$i$", color='tab:purple')
draw_angle(ax, origin=np.zeros(3),
a=e_disp[:,2], b=n_disp[:,0],
radius=0.25, label=r"$\theta$", color='tab:orange')
proj_axis = e_disp[:,2].copy(); proj_axis[0] = 0
draw_angle(ax, origin=np.zeros(3),
a=e_tilde_disp[:,2], b=proj_axis,
radius=0.35, label=r"$\chi$", color='tab:green')
# --- 表示設定 ---
ax.set_xlim([-1, 1])
ax.set_ylim([-1, 1])
ax.set_zlim([-1, 1])
ax.set_box_aspect([1, 1, 1])
ax.set_proj_type('persp')
ax.set_xticks([]); ax.set_yticks([]); ax.set_zticks([])
ax.grid(False)
ax.set_facecolor('white')
ax.view_init(elev=elev, azim=azim)
ax.legend(loc='upper left')
plt.tight_layout()
plt.subplots_adjust(wspace=-0.1, hspace=-0.1)
plt.show()
色付きの軸が歳差運動を定義するジェット座標系です。
歳差角の半開角を $\theta$ とし、近づくジェット(青)と遠ざかるジェット(赤)が円錐状に回転します。
私たちはこの構造を視線方向(LOS)から観測するため、観測者の座標系に変換して考える必要があります。
観測者座標との対応
観測者の座標系では以下のように定義します:
- $\tilde{e}_x$:視線方向(LOS)
- $\tilde{e}_z$:赤経方向(RA)
- $\tilde{e}_y$:赤緯方向(Dec)
このとき、歳差軸の方向は 傾斜角 $i$ と 位置角 $\chi$ で決まります。
回転行列
次に、これらの角度を使って歳差軸を回転させるための回転行列を導入します。
ここでは、
- 視線方向($x$ 軸)まわりの回転
- 天球上の赤緯方向($y$ 軸)まわりの回転
を順に考えます。
これらを右手系で定義すると、回転行列は次のように表せます:
R_x^{(R)}(\theta) =
\begin{pmatrix}
1 & 0 & 0\\[4pt]
0 & \cos\theta & -\sin\theta\\[4pt]
0 & \sin\theta & \cos\theta
\end{pmatrix},\qquad
R_y^{(R)}(\theta) =
\begin{pmatrix}
\cos\theta & 0 & \sin\theta\\[4pt]
0 & 1 & 0\\[4pt]
-\sin\theta & 0 & \cos\theta
\end{pmatrix}.
SS 433 の角度パラメータを適用
SS 433 の幾何で用いられる角度パラメータに置き換えます。
$x$軸まわりの回転角を $\chi-\frac{\pi}{2}$(位置角)、$y$軸まわりの回転角を $i-\tfrac{\pi}{2}$(傾斜角)とすると、それぞれの行列は次のようになります:
R_x^{(R)}\!\left(-(\chi-\tfrac{\pi}{2})\right)=
\begin{pmatrix}
1 & 0 & 0\\[4pt]
0 & \sin\chi & -\cos\chi\\[4pt]
0 & \cos\chi & \sin\chi
\end{pmatrix},\qquad
R_y^{(R)}\!\left(-(\tfrac{\pi}{2}-i)\right)=
\begin{pmatrix}
\sin i & 0 & -\cos i\\[4pt]
0 & 1 & 0\\[4pt]
\cos i & 0 & \sin i
\end{pmatrix}.
なぜ角度にマイナスを付けるのか
これから行おうとしていることは座標軸そのものを回転させる操作です。
回転行列 ($R_x^{(R)}(\theta)$)、($R_y^{(R)}(\theta)$) は、もともと右手系でベクトルを反時計回りに回す定義ですが、
同じ回転を回転後の座標系の側から見た場合は、逆向き(時計回り)の回転になります。
そのため、角度にマイナスを付けて表しています。
座標変換
ここでは、基準となる三次元座標系から、観測者の視線方向を基準とした座標系へと変換を行います。
この変換は、2段階の回転操作で表されます。
- 位置角 $\chi$ の回転(天球上の方位を定める)
- 傾斜角 $i$ の回転(ジェット軸を観測者方向に傾ける)
なぜこの順序なのか?
回転操作は、一度回転した座標系を基準に次の回転を重ねるため、順番を入れ替えると最終的な軸の向きが変わってしまいます。
もし傾斜角 $i$ を先に回すと、位置角 $\chi$ の回転軸がすでに傾いた方向になり、意図した「天球上での方位」にならなくなります。
そのため、まず位置角 $\chi$、次に傾斜角 $i$ の順で回転を適用します。
基準となる直交基底を
\tilde{\mathbf{e}} =
\begin{pmatrix}
e_\tilde x\\
e_\tilde y\\
e_\tilde z
\end{pmatrix}
とし、回転後の基底を
\mathbf{e} =
\begin{pmatrix}
e_x\\
e_y\\
e_z
\end{pmatrix}
とします。
このとき、回転行列を
R_{yx}^{(R)} \equiv R_y^{(R)}\!\bigl(-(\tfrac{\pi}{2}-i)\bigr)\;
R_x^{(R)}\!\bigl(-(\chi-\tfrac{\pi}{2})\bigr)
=
\begin{pmatrix}
\sin i & -\cos i\,\cos\chi & -\cos i\,\sin\chi\\[6pt]
0 & \sin\chi & -\cos\chi\\[6pt]
\cos i & \ \sin i\,\cos\chi & \ \sin i\,\sin\chi
\end{pmatrix}.
と定義すると、両者の関係は次のように表せます:
\mathbf{e}=R_{yx}^{(R)} \tilde{\mathbf{e}}.
ここでの変換は、基準系($\mathbf{e}$系)から、観測者視線を基準とした座標系($\tilde{\mathbf{e}}$系)への回転を意味します。
基準座標系で歳差運動を定義
さて、本題の歳差運動モデルの構築になります。
基準系($\mathbf{e}$系)で歳差運動を定義しておいて、後から観測者方向基準系($\tilde{\mathbf{e}}$系)へ変換することを考えます。
基準系における歳差運動ベクトルは次式で表されます:
\begin{aligned}
\mathbf{n}(t)^\top \mathbf{e}
&=
\begin{pmatrix}
\sin\theta \cos (s_\mathrm{rot}\psi(t)) &
\sin\theta \sin(s_\mathrm{rot}\psi(t)) &
\cos\theta
\end{pmatrix}\mathbf{e}.\\
&=\begin{pmatrix}
\sin\theta \cos\psi(t) &
s_\mathrm{rot}\sin\theta \sin\psi(t) &
\cos\theta
\end{pmatrix}\mathbf{e}.
\end{aligned}
ここで
- $\theta$:ジェット円錐の半開口角(約 $20^\circ$)
- $\psi(t)$:歳差運動の位相角1。
- $s_\mathrm{rot}$:歳差運動の回転方向を示す符号。
右手系で、親指を歳差軸の正方向に立てたとき、他の指がカールする向きに回転する場合を $s_\mathrm{rot}=+1$、反対向きに回転する場合を $s_\mathrm{rot}=-1$ と定義。
(SS 433 では $s_\mathrm{rot}=-1$)
を表します。
歳差ベクトル $\mathbf{n}(t)$ を観測者方向基準の $\tilde{\mathbf{e}}$系へ変換すると、次のように展開されます:
\begin{aligned}
\mathbf{n}(t)^\top\mathbf{e} &=\mathbf{n}(t)^\top R_{yx}^{(R)} \tilde{\mathbf{e}} \\
&=\begin{pmatrix}
\sin\theta \cos\psi(t)\\[4pt]
s_\mathrm{rot}\sin\theta \sin\psi(t)\\[4pt]
\cos\theta
\end{pmatrix}^\top
\begin{pmatrix}
\sin i & -\cos i\,\cos\chi & -\cos i\,\sin\chi\\[4pt]
0 & \sin\chi & -\cos\chi\\[4pt]
\cos i & \ \sin i\,\cos\chi & \ \sin i\,\sin\chi
\end{pmatrix}\tilde{\mathbf{e}}\\
&=
\begin{pmatrix}
\cos i\cos\theta+\sin i\sin\theta\cos\psi(t)\\[4pt]
\cos\chi(\sin i\cos\theta-\cos i\sin\theta\cos\psi(t))
+s_\mathrm{rot}\sin\chi\,\sin\theta\sin\psi(t)\\[4pt]
\sin\chi(\sin i\cos\theta-\cos i\sin\theta\cos\psi(t))
-s_\mathrm{rot}\cos\chi\,\sin\theta\sin\psi(t)
\end{pmatrix}^\top
\tilde{\mathbf{e}}.
\end{aligned}
各方向の速度成分(観測者方向基準系)
歳差ベクトルにジェット速度の大きさ $\beta = v/c$(ここで $v$ はジェット速度、$c$ は光速)を掛けることで、観測者方向を基準に取った三次元座標系($\tilde{\mathbf{e}}$ 系) における各軸方向の速度成分 $(\beta_x, \beta_y, \beta_z)$ を求めることができます。
SS 433 のジェットは中心から対称的に双対で放出されるため、全ての成分に対して符号を反転させることで、近づく側($+$)と遠ざかる側($-$)の両方を表現できます。
したがって、各軸方向の速度成分は次のように与えられます:
\left\{
\begin{aligned}
\beta_x(t) &= \pm\beta[\cos i\cos\theta+\sin i\sin\theta\cos\psi(t)]\\[4pt]
\beta_y(t) &= \pm\beta[\cos\chi(\sin i\cos\theta-\cos i\sin\theta\cos\psi(t))
+s_\mathrm{rot}\sin\chi\,\sin\theta\sin\psi(t)]\\[4pt]
\beta_z(t) &= \pm\beta[\sin\chi(\sin i\cos\theta-\cos i\sin\theta\cos\psi(t))
-s_\mathrm{rot}\cos\chi\,\sin\theta\sin\psi(t)]
\end{aligned}
\right.
補足:ジェットの呼称と観測的対応
SS 433 のジェットは、三次元的に表すことで位置情報やドップラーシフト(速度情報)とも対応づけて議論できるようになります。
文献によって呼び方はさまざまですが、一般に符号「$+$」は観測者に近づくジェット(approaching jet、east jet、blue jet、jet)を、
「$-$」は遠ざかるジェット(receding jet、west jet、red jet、counter-jet)を表します。
天球上での見かけ運動
ここで求めた三次元速度ベクトルは、空間上での実際の運動を表しています。
一方、観測では光の到達時間の違いによる 光行差(light-travel-time effect) の影響を受けるため、
近づくジェットからの光は早く届き、遠ざかるジェットからの光は遅れて届くなど、
実際とはわずかに異なる見かけの運動として観測されます。
本節では、この光行差の効果を簡単に整理します。
見かけ速度の一般式
見かけ速度の導出については、以下の記事で解説しています:
最終的に得られる式は次のようになります:
\beta_{\rm app} = \frac{\beta \sin\alpha}{1 - \beta \cos\alpha}.
ここでのパラメータの定義は以下の通りです:
-
$\beta = v / c$:ジェットの真の速度
-
$\alpha$:視線方向との角度($0^\circ \leq \alpha \leq 180^\circ$)
- $\alpha = 0^\circ$:観測者に向かう方向
- $\alpha = 90^\circ$:天球面上を横切る方向
- $\alpha = 180^\circ$:観測者から遠ざかる方向
見かけ速度の成分表示
三次元座標で記述された歳差運動のうち、速度ベクトルの天球面上の成分($\beta_z, \beta_y$)に対応する見かけ速度($\beta_{z,{\rm app}}, \beta_{y,{\rm app}}$)は、視線方向の速度成分 $\beta_x$ を用いて次のように表されます:
\left\{
\begin{aligned}
\beta_{z,{\rm app}}(t) &= \frac{\beta_z(t)}{1 - \beta_x(t)},\\[4pt]
\beta_{y,{\rm app}}(t) &= \frac{\beta_y(t)}{1 - \beta_x(t)}.
\end{aligned}
\right.
光行差を時間補正として扱う解析
なお、ここで示した式は見かけ速度という形で表していますが、実際の観測解析では、光行差の影響を時間軸側に補正項として取り入れることもあります。
例えば、歳差運動や噴出時刻を詳細に追跡する研究(例:Roberts et al. 2010, Bell et al. 2011)では、「いつ放射されたジェットなのか」という時間的対応を重視するため、この補正を考慮した解析手法が用いられています。
三次元モデルから求めるドップラーシフト
視線方向の速度成分 $\beta_z$ を用いることで、ドップラーシフトを求めることができます。
SS 433 のジェットは相対論的な速度(光速の約26%)で運動しているため、相対論的ドップラー効果 を考慮する必要があります。
赤方偏移 $z$ は、ローレンツ因子 $\gamma = (1 - \beta^2)^{-1/2}$ を使うと次のように書けます:
1 + z = \gamma(1 - \beta \cos\alpha).
これを $z$ 軸方向の速度成分 $\beta_x$ で書き換えると:
\begin{aligned}
z(t) &= \gamma\bigl[1 - \beta_x(t)\bigr] - 1 \\
&= \gamma \bigl[1 \mp \beta (\cos i \cos\theta + \sin i \sin\theta \cos\psi(t))\bigr] - 1.
\end{aligned}
ここで、符号 $\mp$ は $-$ が近づくジェット(approaching jet)、$+$ が遠ざかるジェット(receding jet)を表します。
この式により、歳差運動に伴う $\psi(t)$ の周期的変化が、SS 433 における赤方偏移・青方偏移の周期的挙動として現れることを、三次元的幾何の枠組みから説明することができます。
相対論的ドップラー効果の導出や直感的な理解については、こちらの記事でも紹介しています:
観測量と三次元モデルの対応
今回導入した三次元歳差モデルの面白さは、スペクトルで得られるドップラー速度(運動)と、電波画像などで見えるジェットの形(構造)を、同じ枠組みの中で行き来しながら多角的に理解できる点にあります。
例えば、このモデルではドップラーシフト($z(t)$)と天球上での見かけ運動($\beta_z(t),\beta_y(t)$)が同じ $\beta_x(t)$ によって結びついているため、光学スペクトルから得たドップラー速度をもとにジェットの空間的位置を推定し、数十〜百日後の電波画像との整合性を検証するといった解析にも応用できます(参考: Blundell et al. 2005)。
また、観測量から算出したジェット速度を用いて、幾何モデルとの対応を確認することにも利用できます(参考: 天体ジェットの速度と放射角度の決定法)。
おわりに
本記事では、SS 433 の歳差運動を三次元的に表現するための数式モデルを導出し、
「どの軸を基準にして」「どの順に回転を適用するのか」という幾何的な整理を行いました。
ここで導いた式は、見かけ速度やドップラーシフトの解析にもそのまま利用でき、
スペクトル情報と画像情報を同じ幾何モデルで扱うことができます。
SS 433 のような歳差運動するジェットでは、構造の変化とドップラー速度の周期が密接に関係しています。
今回のモデルが、ジェットの軌道計算やドップラーシフト解析の理解に役立てば幸いです。
-
歳差周期は $P_\mathrm{prec} \simeq 162\,\mathrm{d}$、基準時刻を $t_\mathrm{ref,prec}$ とする。
歳差位相を $\phi_\mathrm{prec} = (t - t_\mathrm{ref,prec}) / P_\mathrm{prec}$ としたとき、$\psi(t) = 2\pi \phi_\mathrm{prec}$ と表される。
本記事では、近づくジェット(approaching jet)が最も観測者側に傾く時を $\phi_\mathrm{prec}=0$ としている。なお、歳差位相の基準位相の定義は文献によって異なるため、過去の研究と比較する際には注意が必要である(詳細はこちらの記事をご覧ください)。 ↩