Как извлечь 2D плоскость из трехмерной сетки - PullRequest
0 голосов
/ 23 мая 2018

[TLDR]:

По сути, мой вопрос сводится к тому, как можно извлечь двумерные данные плоскости из трехмерной сетчатой ​​сетки

[Подробное описание]:

Я рассчитываю электрическое поле двух (или более) точечных зарядов.Я сделал это в 2D и могу отобразить результаты через matplotlib, используя колчан или streamplot

import numpy as np
from matplotlib import pyplot as plt

eps_0 = 8e-12
fac = (1./(4*np.pi*eps_0))

charges  = [1.0,-1.0]
qx       = [-2.0,2.0]
qy       = [0.0,0.0]

# GRID
gridsize = 4.0
N = 11
X,Y = np.meshgrid( np.linspace(-gridsize,gridsize,N),
                   np.linspace(-gridsize,gridsize,N))
# CALC E-FIELD   
sumEx = np.zeros_like(X)
sumEy = np.zeros_like(Y)

for q, qxi, qyi in zip(charges,qx,qy):
    dist_vec_x = X - qxi
    dist_vec_y = Y - qyi 
    dist = np.sqrt(dist_vec_x**2 + dist_vec_y**2)

    Ex = fac * q * (dist_vec_x/dist**3)
    Ey = fac * q * (dist_vec_y/dist**3)

    sumEx += Ex
    sumEy += Ey

# PLOT
fig = plt.figure()
ax = fig.add_subplot(111)
ax.streamplot(X,Y,sumEx,sumEy)
plt.show()

Это дает правильные результаты 2D dipole

Я могу легко расширить этов 3D

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

eps_0 = 8e-12
fac = (1./(4*np.pi*eps_0))

charges = [1.0,-1.0]
qx      = [-2.0,2.0]
qy      = [0.0,0.0]
qz      = [0.0,0.0]

# GRID
gridsize = 4.0
N = 11
X,Y,Z = np.meshgrid( np.linspace(-gridsize,gridsize,N),
                     np.linspace(-gridsize,gridsize,N),
                     np.linspace(-gridsize,gridsize,N))

# CALC E-FIELD   
sumEx = np.zeros_like(X)
sumEy = np.zeros_like(Y)
sumEz = np.zeros_like(Z)
for q, qxi, qyi, qzi in zip(charges,qx,qy,qz):
    dist_vec_x = X - qxi
    dist_vec_y = Y - qyi
    dist_vec_z = Z - qzi

    dist = np.sqrt(dist_vec_x**2 + dist_vec_y**2 + dist_vec_z**2)

    Ex = fac * q * (dist_vec_x/dist**3)
    Ey = fac * q * (dist_vec_y/dist**3)
    Ez = fac * q * (dist_vec_z/dist**3)

    sumEx += Ex
    sumEy += Ey
    sumEz += Ez  

# PLOT
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.quiver(X,Y,Z,sumEx,sumEy,sumEz, pivot='middle', normalize=True)
plt.show()

Это также дает правильный результат при построении в 3D (насколько я могу судить)

3D dipole

Но по какой-то причине я не могу понять, как извлечь данные из одной плоскости xy из сгенерированной трехмерной сетки.Я думал, что могу сделать что-то вроде

zplane = round(N/2)
ax.quiver(X,Y,sumEx[:,:,zplane],sumEy[:,:,zplane])

, но это не сработает.Кто-нибудь знает правильный путь здесь?

1 Ответ

0 голосов
/ 23 мая 2018

Удалить projection='3d' и индекс X и Y:

fig = plt.figure()
ax = fig.gca()
zplane = round(N/2)
ax.quiver(X[:,:,zplane],Y[:,:,zplane],sumEx[:,:,zplane],sumEy[:,:,zplane])
plt.show()

Если вы выберете конкретный zplane, ваш график больше не является 3D-графиком.

...