---
title: "在玩具三维环面里复算匹配圆"
description: "用一个只依赖标准库的 Python 脚本和存好的输入，比较真圆对与随机假匹配，再读四种失败情形。"
canonical_url: "https://sandboxphysics.com/zh/stories/cosmic-topology/recompute-matched-circles-in-a-toy-torus/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/cosmic-topology/recompute-matched-circles-in-a-toy-torus/"
last_modified: "2026-11-12"
---

[空间的整体形状](https://sandboxphysics.com/zh/stories/cosmic-topology/)

# 在玩具三维环面里复算匹配圆

Sandbox Physics · 2026-11-12

读完这篇，你会亲手跑一个 Python 脚本：它造出一片周期天空，找出立方三维环面的真圆对，拿 300 对随机假圆对给它们打分，再展示这项检验失败的四种方式。所有步骤只用三个存好的文件和 Python 标准库。方法沿用 Cornish、Spergel 和 Starkman 的圆统计量，以及 Planck 用过的假圆对门槛。这是一个玩具模型：没有真实的微波物理，没有波束，也没有遮挡，得到的数字也不是对任何卫星天图的重新分析。

请先读[怎样分辨真匹配与碰巧相似那一章](https://sandboxphysics.com/zh/stories/cosmic-topology/telling-a-real-circle-match-from-a-lucky-one/)，下面用到的公式都在那里推导过。

## 取得三个文件

把[脚本](https://sandboxphysics.com/zh/stories/cosmic-topology/materials/recompute_matched_circles.py)、[存好的输入](https://sandboxphysics.com/zh/stories/cosmic-topology/materials/tutorial-inputs.json)和[预期输出](https://sandboxphysics.com/zh/stories/cosmic-topology/materials/tutorial-expected-output.json)下载到同一个空文件夹。脚本只导入 json、math、random 和 sys。预期输出用 Python 3.9.6 生成，又用 Python 3.14.3 复现过；两次结果每个数字都相同，只有记录的版本号不同。在笔记本电脑上跑一次大约 20 秒。

在这个文件夹里运行：

```
python3 -I recompute_matched_circles.py tutorial-inputs.json my-output.json
```

参数 -I 让 Python 不从当前文件夹或环境变量里加载模块，保证只用标准库。

## 读懂输入和单位

输入文件里有四次运行，每次设定同样几项：

```
{"boxSide": 1.2, "bumpWidth": 0.08, "bumpCount": 3000, "seed": 86, "noiseRatio": 0.5, "circleSamples": 64, "falsePairTrials": 300, "falsePairRadiiDegrees": [10, 20, 30, 40, 50, 60, 70, 80]}
```

长度以 $\chi_{\mathrm{rec}}$ 为单位，即到最后散射面的共动距离，所以我们看到的球面半径为 1。盒子边长 $L$ 就是 boxSide。角度用度。温度以球面上信号的标准差为单位，所以 noiseRatio 就是 $\sigma_n/\sigma_s$，即信噪比 $\xi$ 的倒数。

天空由 3000 个宽度为 $s$（即 bumpWidth）的高斯鼓包叠加而成，位置在盒内随机，权重是随机高斯数。每个鼓包都复制到所有够得着球面的格点像 $L\mathbf{n}$ 上，场因此是周期的。相距 $r$ 的两点，相关程度正比于 $e^{-r^2/4s^2}$ 对所有像求和。实验里的天空用傅里叶模式另行构造，两者斑点类型相同，具体天空不同。要比较的是行为，不是数字。

四次运行分别是：wrapped-box，$L = 1.2$；near-the-limit，$L = 1.93$；larger-than-the-view，$L = 2.2$；noisy-sky，与 wrapped-box 相同，但噪声是信号的两倍。

## 第一步：确认盒子真的首尾相接

打开 my-output.json，找到 runs 下的 wrapped-box。先读 periodicityDifference：它比较某一点和这一点平移一个盒长后的场值，必须恰好为零。不为零，说明求和时漏掉了一些格点像，后面每个圆的分数都会出错。

## 第二步：给预言的圆对打分

列表 predictedPairs 对每一对离我们不到 2 的像 $\pm\mathbf{g}$ 给出一项。$L = 1.2$ 时共九项：三对间距 $1.2$、半径 $53.13^\circ$，六对间距 $1.6971$、半径 $31.948^\circ$。这些半径来自 $\cos\alpha = |\mathbf{g}|/2$。

对每一对，脚本在绕 $\hat{\mathbf{g}}$ 的圆上取 64 个点，再取这 64 个物理点平移 $-\mathbf{g}$ 后的位置，它们落在绕 $-\hat{\mathbf{g}}$ 的圆上。没有噪声时，九项的 statisticAtZeroShift 都是 $1.0$，bestShiftSamples 都是 0：两个圆上的温度逐点相同。如果这里出现非零的最佳转角，说明两个圆采样时的起始方向不一致。

noisyStatisticAtZeroShift 给每个圆各加独立噪声。1998 年论文的第 5 式预言，噪声为信号一半时 $\xi^2/(1+\xi^2) = 0.8$，输出里记作 css1998Equation5。九个带噪声的值平均为 $0.795$。

## 第三步：搭出假圆对门槛

盲搜索不能只给真圆对打分，它得试遍所有圆心和半径，并对每一对取最佳转角。falsePairs 这一块对随机轴上的 300 对背对背圆做了这件事，半径从 10 度到 80 度中抽取，噪声与带噪声的真圆对相同。

读两个数。singleShift.standardDeviation 是固定转角时的散布，为 $0.197$，比旁边记录的独立采样值 $1/\sqrt{65} = 0.124$ 宽：相邻采样点共享斑点，一个圆上的独立数值少于 64 个。bestOverShifts.percentile99 是各自取最佳转角后，1% 的随机圆对能超过的假匹配水平，为 $0.674$。300 次试验里，它是第四大的值。

**表 5.1** 真圆对与 1% 假匹配水平的比较，均取最佳转角，数值来自预期输出。

| 运行 | 盒子边长 | 真圆对数 | 真圆对最高分 | 1% 假匹配水平 |
| --- | --- | --- | --- | --- |
| wrapped-box | $1.2$ | 9 | $0.69$ 至 $0.88$ | $0.674$ |
| near-the-limit | $1.93$ | 3 | $0.725$、$0.772$、$0.889$ | $0.745$ |
| larger-than-the-view | $2.2$ | 0 | 无 | $0.708$ |
| noisy-sky | $1.2$ | 9 | $0.27$ 至 $0.51$ | $0.431$ |

wrapped-box 里每一对真圆都越过了假匹配水平。在这片玩具天空里，这算一次探测。

## 检验失败的四种方式

盒子比视野大。larger-than-the-view 的 predictedPairs 是空的，因为没有像离我们不到 2。可最好的假圆对仍有 $0.771$ 分。如果搜索不设门槛、直接报告最高分，就会在一片没有圆的天空里宣布找到了圆。这就是不可辨识的极限：圆检验在这里给出的答案，和无限平直空间一样。

噪声淹没匹配。noisy-sky 在正确转角下的预言降到 $0.2$。取最佳转角后，真圆对得分在 $0.27$ 到 $0.51$ 之间，九对里只有一对超过假匹配水平 $0.431$。拓扑仍然在那里，只是这张天图显示不出来。

接近极限的小圆。near-the-limit 的圆半径只有 $15.2^\circ$，采样点挨得很近、共享斑点，假匹配水平升到 $0.745$，三对真圆里有一对得分 $0.725$，落到门槛以下。Planck 搜索里最小可测圆半径，也是由同一个机制定下的。

方向弄反。mirroredBestStatistic 把每个真圆和反方向读取的伙伴圆比较。这不是匹配，可取最佳转角后仍得到 $0.47$ 到 $0.89$。光滑天空上的两条温度曲线，可能碰巧在一段圆弧上对得很好。单凭一个高的最佳分数永远算不上证据，搜索必须检验拓扑预言的那种方向。

## 误差，以及这些数字能说明什么

分数保留四位小数。1% 假匹配水平取自 300 个值里第四大的那个，它自身的不确定度是百分之几：噪声为信号一半的三次运行，分别给出 $0.674$、$0.708$ 和 $0.745$。真正的分析要用多得多的模拟，并完全按照数据的处理流程来做；Planck 用了 300 个完整的天图模拟。

噪声模型给每个采样点加独立高斯噪声。真实天图的噪声随天区变化，银河附近的天区要被遮掉。天图里还有气体速度和变化的引力势带来的成分，它们在通往同一点的两条路径上各不相同。脚本里这些都没有，所以它的结果描述的是方法怎样表现。

## 和实验对照

在实验里选一个预设，再点数据行里的导出按钮。导出的记录列出了预言圆对、它们的半径，以及盒轴圆对的分数和偶然水平。同一个盒子边长下，圆对数和半径应当与 predictedPairs 完全一致。分数在细节上会不同，因为两片天空不同；但没有噪声时真圆对应接近 1，噪声增大时应沉向偶然水平带。

## 任何一次圆搜索都可以对照的清单

1. 打分之前，先确认模拟天空的周期性。
2. 看分数之前，先从几何写下预言的半径和圆心。
3. 假圆对要用与真实搜索相同的采样、噪声和搜索自由度来打分。
4. 报告假匹配水平时，同时给出背后的模拟次数。
5. 小圆单独检验，因为它们的假匹配水平更高。
6. 先固定拓扑预言的方向，再取最佳转角。

来源：[Cornish、Spergel 与 Starkman 1998，第 5、6、8 式](https://arxiv.org/abs/astro-ph/9801212v1)，[Planck 2015 结果第十八篇第 4.2 与 5.1.1 节](https://arxiv.org/abs/1502.01593v2)，[COMPACT 合作组预印本：圆信号的噪声来源](https://arxiv.org/abs/2211.02603v4)。

[导出实验记录，把其中的圆匹配分数和脚本输出对照。](https://sandboxphysics.com/zh/labs/flat-torus-matched-circles/)

## 来源

1. [Cornish、Spergel 与 Starkman 1998，第 5、6、8 式](https://arxiv.org/abs/astro-ph/9801212v1)
2. [Planck 2015 结果第十八篇第 4.2 与 5.1.1 节](https://arxiv.org/abs/1502.01593v2)
3. [COMPACT 合作组预印本：圆信号的噪声来源](https://arxiv.org/abs/2211.02603v4)

## 继续阅读

空间的整体形状 · 阅读路径

### 从平直的盒子到匹配圆与 Planck 限制

1. [文章 **平直的宇宙会是有限的吗**](https://sandboxphysics.com/zh/stories/cosmic-topology/can-a-flat-universe-be-finite/)
2. [文章 **三维环面怎样让平直空间变得有限**](https://sandboxphysics.com/zh/stories/cosmic-topology/flat-but-finite-three-torus/)
3. [文章 **宇宙太小，天空为什么会出现成对的圆**](https://sandboxphysics.com/zh/stories/cosmic-topology/why-a-small-universe-draws-circles/)
4. [文章 **怎样分辨真正的匹配圆与碰巧的相似**](https://sandboxphysics.com/zh/stories/cosmic-topology/telling-a-real-circle-match-from-a-lucky-one/)
5. [当前页面 **在玩具三维环面里复算匹配圆**](https://sandboxphysics.com/zh/stories/cosmic-topology/recompute-matched-circles-in-a-toy-torus/)
6. [文章 **怎样读 Planck 的宇宙拓扑限制**](https://sandboxphysics.com/zh/stories/cosmic-topology/reading-planck-topology-limits/)
