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

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

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)