---
title: "重算 Kepler-289 的二十五次真实凌星时刻"
description: "从作者表选择实测时刻，联合拟合质量与自由偏心率，检查会合分量、剩余散布和先验敏感性。"
canonical_url: "https://sandboxphysics.com/zh/stories/transit-timing/kepler289-timing-tutorial/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/transit-timing/kepler289-timing-tutorial/"
last_modified: "2026-10-28"
---

[从行星轨道读到凌星计时](https://sandboxphysics.com/zh/stories/transit-timing/)

L3 · 凌星计时变化

# 重算 Kepler-289 的二十五次真实凌星时刻

Sandbox Physics · 2026-10-28

打开 Greklek-McKeon 等人的 arXiv:2208.00022v1 表一，以及出版社原始 MRT。沿下面步骤取出外面一对行星的二十五次实测时刻，比较两种明确的谐波模型，并看清条件质量区间变窄之后，为什么模型差异仍然很大。

## 开始前需要什么

前三章介绍了轨道、钟表与偏心率退化。基本脚本只需 Python 3.9 以上及标准库；完整后验实验属于较长的离线计算，核读已保存链则快得多。

## 先认清表一里的两类时刻

ajac8553t1\_mrt.txt 依次列出行星名、编号、实测中心时刻与误差，再列预测时刻和另一种误差。观测栏为空，就表示这一行没有测量；预测误差属于动力学预报，不能当成望远镜又测了一次。

原 revision1 文件为二万五千零五十八字节，下载的出处文件保存完整 SHA256，筛选前必须通过校验。四百六十六行里，只有五十一行同时给出观测时刻与正的观测误差，其余四百一十五行只有预测。提取文件保留全部五十一次测量，方便检查。

原表还有两个要处理的问题。编号栏实际从头到尾连续计数，尽管说明称它为凌星圈号；b、d、c 分别扣去零、二百五十九、三百九十五，才能得到各自行星圈号。论文描述了二〇二一年 WIRC 遮星，但第430行观测栏为空，不能拿它的预测补上；二〇一九年那次则有实测四千七百一十九点七四一一天，误差零点零零二六天。

对应阅读：Greklek-McKeon et al. · Greklek-McKeon et al.

## 两次拟合冻结同一份实测样本

选现在称为 Kepler-289d、Kepler-289c 的外面一对，只保留观测时刻及误差均非空、约化 BJD 小于三千的行。得到中间行星十五次、外行星十次 Kepler 测时。两种似然都使用这二十五个值和原误差，不按残差好坏删点。

比较旧文献时还要留心名字：二〇一四年的 PH3c 是今天中间的 Kepler-289d，PH3d 则是今天外面的 Kepler-289c。跨版本阅读时，周期与轨道内外次序比单独一个字母更可靠。

时间保留原文的 BJD 减去二四五四〇〇〇，以天计。MRT 标为 JD，拿到的正文也未说明 UTC 或 TDB，因此不自行补转换。四位小数天的时刻分辨率为八点六四秒，这与表中给出的测时误差是两回事；共同光度形状拟合引入的时间协方差没有提供。

```
            python3 verify-observations.py --input .
          
```

对应阅读：Greklek-McKeon et al. · Schmitt et al. · Greklek-McKeon et al.

## 把钟表留在反演里面

画图时，可以拟合加权线性历表，再画提前与推迟，并标原测时误差。质量似然本身使用原始时刻；若把估计钟表后的残差当成一组新的独立测量，就会漏掉拟合钟引入的相关性。

联合参数共九个：两个质量、自由偏心组合的实虚分量、每颗行星的周期与中心线性历表起点，以及一个共同的正白噪声散布。中心起点是第十圈与第五圈的名义钟表时刻，实际遮星还要加上摄动；这样定中心可减少起点与周期的采样相关。

换算地球质量时固定采用一点零八太阳质量；这里没有再传播其已发表误差。动力学直接约束的是行星与恒星的质量比，所以绝对质量仍条件于采用的恒星尺度。

$$
\vartheta=(m_d,m_c,\operatorname{Re}Z_{\rm free},\operatorname{Im}Z_{\rm free},T_{d,10},T_{c,5},P_d,P_c,s)
$$

周期、起点、误差和额外散布都以天计，两个质量以地球质量计。表一中的任何光度预测，都没有拿来作为这些参数的先验。

对应阅读：Lithwick · Greklek-McKeon et al.

## 先写明谐波模型与先验

基本计算保留八个零自由偏心率会合谐波，再只加慢频率处的自由偏心率修正。仅慢波的对照保留混叠的内行星第二、外行星第一谐波，移除额外会合信息，同时避免把受迫共振项算两遍。

中间行星质量先验在零点零五至六十个地球质量间均匀，外行星在五至六百之间均匀。自由向量每个分量采用零均值、宽度零点零三的高斯先验，并限制在正负零点一五之间；周期和中心起点使用有界均匀先验，完整边界保存在 timing-results.json。额外散布取三十分钟尺度的半高斯，正支持范围同样明确保存。

似然保留方差归一化。采样结合差分演化、线性偏心项的条件高斯更新，以及对数散布的 slice 更新；偏心抽样若越出支持域就拒绝，有限正质量使用截断正态条件分布。对数质量、对数散布的提议包含坐标变换的雅可比。

这些支持域定义了一套数学上的近似模型，并未逐一证明每个偏心组合都对应可靠的完整三行星轨道。自由向量较大时，以及加宽先验后的结果，尤其需要同小偏心近似的边界一起读。

对应阅读：Deck & Agol · Lithwick · Greklek-McKeon et al.

## 下载公开材料，再独立运行

下载脚本读取公开白名单，逐项校验字节数和 SHA256，建立能独立使用的目录。原表、脚本、冻结输出和压缩链都通过网站提供，无需访问私有仓库或交互实验引擎。

先运行很短的观测筛选检查与冻结链分析。轨道脚本另用标准库重算默认合成牛顿轨道，这是教学数值实验，与真实 Kepler 测时分析分开。最后一条命令重新计算实测后验，使用四组相互独立、各三十名 walker 的采样群。

完整比较与敏感性实验可用 run-frozen-inference.py 重跑。其中一组对同一实测样本加宽自由偏心先验，另一组在相同整数圈号与原误差上做明确标注的解析模型注入。注入输出把原实测时刻单独保留，替换后用于分析的时刻明确标成合成。

```
            curl -fsS -O https://sandboxphysics.com/stories/transit-timing/download-tutorial.py
python3 download-tutorial.py --directory ac19
cd ac19
python3 verify-observations.py --input .
python3 reproduce-orbits.py --out new-orbit
python3 analyze-frozen-posterior.py --directory .
python3 reproduce-timing.py --input . --out new-posterior --iterations 16000 --ensembles 4
          
```

对应阅读：Greklek-McKeon et al. · Deck et al. · Deck & Agol

## 把区间与差异一起读

下表直接读取保存的后验摘要。方括号给第十六与第八十四百分位，不是硬边界，也不是关于真实系统覆盖率的声明。加入会合项后，外行星的条件分布变窄，中间行星宽阔的质量长脊也改变了。

接着看残差与额外散布。即使加上会合项，近似模型仍需要约十五分钟额外散布，外行星原测时误差却通常不到一分钟。代表性后验抽样处，按原误差计算的残差平方和仍有几百；它不是最小化后的卡方，也没有被赋予频率学概率。

这里的重要物理结果，是简化两行星谐波模型在原测量精度下仍有显著不足。这种条件区间仍需完整三行星分析与观测模型检验，才能判断相应的真实质量准确度。

| 近似模型 | 中间质量／地球单位 | 外行星质量／地球单位 | 额外散布中位数／分钟 |
| --- | --- | --- | --- |
| 仅慢谐波 | $17.5\;[5.07,41.2]$ | $246\;[155,367]$ | 27.9 |
| 加入会合分量 | $8.56\;[3.24,17.0]$ | $178\;[149,208]$ | 15.6 |

对应阅读：Deck & Agol · Greklek-McKeon et al. · Greklek-McKeon et al.

## 先找失败，再谈精度

检查独立采样群轨迹，以及保存的逐次群平均一致性诊断。数值接近一有助于判断相互一致，却不能证明所有模式都已走遍。有效群平均数计的是相关迭代的平均，不是独立 walker 抽样个数。

最初的宽先验采样暴露出未混合好的第二模式。后来加入条件更新与对数散布 slice 采样，再保存最终诊断；早期失败保留在核验报告。同数据的宽先验计算，用来检查较窄偏心率假设是否藏住了质量长脊。

解析注入采用六与一百五十个地球质量及注明的自由向量，再按原测时误差加入噪声。它检验已知的质量与自由向量能否在这种稀疏采样下被找回；谐波物理的独立检验，则来自真实牛顿积分事件与另一套 IAS15 计算。单次注入本身也不能测量区间覆盖率。

换下一份数据时，先记下时标、实测与预测栏、整数缺口、似然归一化、先验支持域、链的一致性，以及模型残差。这七项能让一个质量区间成为有明确范围的物理陈述。

对应阅读：Deck et al. · Deck & Agol · Greklek-McKeon et al.

## 把计算带走

![二十五个实测凌星残差、原始误差和简化模型后验中位预测](https://sandboxphysics.com/stories/transit-timing/kepler289-measured-timing.svg)

实点是真实测时相对各自行星线性历表的偏差，叉号是简化谐波模型的后验中位预测。即使条件后验较窄，图中剩余的大失配仍需解释。

![仅慢项与加入会合项时的条件质量密度](https://sandboxphysics.com/stories/transit-timing/kepler289-conditional-masses.svg)

两次计算使用相同的十五次中间行星、十次外行星测时。会合分量改变条件质量信息，却没有修复两行星近似本身的不足。

![保留的相关后验抽样所显示的质量与自由偏心率关系](https://sandboxphysics.com/stories/transit-timing/kepler289-mass-degeneracy.svg)

图中是相关抽样；每套模型另有四组独立 ensemble 运行。解读区间之前，应同时查看保存的诊断和加宽先验实验。

下载下方的小型下载器，在空目录中运行。它只获取列明的科学材料，逐个检查字节数和 SHA-256。主要计算只需 Python 3.9 或更新版本，无需账户或代码仓库。

[download-tutorial.py](https://sandboxphysics.com/stories/transit-timing/download-tutorial.py) · [精确文件清单](https://sandboxphysics.com/stories/transit-timing/public-reproduction.json) · [命令与数值比较说明](https://sandboxphysics.com/stories/transit-timing/reproduction-readme.txt)

```
# Save download-tutorial.py from the link below, then:
python3 download-tutorial.py --directory kepler289-timing
cd kepler289-timing
python3 verify-observations.py --input .
python3 verify-inference.py --input .
python3 analyze-frozen-posterior.py --directory .
python3 reproduce-orbits.py --out new-orbit
# The full six-run posterior calculation takes substantially longer:
python3 run-frozen-inference.py --input . --out new-all
```

每套模型的压缩链保留全部 63,960 次相关抽样。重新运行后验属于蒙特卡洛计算。不同数学库可能产生不同抽样序列；复算时比较数值摘要与诊断。冻结的解析注入另作反演闭环练习。

全部公开输入、科学脚本和冻结输出

- [download-tutorial.py](https://sandboxphysics.com/stories/transit-timing/download-tutorial.py) (2 KiB)
- [reproduce-timing.py](https://sandboxphysics.com/stories/transit-timing/reproduce-timing.py) (7 KiB)
- [run-frozen-inference.py](https://sandboxphysics.com/stories/transit-timing/run-frozen-inference.py) (1 KiB)
- [timing\_data.py](https://sandboxphysics.com/stories/transit-timing/timing_data.py) (3 KiB)
- [chopping\_model.py](https://sandboxphysics.com/stories/transit-timing/chopping_model.py) (5 KiB)
- [timing\_posterior.py](https://sandboxphysics.com/stories/transit-timing/timing_posterior.py) (4 KiB)
- [timing\_priors.py](https://sandboxphysics.com/stories/transit-timing/timing_priors.py) (2 KiB)
- [timing\_conditionals.py](https://sandboxphysics.com/stories/transit-timing/timing_conditionals.py) (5 KiB)
- [posterior\_diagnostics.py](https://sandboxphysics.com/stories/transit-timing/posterior_diagnostics.py) (3 KiB)
- [analyze-frozen-posterior.py](https://sandboxphysics.com/stories/transit-timing/analyze-frozen-posterior.py) (4 KiB)
- [nbody\_timing.py](https://sandboxphysics.com/stories/transit-timing/nbody_timing.py) (5 KiB)
- [reproduce-orbits.py](https://sandboxphysics.com/stories/transit-timing/reproduce-orbits.py) (2 KiB)
- [verify-observations.py](https://sandboxphysics.com/stories/transit-timing/verify-observations.py) (2 KiB)
- [verify-inference.py](https://sandboxphysics.com/stories/transit-timing/verify-inference.py) (3 KiB)
- [verify-ias15.py](https://sandboxphysics.com/stories/transit-timing/verify-ias15.py) (4 KiB)
- [validate-harmonics.py](https://sandboxphysics.com/stories/transit-timing/validate-harmonics.py) (3 KiB)
- [plot-timing.py](https://sandboxphysics.com/stories/transit-timing/plot-timing.py) (6 KiB)
- [posterior-slow-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/posterior-slow-samples.csv.gz) (3055 KiB)
- [posterior-chopping-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/posterior-chopping-samples.csv.gz) (3010 KiB)
- [posterior-timing-results.json](https://sandboxphysics.com/stories/transit-timing/posterior-timing-results.json) (14 KiB)
- [posterior-selected-times.csv](https://sandboxphysics.com/stories/transit-timing/posterior-selected-times.csv) (2 KiB)
- [prior-sensitivity-slow-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/prior-sensitivity-slow-samples.csv.gz) (3054 KiB)
- [prior-sensitivity-chopping-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/prior-sensitivity-chopping-samples.csv.gz) (3011 KiB)
- [prior-sensitivity-timing-results.json](https://sandboxphysics.com/stories/transit-timing/prior-sensitivity-timing-results.json) (14 KiB)
- [prior-sensitivity-selected-times.csv](https://sandboxphysics.com/stories/transit-timing/prior-sensitivity-selected-times.csv) (2 KiB)
- [injection-slow-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/injection-slow-samples.csv.gz) (3004 KiB)
- [injection-chopping-samples.csv.gz](https://sandboxphysics.com/stories/transit-timing/injection-chopping-samples.csv.gz) (2889 KiB)
- [injection-timing-results.json](https://sandboxphysics.com/stories/transit-timing/injection-timing-results.json) (14 KiB)
- [injection-selected-times.csv](https://sandboxphysics.com/stories/transit-timing/injection-selected-times.csv) (3 KiB)
- [analysis-summary.json](https://sandboxphysics.com/stories/transit-timing/analysis-summary.json) (17 KiB)
- [default-model-check.json](https://sandboxphysics.com/stories/transit-timing/default-model-check.json) (47 KiB)
- [harmonic-validation.json](https://sandboxphysics.com/stories/transit-timing/harmonic-validation.json) (1 KiB)
- [observation-offsets.json](https://sandboxphysics.com/stories/transit-timing/observation-offsets.json) (3 KiB)
- [reference-input.json](https://sandboxphysics.com/stories/transit-timing/reference-input.json) (144 KiB)
- [provenance.json](https://sandboxphysics.com/stories/transit-timing/provenance.json) (5 KiB)
- [numerical-reference.json](https://sandboxphysics.com/stories/transit-timing/numerical-reference.json) (219 KiB)
- [synthetic-orbit.json](https://sandboxphysics.com/stories/transit-timing/synthetic-orbit.json) (16 KiB)
- [ajac8553t1\_mrt.txt](https://sandboxphysics.com/stories/transit-timing/ajac8553t1_mrt.txt) (25 KiB)
- [kepler289-observed.csv](https://sandboxphysics.com/stories/transit-timing/kepler289-observed.csv) (2 KiB)
- [source-attribution.txt](https://sandboxphysics.com/stories/transit-timing/source-attribution.txt) (3 KiB)
- [reproduction-readme.txt](https://sandboxphysics.com/stories/transit-timing/reproduction-readme.txt) (3 KiB)
- [kepler289-measured-timing.svg](https://sandboxphysics.com/stories/transit-timing/kepler289-measured-timing.svg) (61 KiB)
- [kepler289-conditional-masses.svg](https://sandboxphysics.com/stories/transit-timing/kepler289-conditional-masses.svg) (60 KiB)
- [kepler289-mass-degeneracy.svg](https://sandboxphysics.com/stories/transit-timing/kepler289-mass-degeneracy.svg) (1112 KiB)

作者机读表按 CC BY 4.0 注明出处；原创科学脚本采用 MIT。归属文件列出版本、原始链接，并区分实测时刻、合成轨道与依赖模型的反演。

## 亲手观察

### [把受控轨道与实测反问题并排比较](https://sandboxphysics.com/zh/labs/transit-timing-variations/)

1. 导出默认合成轨道，把完美模型的测时图案与真实样本的剩余散布比较。
2. 采用偏心预设，观察尚未加噪声时，物理轨道变化怎样改变慢波。
3. 重算时把合成轨迹、真实测时和解析注入分别保存。

[上一篇：为什么测时波很清楚，质量仍不确定](https://sandboxphysics.com/zh/stories/transit-timing/mass-and-eccentricity/) [下一篇：从光度图读懂 Kepler-289 的质量测量](https://sandboxphysics.com/zh/stories/transit-timing/reading-kepler289/)

## 来源与计算范围

1. [Lithwick, Xie & Wu, Extracting Planet Mass and Eccentricity From TTV Data (2012)](https://arxiv.org/abs/1207.4192v2)

   固定 v2，第二节、公式一至十及附录 B：自由偏心率向量、近共振近似的适用条件。

2. [Deck & Agol, Measurement of Planet Masses with Synodic Chopping (2015)](https://arxiv.org/abs/1411.0004v1)

   固定 v1，第二至第五点一节、公式十至十五及附录 A：凌星采样如何混叠分量，PH3 案例如何比较加入会合踢动前后的质量约束。

3. [Deck et al., TTVFast (2014)](https://arxiv.org/abs/1403.1895v1)

   固定 v1，第二点一点三、第二点二至三和第三节：几何凌星中心取前景天体的星心投影距离极小值。教学积分复用本站 RK4 核并独立比较 IAS15，不移植 GPL TTVFast 代码。

4. [Greklek-McKeon et al., Kepler-289 Densities and Transit Timing (2023)](https://arxiv.org/abs/2208.00022v1)

   固定 v1，第二至三节、表一及图二至四、九至十，许可为 CC BY 4.0。作者先联合拟合遮星形状，再用三行星动力学拟合测得的时刻。

5. [Greklek-McKeon et al., original Table 1 machine-readable file](https://content.cld.iop.org/journals/1538-3881/165/2/48/revision1/ajac8553t1_mrt.txt)

   revision1，25058 字节，SHA256 为 8f958e773fae5a6d17aa090c5d523e13829f6b69a2f3d51ceecbf5e2d0d56af9。五十一个实测行与四百一十五个仅预测行分开；观测列缺少二〇二一年 WIRC 那次测量。

6. [Schmitt et al., Planet Hunters VII and PH3 (2014)](https://arxiv.org/abs/1410.8114v1)

   固定 v1，遮星与动力学分析及表五。旧称 PH3c 对应今天的 Kepler-289d，PH3d 对应 Kepler-289c；旧预测表不作为独立测量清单使用。
