1. 程式人生 > 其它 >python畫球諧函式

python畫球諧函式

之前寫過一個隨筆,描述怎麼用 gnuplot 繪製球諧函式圖:https://www.cnblogs.com/luyi07/p/14713231.html
其中提到,在畫球諧函式這事上,python的缺點是圖片不能旋轉,圖片小不夠清楚華麗,程式碼細節多(其實也還好,多一點點)。
現在,真香定律顯現,我發現,python的上述缺點確實存在,但是,gnuplot沒有內建的球諧函式,得自己寫,而我,懶得寫了,所以還是(真香!)用python畫吧,等有空了再自己寫一個gnuplot內建的球諧函式,然後用pm3d畫吧,gnuplot渲染得確實更好看。

1. 球諧函式定義

不同的書上有不同的約定,咱還是用 Condon-Shortley 相位約定,定義如下:

\[Y^m_n(\theta,\phi) \equiv (-1)^m \sqrt{ \frac{2n+1}{4\pi} \frac{(n-m)!}{(n+m)!} } P^m_n(\cos \theta) e^{im\phi}, \]

其中,\((-1)^m\)即Condon-Shortley相因子,大概是為了方便做角動量代數的,連帶勒讓德函式定義為(Rodriguez公式):

\[P^m_n(x) \equiv \frac{1}{2^n n!} (1-x^2)^{m/2} \frac{ d^{n+m} }{ d x^{n+m} } (x^2-1)^{n+m}. \]

這裡球諧函式的定義與上一個帖子(

https://www.cnblogs.com/luyi07/p/14713231.html)是一致的,但是連帶勒讓德函式的定義略有不同。

2. 球諧函式的繪製程式碼

import numpy as np
import matplotlib.pyplot as plt
from scipy import special
import mpl_toolkits.mplot3d.axes3d as axes3d

theta, phi = np.linspace(0, np.pi, 100), np.linspace(0, 2*np.pi, 100)
THETA, PHI = np.meshgrid(theta, phi)
#help(special.sph_harm)
R = (special.sph_harm(3,3,PHI,THETA).real)**2
X = R * np.sin(THETA) * np.cos(PHI)
Y = R * np.sin(THETA) * np.sin(PHI)
Z = R * np.cos(THETA)
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
plot = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet'),
    linewidth=0, antialiased=False, alpha=0.5)

# below are codes copied from stackoverflow, to make the scaling correct
max_range = np.array([X.max()-X.min(), Y.max()-Y.min(), Z.max()-Z.min()]).max() / 2.0
mid_x = (X.max()+X.min()) * 0.5
mid_y = (Y.max()+Y.min()) * 0.5
mid_z = (Z.max()+Z.min()) * 0.5
ax.set_xlim(mid_x - max_range, mid_x + max_range)
ax.set_ylim(mid_y - max_range, mid_y + max_range)
ax.set_zlim(mid_z - max_range, mid_z + max_range)

#ax.view_init(elev=30,azim=0) #調節視角,elev指向上(z方向)旋轉的角度,azim指xy平面內旋轉的角度

plt.show()


效果如上圖所示。說明以下幾點:

  • plt.show() 上面的那一行,ax.view_init(...)可以調節觀看者的視角
  • 再往上一大段程式碼,是為了保證 xyz三個方向的座標比例完全相同
  • 再往上才是畫圖的核心程式碼,即在立體角各個角度取點,然後使用 plot_surface 函式繪製,其中有染色方案的引數,這部分程式碼是從網上找來以後自己改的。
  • 如果需要儲存圖片,可以新增一行 plt.savefig("xx.jpg"),應該就行了。

綜上所述,我在網上分別找了 plot_surface用法,球諧函式呼叫,scaling方案,視角變換,然後結合兩本教材上球諧函式的相位約定(教材見下面),花了1個多小時實踐操作總結,得到了這篇部落格。親愛的讀者,它就這樣來到你的面前。

3. 鳴謝

  • D. J. Griffiths, "Introduction to Quantum Mechanics",及鄭州大學中文譯本
  • Arfken, Weber, "Mathmatical Methods for Physicists"