我想了解球面諧波展開以解決更復雜的問題,但我期望從一個非常簡單的計算得到的結果是不正確的。我不知道爲什麼會發生這種情況。球面諧波展開的數值計算
理論的比特:衆所周知,一個球體()的表面上的功能可以被定義爲一些常係數和球面諧波無限總和:
球面諧波被定義爲:
其中是關聯勒讓德多項式。
的最後,常係數可以計算(傅立葉類似變換)如下:
問題:假設我們有一個球在中心對於所有點,表面上的功能等於。我們想計算常係數,然後通過近似計算回表面函數。由於恆定係數的計算簡化爲:
def Ylm(l,m,theta,phi):
return scipy.special.sph_harm(m,l,theta,phi)
def flm(l,m):
phi, theta = np.mgrid[0:pi:101j, 0:2*pi:101j]
return Ylm(l,m,theta,phi).sum()
然後經 I」,通過計算限帶總和:
該數值(在Python)可使用近似m期待看到當任何給定的點。
L = 20
f = 0
theta0, phi0 = 0.0, 0.0
for l in xrange(0,L+1):
for m in xrange(-l,l+1):
f += flm(l,m)*Ylm(l,m,theta0,phi0)
print f
但它給了我而不是。對於它給我
我知道它似乎更多的數學問題,但公式應該是正確的。這個問題似乎在我的計算上。這可能是一個非常愚蠢的錯誤,但我無法發現它。任何建議?
感謝
我用你的理論部分同意calulate係數,但是你陳述問題奇蹟般地使用一個和而不是f^l_m的積分。你確定你不想把總和的每個元素與元素的大小相乘嗎?否則,積分將取決於您用於離散化的元素數量。 – mars
也許我錯了,但就我的理解而言,連續空間中的積分減少到離散空間中的總和(如離散傅里葉變換)。有效的縮放因子可能是解決方案,但我不知道如何檢索此值。我爲L = 20做的總數是441.根據我得到的結果,該值應該在1/12860左右。 – lcit
你是對的,你可以使用一筆金額而不是一個積分,也許我不明白你在做什麼。我的觀點是,當你將積分轉換爲總和時,你不能用沒有用某種形式的delta Omega_ij代替d歐米茄。在你的情況下,你的總和的每個元素是一個高度爲Y^l_m(...)的kuboid和一個基礎面積爲(pi/100)*(pi/2/100),所以dOmega大約是1/2000,是由2 pi的因素。正如dmuir寫道的,我認爲使用sin(theta)與球座標整合會照顧到這一點。 – mars