跳到主要内容
Sandbox Physics
暗能量在变,还是引力在变

复算膨胀与增长网格

Sandbox Physics ·

这份指南重跑 Lab 背后的计算:在两段膨胀历史上,取 364 组编织与普朗克质量变化的组合,逐一检验稳定性;稳定的再演化下去,得到距离、fσ8f\sigma_8 和 EGE_G。所需的一切都在课程数据包里。冻结下来的数字出自一个独立的 Python 求解器,是离线参考计算,不是 hi_class 的输出。数据包里也有同一批模型的 hi_class 输入文件,键名对照过 hi_class 源码,但本课程没有运行过。

物理推导在四个函数描述修改引力,以及它什么时候稳定。这里的活是按部就班的:装上确切的版本,先跑独立检验,再复现网格,读懂单位,并知道会碰到哪些失败。

数据包里有什么

解压后有三个文件夹。reference 里是三个脚本:模型本身、独立检验脚本、冻结网格的脚本。templates 里是三个 hi_class 输入文件。reference-data 里是七个 JSON 文件:网格、Lab 的六个预设、合成记录、一致性检验、已记录的失败情形、独立检验结果,以及记有版本、设置和 SHA-256 哈希的运行清单。

合成记录在文件里明确标为合成。它由选定的模型加固定随机种子生成。数据包里没有任何观测数据。

搭一样的环境

冻结文件用的是 Python 3.9.6、NumPy 2.0.2 和 SciPy 1.13.1,模型只依赖这些和标准库。建一个干净的虚拟环境,免得机器上别的东西被导入进来。

python3 -m venv ac81-env
. ac81-env/bin/activate
python -m pip install numpy==2.0.2 scipy==1.13.1
unzip ac81-consistency-grid.zip -d ac81
cd ac81

每个脚本都用隔离模式运行,它会忽略环境变量和用户目录下的包。脚本自己会把所在文件夹显式加进导入路径。

先跑独立检验

相信网格之前,先确认求解器能复现那些不是它自己算出来的结果。

python -I reference/check_ac81_limits.py checks

在参考机器上,十三项检验都打印 PASS,脚本以状态零退出。挑几行带相对误差的:

PASS einstein-de-sitter-distance-z1
PASS lcdm-heath-integral-a1.0 1.629434869254709e-05
PASS linder-2005-growth-index-sugra-like 0.0017487692157125423
PASS only-run-stability-cM-0.1
PASS phantom-no-go-w0-0.752-wa-0.86

只有物质的几项和解析解比较。Heath 检验拿增长去比一个只对宇宙学常数成立的积分,1.6×10−51.6\times10^{-5} 的误差来自在 z=30z=30 处把增长模式当作纯物质时代来起步。Linder 几项和已发表的增长指数拟合比较,容差是其标称精度的 1.5 倍。稳定性几项复现两条已发表的结论:只有普朗克质量变化时需要 cM≥0c_M\ge0,单靠暗能量不能穿越负一。只要有一行打印 FAIL,就停下来:安装或脚本和参考版本不一样。

重新冻结网格

python -I reference/freeze_ac81_grid.py rerun
shasum -a 256 rerun/*.json

在参考机器上大约要 20 秒。把哈希和清单里 files 一项对比。在参考机器上第二次运行,六个文件逐字节一致;所有数字都按十位有效数字写出。换了平台或库版本,就改为比较数值。Lab 自己的浏览器求解器可以当参照:它用的是另一种积分方法,却复现了每一个稳定性判定,在稳定区域内 fσ8f\sigma_8 的差别小于 3×10−53\times10^{-5}。

读一个网格点

每个点列出背景、两个系数、稳定性判定和找到的最负的 Dcs2Dc_s^2。稳定的点还带有六个红移上的数据行。下面是宇宙学常数背景、cB=1.0c_B=1.0、cM=0.5c_M=0.5 在 z=0.5z=0.5 的那一行:

{"z": 0.5, "comoving_distance": 0.4394663128, "comoving_distance_ratio_to_lcdm": 1.0,
 "hubble_ratio": 1.317668395, "mu": 1.173166224, "sigma": 1.109639004, "m2": 1.088071388,
 "growth_rate": 0.7929344984, "sigma8": 0.633617168, "f_sigma8": 0.5024169113,
 "f_sigma8_gr_same_background": 0.4724286158, "e_g": 0.4338165283,
 "e_g_gr_same_background": 0.4094327473}

单位要看清。共动距离以 c/H0c/H_0 为单位,乘以 2997.92458/h2997.92458/h 才是百万秒差距。Hubble 比是 H/H0H/H_0。μ\mu 和 Σ\Sigma 都是相对牛顿常数的比值,普朗克质量是 M∗2/MPl2M_*^2/M_{\mathrm{Pl}}^2。σ8\sigma_8 是相对量:所有模型从同样的早期幅度出发,归一化到爱因斯坦引力加宇宙学常数今天为 0.810.81。可以在模型之间比较 fσ8f\sigma_8,但除非重新标定幅度,不要拿它去和巡天的绝对值比。

每一行都带着同一背景下爱因斯坦引力的增长。成对比较就是检验本身:距离不变,0.50240.5024 对 0.47240.4724,增长多出 6.3%。

整张网格里,宇宙学常数背景的 182 个点中有 140 个稳定,算上纯爱因斯坦引力那一个;DESI 式穿越背景上有 118 个。穿越背景上若没有编织,只有 cM≥1c_M\ge1 的普朗克质量变化能活下来。可见在这种参数化里,两个系数各自都能把穿越救回来。

用 hi_class 复算

hi_class 是这组基底下的参考玻尔兹曼程序。Zumalacárregui 等 2017,hi_class 模板是为 hi_class v3.4.0.1 写的,git 提交为 b425aef17d566429e8cf189ed47d81f5fa84594e,键名取自该版本的参数文件。编译 C 程序并运行一个模板:

git clone https://github.com/miguelzuma/hi_class_public.git hi_class
cd hi_class
git checkout b425aef17d566429e8cf189ed47d81f5fa84594e
make class
mkdir -p output
./class ../ac81/templates/ac81-lcdm-background-braided.ini

仓库的 README 也指向 hiclass-code 组织下的同一份代码,并提供 Python 接口。模板里的关键几行是:

Omega_Lambda = 0
Omega_fld = 0
Omega_smg = -1
gravity_model = propto_omega
parameters_smg = 0.1, 0.9, 0.6, 0., 1.
expansion_model = lcdm
skip_stability_tests_smg = no
method_qs_smg = fully_dynamic

五个数依次是 cKc_K、cBc_B、cMc_M、cTc_T 和初始普朗克质量。标量场密度设成负一,程序就用平直条件反推暗能量密度。穿越背景的模板把膨胀模型换成 w0w_0、waw_a 形式。

背景输出文件里会有标题为 G_eff_smg 和 slip_eff_smg 的两列。按该提交的 hi_class 源码,前者是 Φ\Phi 的耦合,后者是比值 Φ/Ψ\Phi/\Psi。Lab 用的量这样换算:

μ=Geffη,Σ=Geff+μ2,\mu=\frac{G_{\mathrm{eff}}}{\eta},\qquad \Sigma=\frac{G_{\mathrm{eff}}+\mu}{2},

η\eta 是滑移那一列。对今天的默认模型,这个换算把 Lab 的 μ=1.352\mu=1.352、Σ=1.192\Sigma=1.192 变成 Geff=1.031G_{\mathrm{eff}}=1.031、η=0.763\eta=0.763。本课程没有运行 hi_class,第一次运行时,请把这两个数当作要检验的预言。

应该预料到的差别

hi_class 是另一种计算,它有三处选择会让数字变动。

  1. 它包含辐射和中微子,从辐射时代深处开始算。Python 求解器略去辐射,增长从 z=30z=30 开始。模板用的物理物质密度相同,所以两个背景只差一个很小的辐射项。由此带来的增长差别有多大,本课程没有测。
  2. 它的全动力学扰动不假设准静态极限。Dcs2Dc_s^2 接近零时,声视界很大,准静态的 μ\mu 靠不住。失败情形文件里列了几个只有普朗克质量变化的例子,今天的 Dcs2Dc_s^2 从 0.087 降到 0.0017。
  3. 它从最早演化的时刻起就检验稳定性,Python 求解器只检验 z=30z=30 到今天。最负的 Dcs2Dc_s^2 落在零附近的点,不论在哪一端,判定都可能翻转。

报错与预期中的失败

模板 ac81-crossing-no-braiding-expected-failure.ini 在穿越背景上把编织和普朗克质量变化都设为零。hi_class 应当停下,给出以下面这段开头、后面填着具体数字的信息。这个结果是从源码推断的,没有实际运行观察到。

Gradient instability for scalar field perturbations with minimum c_s^2=

Python 求解器同样判定这个模型不稳定,z=0.94z=0.94 附近 Dcs2=−0.121Dc_s^2=-0.121。还有两种失败要认得。在 Lab 里,若 w0+waw_0+w_a 高于约 −0.52-0.52,z=30z=30 时暗能量超过 1%,物质时代的起步条件就不对了;Lab 会给出提示,网格也避开了这个区域。在网格里,不稳定的点没有数据行,这是故意的:失稳时 μ\mu 可能发散,那里给出的数字只会误导。

不要为了让模型跑通而放宽 hi_class 的安全余量。靠跳过失稳检验才跑通的结果,算出来的不是有效的宇宙学。DESI 分析把不稳定区域从后验里切掉,也是这个道理。Ishak 等 2024,§4.2.1

核对清单

  1. Python、NumPy、SciPy 版本一致,脚本用隔离模式运行。
  2. 十三项独立检验全部通过,再用别的东西。
  3. 哈希与清单一致;换了平台时,数值在容差内一致。
  4. 距离已从 c/H0c/H_0 换算;σ8\sigma_8 当相对量看。
  5. 每个模型都和它自己背景上的爱因斯坦引力比较,而不是和宇宙学常数模型比较。
  6. hi_class 在指定提交上运行,稳定性检验打开;μ\mu 和 Σ\Sigma 由有效耦合和滑移换算出来。
  7. 稳定边界附近的分歧,先当作方法差异,再考虑是不是物理。

来源

  1. Zumalacárregui 等 2017,hi_class
  2. Ishak 等 2024,§4.2.1

继续阅读

这一页直接连着哪些内容

暗能量在变,还是引力在变 · 阅读路径

从距离、增长、透镜到稳定性

  1. 文章同样的膨胀,能配上不同的引力吗
  2. 文章距离怎样记下宇宙的膨胀
  3. 文章增长和透镜怎样感受引力
  4. 文章四个函数描述修改引力,以及它什么时候稳定
  5. 当前页面复算膨胀与增长网格
  6. 文章读 DESI 2024 修改引力论文
这个页面有错误、看不明白,或者缺了什么?告诉我们
反馈类型

提交时会附带本页地址、Lab ID、网站语言和设备类型。请不要填写个人信息。反馈最多保存 12 个月。隐私政策