2

我正在从输入角功率谱 Cl 生成随机 healpix 图。如果我使用healpy.synalm,然后使用healpy.alm2map,最后通过在生成的map上运行healpy.anafast来测试map,输出和输入功率谱不一致,尤其是在高l时,输出功率谱高于输入(见下面代码产生的情节)。如果我直接使用healpy.synfast,我会得到一个与输入一致的输出功率谱。如果我使用healpy.synfast 中的alms 并使用healpy.alm2map 从synfast alms 生成地图,这同样适用。当我查看synfast的源代码时,似乎只是调用了synalm和alm2map,所以我不明白,为什么他们的结果不一致。我的测试代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
import classy
import healpy as hp

NSIDE = 32


A_s=2.3e-9
n_s=0.9624
h=0.6711
omega_b=0.022068
omega_cdm=0.12029

params = {
'output': 'dCl, mPk',
'A_s': A_s,
'n_s': n_s,
'h': h,
'omega_b': omega_b,
'omega_cdm': omega_cdm,
'selection_mean': '0.55',
'selection_magnification_bias_analytic': 'yes',
'selection_bias_analytic': 'yes',
'selection_dNdz_evolution_analytic': 'yes'}

cosmo = classy.Class()
cosmo.set(params)
cosmo.compute()
theory_cl=cosmo.density_cl()['dd']

data_map,data_alm=hp.synfast(theory_cl[0],NSIDE,alm=True)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synfast")
data_map=hp.alm2map(data_alm,NSIDE)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synfast using alm")

data_alm=hp.synalm(theory_cl[0])
data_map=hp.alm2map(data_alm,NSIDE)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synalm")

plt.plot(np.arange(min(len(data_cl),len(theory_cl[0]))),theory_cl[0][:len(data_cl)],label="Theory")
plt.xlabel(r'$\ell$')
plt.ylabel(r'$C_\ell$')
plt.legend()
plt.show()

NSIDE 越低,偏移越大。

非常感谢您的帮助。

4

1 回答 1

1

对不起,我错过了 synfast 知道 NSIDE,所以 lmax 默认基于 NSIDE,而 synalm 不知道,所以它将输入频谱的最大 l 作为 lmax。在 synalm 中将 lmax 设置为 3 * NSIDE -1 可以解决差异。

于 2019-01-22T12:57:53.083 回答