---
title: "把导出的初值，交给另一个积分器"
description: "用公开Python材料从完整精度初值独立积分小波，再直接求粒子功率，分清时间误差和有限网格的增长偏差。"
canonical_url: "https://sandboxphysics.com/zh/stories/cosmic-web/rerun-an-export-and-measure-growth/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/cosmic-web/rerun-an-export-and-measure-growth/"
last_modified: "2026-11-12"
---

[从小起伏到宇宙蛛网](https://sandboxphysics.com/zh/stories/cosmic-web/)

从小起伏到宇宙蛛网 · L3

# 把导出的初值，交给另一个积分器

Sandbox Physics · 2026-11-12

一次导出可以成为可检验的计算：保留原始位置、动量和时刻，让另一套求力程序与积分器重新走到同一帧，再比较轨迹和功率。下面用一条尚未穿越的小波走完这件事。

## 开始前需要什么

读过坐标、网格求力和功率三篇。需要能运行Python命令；下载包已附示例，不必先操作浏览器，也不需要TNG数据。

## 先预测，再取得一份状态

在线性近似下，从$a_i=0.05$到$a_f\simeq1.09046$，EdS功率应增长约$475.6$倍。先把这个预测写下来；它没有包含有限网格的偏差。

想自己导出时，在Lab选“一张片的折叠”，把振幅降到$A=0.02$，等新计算完成，再暂停并导出当前JSON。每一帧有自己的尺度因子，读文件里的数，不用滑块显示值替代它。当前状态导出和完整原生二进制是两种格式，本教程读取前者。

公开包里的示例使用同一设定，在原生第$116$帧保存，$a_f=1.0904635200240378$。这份示例用Node运行已冻结的Lab模型和当前状态导出函数生成；你也可以换成自己从Lab下载的当前JSON。完整模型从$0.05$走到$1.5$共$1024$步，这一帧对应第$928$步；参考程序则只积分到文件指定的时刻。

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1

## 在新的目录里运行

下载本页的独立复算包并解压。它包含Python参考程序、示例JSON、预期结果与文件清单；不包含浏览器Engine、原论文或TNG快照。验收环境是Python 3.12.12、NumPy 2.3.5、SciPy 1.17.1。

先在自己的虚拟环境安装requirements.txt中的固定版本，再运行下列命令。输出目录要使用新名字，以免覆盖前一次结果。用自己的当前JSON时，只替换输入文件名；强非线性状态可能需要更多求力次数，不能把这个小波例子的耗时当作所有状态的承诺。

程序产生result.json和独立末态的双精度数组。先检查程序成功结束、尺度因子与输入一致、版本信息符合预期，再看误差；成功的复算会在这两个文件中留下有限的数值结果。

```
python replay.py small-wave-current.json --out my-new-result
```

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1

## 它怎样做到独立

初始位置与动量直接取自导出文件中的完整精度数组，不从界面文字反推，也不再随机生成一份初值。这样两个结果之间的差异不会混入不同的起跑位置。

参考程序使用NumPy的重复索引累加来分配CIC质量，在Fourier空间乘上四点梯度的离散波数，再把力取回粒子；浏览器则先反变换势，再在实空间作四点差分。两者求同一种有限网格力，用的程序路径不同。

时间推进换成SciPy的自适应DOP853。以$\ln a$作自变量时，用链式法则把尺度因子方程乘以$a$，得到下式。相对与绝对容差分别是$2\times10^{-10}$和$2\times10^{-12}$。它独立检验时间推进；同一个粗网格的物理分辨率仍然相同。

$$
\frac{d\boldsymbol y}{d\ln a}=a^{-1/2}\boldsymbol u,\qquad\frac{d\boldsymbol u}{d\ln a}=a^{1/2}\boldsymbol F(\boldsymbol y)
$$

这里没有再次添加Hubble阻尼：正则动量与前面推导的尺度因子已经包含背景膨胀。

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1 · SciPy solve\_ivp official reference and installed 1.17.1 documentation

## 亲手从位置算一次功率

打开初、末态数组，按上一章的定义直接求$\boldsymbol n=(1,0,0)$模式。下面的短代码能用于形状为$(4096,3)$的位置数组，结果以$\mathrm{Mpc}^3$计。不要先把坐标取成三位有效数字，也不要替规则点阵扣Poisson噪声。

已验收示例的初始功率是$0.0019999995\,\mathrm{Mpc}^3$。原生末态为$0.9485598876$，独立参考为$0.9485655642\,\mathrm{Mpc}^3$；它们的功率相差约$5.98\times10^{-6}$的相对量。原生位置与参考位置的均方根差约$4.23\times10^{-9}$个盒长。

如此小的数值差异，只说明这条小波在同一有限网格力下的两种推进相符。它没有把节点之间的引力变成无限分辨率，也没有证明晚期强非线性结点同样准确。

```
import numpy as np

def power(positions):
    phase = positions @ np.array([1, 0, 0])
    amplitude = np.mean(np.exp(-2j * np.pi * phase))
    return 20.0**3 * abs(amplitude)**2
```

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1

## 为什么两者都没长到解析预测

原生功率增长比约$474.2801$，独立参考约$474.2829$，都低于EdS的$475.6443$。参考相对解析增长低约$0.2862\%$。这与原生和参考之间只有约$0.000598\%$的差异，是两个不同的比较。

第一个比较含有限网格、半格点阵响应及微小非线性修正；第二个主要检查两套程序怎样求同一种力、怎样推进运动。前面的$A=0.01$、末时刻$a=1$校准已有空间细化证据，而本教程是$A=0.02$、末时刻约$1.09$，数值不必逐位相同。

做下一次实验时，一次只改一个问题：保持力网格与初值，收紧积分误差，观察参考是否稳定；若要追问连续引力的准确度，则需细化粒子和网格，并保持连续初始扰动一致。每种比较都要回答清楚：这次在检验求力，还是在检验推进。

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1

## 把质量和周期也查一遍

示例全程最大的原始沉积质量相对误差约$2.22\times10^{-16}$。这个数在扣平均背景以前检查，没有靠事后归一化改成一。把初始位置整体挪整数个盒长，参考力的最大变化约$8.21\times10^{-17}$；初始总平均力也接近零。

这些检查各自回答具体问题：质量是否漏分，周期权重是否一致，内部引力有没有净推走整盒质心。它们与增长、轨迹比较合起来，才构成这次小波复算的证据。精度阈值及完整环境记录都在包中，换自己的状态时应保留新的结果。

对应阅读：Original finite-mesh calculations and independent small-wave Python replay · Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1

## 练习与解释性答案

1. 把输入终点从约$a=1.09$换成另一原生帧，解析功率增长比应如何重算？

   展开解释

   从文件读出实际$a_f$，计算$(a_f/0.05)^2$。不能继续沿用$475.6$，也不能把原生1024步说成全都走到了这个较早终点。

2. 两种积分器结果完全一致，是否就证明连续牛顿引力被精确求出？

   展开解释

   没有。它们仍可能共享同一个有限网格和截断造成的系统误差。独立时间推进、独立空间参考和分辨率细化检查不同层面的正确性。

3. 为什么参考程序从导出的初值积分，而不是只对末态再算一次力？

   展开解释

   末态力比较只能检查一个瞬间的算子。重新走完整个区间还会检验动量约定、尺度因子、时间推进和误差累积。

## 动手检验预测

### [保存自己的预测与复算](https://sandboxphysics.com/zh/labs/cosmic-web-shell-crossing/)

1. 用同一条最小振幅平面小波，另选一帧并导出当前JSON。
2. 先算EdS预测，再以新目录运行参考；记录实际末时刻、初末功率及两个误差分母。
3. 解释哪部分证据来自质量与周期，哪部分来自两种积分器，哪部分仍需要空间细化。

## 独立重走一条轨迹

[下载Python、精确示例与预期结果](https://sandboxphysics.com/stories/cosmic-web/materials/cosmic-web-replay-v1.zip) (33189 B)

NumPy与SciPy把导出的小波精确初值积分到保存时刻。ZIP不含浏览器Engine或TNG数据。全新解压复算实际使用Python 3.12.12、NumPy 2.3.5和SciPy 1.17.1。

SHA-256与示例来源

`9334aacf0036834af4e08d102f05e7fa096c71a1ce91b66b8f80b52f6db7c673`

示例来自Node实际执行冻结模型和当前状态规范序列化函数，不声称是浏览器下载。教程说明怎样换成自己的当前JSON。

[上一篇：功率记住了增长，也丢掉了什么](https://sandboxphysics.com/zh/stories/cosmic-web/what-a-power-spectrum-remembers/) [下一篇：先说清什么叫晕，再读反馈怎样改变聚类](https://sandboxphysics.com/zh/stories/cosmic-web/choose-what-you-call-a-halo/)

## 来源与计算范围

1. [Springel (2005), The cosmological simulation code GADGET-2, astro-ph/0505010v1](https://arxiv.org/abs/astro-ph/0505010v1)

   定向核读第2.1节式1至3、第3.2及3.2.1节式20至23、第4.1节式26至31，查看原PDF第3和11页。用于宇宙学动量、PM窗口与积分方法背景。教学模型另行规定截断和有限梯度，没有短程树力。

2. [SciPy solve\_ivp official reference and installed 1.17.1 documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html)

   核对DOP853、容差和成功返回信息。核读时在线手册为1.18.0；实际复算固定使用1.17.1，并另读已安装版本的solve\_ivp说明和源码。复算记录保留真实软件版本。

3. [Original finite-mesh calculations and independent small-wave Python replay](https://sandboxphysics.com/stories/cosmic-web/materials/cosmic-web-replay-v1.zip)

   自有已验收核/线性、非线性及五预设双精度计算用于课程图与校准。公开小ZIP仅含一份精确小波当前状态、独立NumPy/SciPy轨迹复算及预期结果。示例由Node执行冻结模型和规范序列化函数产生，不冒充浏览器下载。大型原始预设另行留存，包内没有Engine或原论文。
