Я пытаюсь построить следующую функцию в python, используя plotly или matplotlib для заданного значения omega:
omega = (1/(12*np.pi*r**3)*((3*np.cos(THETA)**2-1)+1.5*np.sin(THETA)**2*np.cos(2*PHI)))
Для этого я указываю значение omega
, вычисляем r
и затем преобразовать полярные в декартовы координаты.
import numpy as np
import plotly.graph_objects as go
omega = 10
theta, phi = np.linspace(0,2*np.pi, 400), np.linspace(0,np.pi, 400)
THETA,PHI = np.meshgrid(theta,phi)
#Calculate R for a given value of omega
R1 = (1/(12*np.pi*omega)*((3*np.cos(THETA)**2-1)+1.5**np.sin(THETA)**2*np.cos(2*PHI)))
R = np.sign(R1) * (np.abs(R1))**(1/3)
#Convert to cartesians
X = R * np.sin(PHI) * np.cos(THETA)
Y = R * np.sin(PHI) * np.sin(THETA)
Z = R * np.cos(PHI)
#Plot isosurface plot
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y)])
fig.show()
Однако при этом я теряю информацию о положительных и отрицательных долях, т. е. здесь изображены оба.
Я могу обойти это, установив отрицательные значения омега в NaN
. Это отключает отрицательные лепестки, но приводит к визуализации артефактов для графиков.
import numpy as np
import plotly.graph_objects as go
omega = 10
theta, phi = np.linspace(0,2*np.pi, 400), np.linspace(0,np.pi, 400)
THETA,PHI = np.meshgrid(theta,phi)
#Calculate R for a given value of omega
R1 = (1/(12*np.pi*omega)*((3*np.cos(THETA)**2-1)+1.5**np.sin(THETA)**2*np.cos(2*PHI)))
R = np.sign(R1) * (np.abs(R1))**(1/3)
#Remove negative lobes
R[R1 < 0.] = np.NaN
#Convert to cartesians
X = R * np.sin(PHI) * np.cos(THETA)
Y = R * np.sin(PHI) * np.sin(THETA)
Z = R * np.cos(PHI)
#Plot isosurface plot
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y)])
fig.show()
Я не уверен, как решить эту проблему - если я увеличу количество точек для THETA
и PHI
, график будет отображаться очень медленно, и все равно не удастся увеличить количество точек достаточно для полного удаления артефактов. В идеале я должен передать значения r
, theta
и phi
в функцию построения графика и нанести на график изоповерхность с заданным значением omega
, но это возможно только для декартов. Преобразование всей функции в декартово приведет к f(x,y,z,r
), который я тоже не могу построить.