首页 > 解决方案 > HEALpy - 从像素、l 和 m 的函数中获取球面谐波

问题描述

我需要计算球面谐波的积分及其在球体的一小部分上的不同阶数(l,m)的乘积(为了简单起见,我们假设在半个球体上)。

Healpix/Healpy 包使得计算球谐函数变得非常容易和快速,将函数乘以球谐函数 (SH) 的积分替换为预定义像素中的函数 * SH 值的总和(请参阅此链接)。

但是,我看不到如何直接从 healpy 获得球谐函数的显式值(即只是一个类似 Ylm(index,l,m) 的函数)。

到目前为止,我尝试使用具有球谐函数的包sphtools,并使用简单的代码将其转换为 healpix:

import numpy as np
    
import pyshtools as pysh
import healpy as hp
    
def Ylm_sphtools(theta,phi,l,m,csphase=-1):
    Ylm_sphtools= np.vectorize(pysh.expand.spharm_lm)(l,m,theta,phi,normalization='ortho',kind='complex',                                     degrees=False,csphase=csphase)
    return Ylm_sphtools

def get_Ylm_healpy(nside,l,m):
    npix=hp.nside2npix(nside)
    theta,phi=hp.pix2ang(nside,np.arange(npix))
    return Ylm_sphtools(theta,phi,l,m)
>get_Ylm_healpy(512,10,5)

做它需要的:给我一个 NSIDE=512 的 healpy 地图上每个像素的 Y(l=10,m=5) 值,但正如人们可能已经理解的那样,这非常慢(与 healpy. anafast 函数等)。

所以我的问题是:如何在 healpix 贴图上获得球面谐波(实数和虚数)解析?从这一点开始的集成很简单:将您的 Ylm 值与感兴趣的掩码相加,然后就完成了。

谢谢。

标签: healpy

解决方案


来自 healpix 的一位设计师 Erik Hivon 的回答

要获得healpix 格式的球谐函数Ylm或阶数,可以:l,mnside

import healpy, numpy
alms  = numpy.zeros(  ((l+1)*(l+2) - (l-m)*(l-m+1))//2 , dtype=complex)
alms[-1] = amplitude
ylm = healpy.alm2map(alms, nside=nside, pol=False, sigma=0.0, lmax=l, mmax=m)

amplitude = 0.5对于函数的实部和amplitude = 0.5j虚部。

结果是实部和虚部之差(虚部应乘以1j)。

看起来是合法的,我会在这里测试它并很快报告结果。

编辑:是的,这有效。map2alm如果使用 not healpy.map2alm,但使用上面获得的球谐函数的积分,它可以很好地再现命令。


推荐阅读