Calculation Trace Viewer — Layer A: 惑星位置計算

本ビューでは、実装上は関数に吸収される処理も、計算過程の理解と検証のために段階的に表示しています。
これは最適化されたコード表現ではなく、数学的な導出と実装可能な中間ステップを対応させるための表示です。

BSP ファイルを読み込み中…

Layer A 計算パイプライン

全体の流れ
暦日時(UTC) → A-1 → JD(TDB) → A-2 → ICRS XYZ(km) → A-3 → 黄経・黄緯(°)
A-1:時刻系変換(UTC → TDB)。BSP ファイルは TDB(太陽系力学時)を入力として要求する。
A-2:BSP チェーン解決。NAIF コード + JD(TDB) → ICRS 位置ベクトル(km)。
A-3:ICRS(赤道系)→ J2000.0 黄道座標への回転変換。黄経・黄緯を得る。

A-1 — 時刻系変換サマリー(UTC → TDB → T)

① 入力値
読み込み中…
UTC:協定世界時。JST から −9時間変換済み。
⑤ 出力(Stella-JS 実測値)
計算中…
詳細な導出過程(Step 0〜3 全展開・中間値)は trace_jd_tdb.html を参照。
このページでは JD(TDB) を A-2 以降の入力値として使用する。

A-2 — BSP チェーン解決(SSB 起点の合成)

② 定義
$$\vec{r}(\text{target} / \text{Earth}) = \vec{r}(\text{target} / \text{SSB}) - \vec{r}(\text{Earth} / \text{SSB})$$
BSP ファイル(de440s.bsp)は各天体を「SSB(太陽系重心)相対」または「中間天体相対」のセグメントで格納している。
天体を地球(Earth, 399)相対で得るには、セグメントチェーンを辿って SSB 起点の位置を合成し、差し引く。
ICRS(国際天球参照座標系):J2000.0 地球赤道を基準とした直交座標系。単位は km。
用語定義:NAIF ID と EMB
JPL の BSP(SPK)ファイルでは、各天体を NAIF ID(整数)で識別する。主な ID は以下の通り:
NAIF ID天体名略称
0Solar System Barycenter(太陽系重心)SSB
3Earth-Moon Barycenter(地球-月系の重心)EMB
10Sun(太陽)—
301Moon(月)—
399Earth(地球の中心)—
EMB(ID=3)とは地球と月の質量加重平均位置(重心)で、地球内部(地球半径の約 3/4)に位置する。
de440s.bsp には SSB→EMB(3) と EMB(3)→Earth(399)、EMB(3)→Moon(301) のセグメントが収録されており、
地球・月の絶対位置(SSB 相対)を得るには必ず EMB を中継する2段チェーンが必要になる。
BSP ファイルのセグメント一覧(de440s.bsp)
読み込み中…
各セグメントは target の位置を center 相対で Chebyshev 多項式として格納している。
SPK Type 2:位置のみ。Type 3:位置 + 速度。どちらも位置の取得に対応。

太陽(NAIF: 10)の位置(Earth 相対)

① 入力値
$\text{JD(TDB)} = $ …,ターゲット:太陽(10),基準:地球(399)
③ 代入:チェーン解決(各段の ICRS XYZ)
計算中…
太陽(10):SSB→Sun の直接セグメントあり → 1段で取得。
地球(399):SSB→Earth の直接セグメントなし → SSB→EMB(3)→Earth(399) の2段チェーンで合成。
最終値 = 太陽/SSB − 地球/SSB。
⑤ 出力:ICRS XYZ(太陽 / 地球, km)
…

月(NAIF: 301)の位置(Earth 相対)

① 入力値
$\text{JD(TDB)} = $ …,ターゲット:月(301),基準:地球(399)
③ 代入:チェーン解決(各段の ICRS XYZ)
計算中…
月(301):直接セグメントは EMB(3)→Moon(301) のみ → SSB→EMB→Moon の2段で SSB 起点合成。
地球(399):SSB→EMB(3)→Earth(399) の2段チェーン(太陽計算と共通のセグメント)。
最終値 = 月/SSB − 地球/SSB。
⑤ 出力:ICRS XYZ(月 / 地球, km)
…

A-3 — ICRS XYZ → J2000.0 黄道座標変換

② 定義・公式
$$\begin{pmatrix} x_e \\ y_e \\ z_e \end{pmatrix} = R_x(+\varepsilon_0)\,\begin{pmatrix} x \\ y \\ z \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\varepsilon_0 & \sin\varepsilon_0 \\ 0 & -\sin\varepsilon_0 & \cos\varepsilon_0 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \end{pmatrix}$$ $$\lambda = \operatorname{atan2}(y_e,\,x_e) \bmod 360°,\quad \beta = \arcsin\!\left(\frac{z_e}{r}\right),\quad r = \sqrt{x_e^2 + y_e^2 + z_e^2}$$
$\varepsilon_0 = 84381.406''$ の出典
IAU 2006 歳差理論(Hilton et al. 2006)で定義された、J2000.0 時点(2000年1月1.5日 TT)の平均黄道傾斜角の定数値。
一般式は $\varepsilon_0 = 84381.406'' - 46.836769''\,T - \cdots$($T$ は J2000.0 からのユリウス世紀数)であり、
$T = 0$(J2000.0 そのもの)を代入すると第1項だけが残り $84381.406''$ となる。
$84381.406'' \div 3600''/° = 23.43927944°$。この値は Stella-JS でも固定定数として使用している。

ICRS の $x$ 軸は春分点方向、$z$ 軸は J2000.0 天の北極方向。$R_x(+\varepsilon_0)$ は $x$ 軸まわりの回転行列。
$\lambda$:黄経(0°〜360°),$\beta$:黄緯,$r$:距離(入力と同単位・km)。

atan2 について
通常の $\arctan(y/x)$ は $(-90°, +90°)$ の範囲しか返せず、$x < 0$ のときに象限を誤る。
$\operatorname{atan2}(y,\, x)$ は $x$・$y$ の符号をそれぞれ見て象限を正しく判定し、$(-180°, +180°]$ を返す。
さらに $\bmod\,360°$ で $[0°, 360°)$ に正規化することで、黄経として扱える値が得られる。
JavaScript では Math.atan2(ye, xe)(ラジアン)を度数に変換し、(deg + 360) % 360 で正規化している。

太陽の黄経・黄緯

③④ 代入・中間値(A-2 出力 → A-3)
計算中…
⑤ 出力
…

月の黄経・黄緯

③④ 代入・中間値(A-2 出力 → A-3)
計算中…
⑤ 出力
…

A-4 — 月の 32 arcsec 差の要因追跡

✅ 原因特定済み(2026-06-11):UTC vs TDB の時刻系ズレ
verify_layer_a.mjs で全天体を Horizons と比較した結果、差分は天体の角速度に比例していた。
天体実測差予測差(64.18秒 × 角速度)角速度
太陽2.73 arcsec2.64 arcsec0.0411 arcsec/s
月32.15 arcsec35.2 arcsec0.549 arcsec/s
根本原因:Stella-JS は dateToJd() → jdUtcToTdb() で UTC → TDB(+64.18秒)変換するが、 Horizons への入力は UTC のまま。この 64秒のズレが月の速度(0.549 arcsec/s)に乗じて 〜32 arcsec に増幅される。
太陽も同じ原因で 〜2.7 arcsec ずれており、Stella-JS の BSP チェーン解決に誤りはない。
参考:チェーン各段の ICRS XYZ(展開)
計算中…
BSP チェーン(SSB→EMB→Moon, SSB→EMB→Earth)各段の XYZ を展開。
Horizons との数値比較は verify_layer_a.mjs を Node.js で実行(ブラウザ CORS 制約のため直接不可)。

A-5 — 光行時補正(LT correction)のステップ

② 定義
$$\tau = \frac{r}{c},\quad c = 299792.458\;\text{km/s}$$ $$\text{JD}_\text{emit} = \text{JD(TDB)} - \frac{\tau}{86400}$$
光行時補正:天体が現在位置ではなく、光が発せられた過去の位置を使うための補正。
$r$:天体と地球の距離(km),$c$:光速(km/s),$\tau$:光の飛行時間(秒)。
Stella-JS は現在「補正なし(幾何学的位置)」を採用。事前実験で太陽の差分は 0.005 arcsec(verify済み)。
③ 代入(太陽)
計算中…
③ 代入(月)
計算中…
⑤ 出力まとめ
計算中…
黄経シフト推定は角速度の概算(太陽 ≈ 1°/日、月 ≈ 13.2°/日)を使った上限値。
光行時補正後の正確な位置は反復法が必要(補正後の距離で τ を再計算)。

A-6 — J2000.0 黄道 → of-date 黄道変換(歳差・章動)

② 定義・背景
A-3 で得た黄経は J2000.0 黄道フレーム(固定座標系)の値。 実用的な占星術・天文計算では、観測時点の黄道面(of-date)を使う。
両者の差は主に 歳差(地球の自転軸が約 26,000 年周期でコマのように回る現象)と 章動(約 18.6 年周期の小さな揺らぎ)による。
2026年頃では J2000.0 から約 26 年 → 歳差量 ψ_A ≈ 5038″ × 0.26T ≈ 1310″ ≈ 0.364°。
② 公式①(スカラー近似)
$$\psi_A = 5038.481507''\,T - 1.0790069''\,T^2 - 0.00114045''\,T^3 \quad \text{[arcsec]}$$ $$\lambda_\text{of-date} \approx \lambda_\text{J2000} + \frac{\psi_A}{3600°}$$
IAU 2006 一般歳差(Capitaine et al. 2003)の黄経成分 ψ_A を黄経にスカラー加算する簡易近似。
黄緯補正・章動を省略するため 精度 ±0.01°(≈ 36 arcsec)。
Stella-JS の precessLongitude(lonJ2000, jd) が対応。
② 公式②(完全 3D 変換)
$$P = R_3(\chi_A)\cdot R_1(-\omega_A)\cdot R_3(-\psi_A)\cdot R_1(\varepsilon_0)$$ $$\vec{r}_\text{平均赤道} = P\,\vec{r}_\text{ICRS},\quad \vec{r}_\text{真黄道} = R_1(+\varepsilon_\text{true})\cdot N\cdot\vec{r}_\text{平均赤道}$$
IAU 2006 Capitaine 3角度歳差(ψ_A・ω_A・χ_A)で構成した歳差行列 P を ICRS XYZ に直接適用し、 さらに IAU 2000B 全 77 項の章動(ΔΨ・Δε)を加えた 完全 3D 変換。
精度 < 0.002 arcsec(JPL Horizons との比較で確認済み)。
Stella-JS の icrsToEcliptic(x, y, z, jd) が対応。J2000.0 を経由せず ICRS XYZ から直接変換する。
③④ 代入・比較
計算中…
⑤ 出力まとめ
計算中…
スカラー近似と完全 3D の差が章動成分(ΔΨ sin ε)に相当する。
章動は黄経に最大 ±17.2 arcsec(大章動項)の振れを生じる。