在Python中可视化球谐函数

在Python中可视化球谐函数,python,python-3.x,numpy,Python,Python 3.x,Numpy,我正试图为我的大学项目画一个球谐函数。下面我要描述的公式 Y = cos(theta) 为此,我编写了这段代码 import numpy as np from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt def sph2cart(r, phi, tta): ''' r is from 0 to infinity ''' ''' phi is from 0 to 2*pi ''' '''

我正试图为我的大学项目画一个球谐函数。下面我要描述的公式

Y = cos(theta)
为此,我编写了这段代码

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

def sph2cart(r, phi, tta):
   ''' r is from 0 to infinity '''
   ''' phi is from 0 to 2*pi '''
   ''' tta is from 0 to pi '''
   x = r* np.sin(tta)* np.cos(phi)
   y = r* np.sin(tta)* np.sin(phi)
   z = r* np.cos(tta)
   return x, y, z

# phi running from 0 to pi and tta from 0 to pi
phi = np.linspace(0, 2* np.pi, 25)
tta = np.linspace(0, np.pi, 25)
# meshgrid to generate points
phi, tta = np.meshgrid(phi, tta)

# THIS IS THE FUNCTION
Y = np.cos(tta)
# finally all things in cartesian co-ordinate system
# Note that "Y" is acting as "r"
x, y, z = sph2cart( Y, phi, tta)

# plotting :-
fig = plt.figure()
ax = fig.add_subplot( 111 , projection='3d')
ax.plot_surface(x, y, z, linewidth = 0.5, edgecolors = 'k')
然后,得到球体作为结果。这是不正确的,因为实际结果是哑铃状的形状。请参见此图像的第二行


维基百科文章中的图片是通过使用球面谐波的绝对值作为r坐标,然后根据谐波的符号对表面着色而获得的。这是一个近似值

x, y, z = sph2cart(np.abs(Y), phi, tta)

fig = plt.figure()
ax = fig.add_subplot( 111 , projection='3d')

from matplotlib import cm
ax.set_aspect('equal')
ax.plot_surface(x, y, z, linewidth = 0.5, facecolors = cm.jet(Y), edgecolors = 'k')


当您将Y本身用作r时,两个半球(正Y和负Y)最终映射到上面曲面的同一半上

传递给函数的Y必须是绝对值,才能使其为r,否则z=cos(θ)^2始终为正。如果r是半径,那么这就是你应该做的

x, y, z = sph2cart(np.abs(Y), phi, tta)

它不是一个球体,它是一个球体,如果你想看到真实的比例使用
plt.axis(“equal”)
,这个方程只是其中一个波瓣。我还发现它绘制了一些漂亮的球谐函数。