Visualización de armónicos esféricos en Python.

Estoy tratando de dibujar un armónico esférico para mi proyecto universitario. La siguiente fórmula que quiero representar,

Y = cos(theta) 

Para eso escribí este código.

 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') 

Y, obtener la esfera como resultado. Lo que no es correcto, porque el resultado real es una forma de mancuerna. Ver la segunda fila de esta imagen,

https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Spherical_Harmonics.png/1024px-Spherical_Harmonics.png

La imagen en el artículo de Wikipedia Los armónicos esféricos se obtienen utilizando el valor absoluto de un armónico esférico como la coordenada r, y luego coloreando la superficie según el signo del armónico. Aquí hay una aproximación.

 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') 

pesa

Cuando usa Y como r, los dos hemisferios (Y positivo y Y negativo) terminan mapeados en la misma mitad de la superficie anterior.

La Y que está pasando a la función debe ser un valor absoluto para que r, de lo contrario, z = cos (theta) ^ 2 siempre es positivo. Si r es el radio, entonces esto es lo que deberías estar haciendo.

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