Участок 3D изоповерхности в python - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь построить следующую функцию в 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()

Однако при этом я теряю информацию о положительных и отрицательных долях, т. е. здесь изображены оба.

enter image description here

Я могу обойти это, установив отрицательные значения омега в 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()

enter image description here

Я не уверен, как решить эту проблему - если я увеличу количество точек для THETA и PHI, график будет отображаться очень медленно, и все равно не удастся увеличить количество точек достаточно для полного удаления артефактов. В идеале я должен передать значения r, theta и phi в функцию построения графика и нанести на график изоповерхность с заданным значением omega, но это возможно только для декартов. Преобразование всей функции в декартово приведет к f(x,y,z,r), который я тоже не могу построить.

...