2016-08-31 34 views
1

我想了解球面諧波展開以解決更復雜的問題,但我期望從一個非常簡單的計算得到的結果是不正確的。我不知道爲什麼會發生這種情況。球面諧波展開的數值計算


理論的比特:衆所周知,一個球體(\mathbb{R}^{3})的表面上的功能可以被定義爲一些常係數和球面諧波無限總和:

球面諧波被定義爲:

其中是關聯勒讓德多項式。

的最後,常係數可以計算(傅立葉類似變換)如下:


問題:假設我們有一個球在中心對於所有點,表面上的功能等於。我們想計算常係數,然後通過近似計算回表面函數。由於恆定係數的計算簡化爲:

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 

它給了我而不是。對於它給我

我知道它似乎更多的數學問題,但公式應該是正確的。這個問題似乎在我的計算上。這可能是一個非常愚蠢的錯誤,但我無法發現它。任何建議?

感謝

+2

我用你的理論部分同意calulate係數,但是你陳述問題奇蹟般地使用一個和而不是f^l_m的積分。你確定你不想把總和的每個元素與元素的大小相乘嗎?否則,積分將取決於您用於離散化的元素數量。 – mars

+0

也許我錯了,但就我的理解而言,連續空間中的積分減少到離散空間中的總和(如離散傅里葉變換)。有效的縮放因子可能是解決方案,但我不知道如何檢索此值。我爲L = 20做的總數是441.根據我得到的結果,該值應該在1/12860左右。 – lcit

+0

你是對的,你可以使用一筆金額而不是一個積分,也許我不明白你在做什麼。我的觀點是,當你將積分轉換爲總和時,你不能用沒有用某種形式的delta Omega_ij代替d歐米茄。在你的情況下,你的總和的每個元素是一個高度爲Y^l_m(...)的kuboid和一個基礎面積爲(pi/100)*(pi/2/100),所以dOmega大約是1/2000,是由2 pi的因素。正如dmuir寫道的,我認爲使用sin(theta)與球座標整合會照顧到這一點。 – mars

回答

1

球面諧波正交與內積

<f|g> = Integral(f(theta,phi)*g(theta,phi)*sin(theta)*dphi*dtheta) 

所以你應該

clm = Integral(Ylm(theta, phi) * sin(theta)*dphi*dtheta) 
+0

所以我應該能夠使用像下面這樣的總和來計算係數f:'flm = Sum(Ylm(theta,phi)* sin(theta))'這可以轉換成Python代碼,如: 'def flm(l, m): phi,theta = np.mgrid [0:np.pi:101j,0:2 * np.pi:101j] return np.multiply(Ylm(1,m,theta,phi),np.sin (theta))。sum() ' ? – lcit

+0

對不起,我不知道python,但我認爲你需要規範化。如果你'積分'常數1,你應該得到4 * pi(球體的面積),所以歸一化常數是4 * pi /無論你得到什麼 – dmuir