贡献者: addis
目前 Matlab 并不直接提供球谐函数,而只提供连带勒让德函数(legendre
)。以下给出 Matlab 中计算球谐函数的程序。
% 计算球谐函数 Y_{lm}
% 使用 Condon–Shortley 相位(和 Mathematica 相同)
% l, m 必须是整数标量
% 角度 Th 和 Ph 可以是任意实数
% Th 和 Ph 可以是矩阵, 尺寸必须相同, 输出 Y_lm 的尺寸也相同
function Y_lm = SphHarm(l,m,Th,Ph)
mark = mod(Th,2*pi) > pi;
Ph(mark) = Ph(mark) + pi;
if abs(m) > l, error('m > l'); end
Sign = sign(m);
m = abs(m);
P_lm = legendre(l,cos(Th(:)));
P_lm = P_lm(m+1,:);
if (~all(isfinite(P_lm)))
error('l too large');
end
% 归一化因子
Y_lm = zeros(size(Th));
fac_d_fac = prod(l-m+1:l+m);
if (isinf(fac_d_fac))
error('overflow!');
end
N_lm = sqrt((2*l+1)./(4*pi*fac_d_fac));
if Sign >= 0
Y_lm(:) = N_lm * P_lm' .* exp(1i*m*Ph(:));
else
Y_lm(:) = (-1)^m * N_lm * P_lm' .* exp(-1i*m*Ph(:));
end
end