跳到主要内容
Sandbox Physics
从小起伏到宇宙蛛网

从小起伏到宇宙蛛网 · L3

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

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

先预测,再取得一份状态

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

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

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

对应阅读: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\ln a作自变量时,用链式法则把尺度因子方程乘以aa,得到下式。相对与绝对容差分别是2×10−102\times10^{-10}和2×10−122\times10^{-12}。它独立检验时间推进;同一个粗网格的物理分辨率仍然相同。

dydln⁡a=a−1/2u,dudln⁡a=a1/2F(y)\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

亲手从位置算一次功率

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

已验收示例的初始功率是0.0019999995 Mpc30.0019999995\,\mathrm{Mpc}^3。原生末态为0.94855988760.9485598876,独立参考为0.9485655642 Mpc30.9485655642\,\mathrm{Mpc}^3;它们的功率相差约5.98×10−65.98\times10^{-6}的相对量。原生位置与参考位置的均方根差约4.23×10−94.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.2801474.2801,独立参考约474.2829474.2829,都低于EdS的475.6443475.6443。参考相对解析增长低约0.2862%0.2862\%。这与原生和参考之间只有约0.000598%0.000598\%的差异,是两个不同的比较。

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

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

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

把质量和周期也查一遍

示例全程最大的原始沉积质量相对误差约2.22×10−162.22\times10^{-16}。这个数在扣平均背景以前检查,没有靠事后归一化改成一。把初始位置整体挪整数个盒长,参考力的最大变化约8.21×10−178.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.09a=1.09换成另一原生帧,解析功率增长比应如何重算?

    展开解释

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

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

    展开解释

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

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

    展开解释

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

动手检验预测

保存自己的预测与复算

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

独立重走一条轨迹

下载Python、精确示例与预期结果 (33189 B)

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

SHA-256与示例来源

9334aacf0036834af4e08d102f05e7fa096c71a1ce91b66b8f80b52f6db7c673

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

来源与计算范围

  1. Springel (2005), The cosmological simulation code GADGET-2, 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

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

  3. Original finite-mesh calculations and independent small-wave Python replay

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

反馈这个页面有错误、看不明白,或者缺了什么?告诉我们
反馈类型

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