Линии электрического поля - PullRequest
0 голосов
/ 13 ноября 2018
L = 10
Ex = np.zeros([L,L])         # 2D array to store the Ex and
Ey = np.zeros([L,L])  

nq = 2
for i in range(nq): 
    q = random.randrange(-1,2,1) #indicates charge is poistive or negative
    qx = random.randrange(1,N) #indicates the positions of the charge
    qy = random.randrange(1,N)
for i in range(N): 
    for j in range(N): 
        denom = (((i-qx)**2.0+(j-qy)**2.0)**(1.5))
        if denom != 0: 
            Ex[i,j] += (q*(i-qx))/ denom
            Ey[i,j] += (q*(j-qy))/denom
        else: 
            continue

plot(Ex, Ey, color='b') #Could this code also be optimized in streamplot?
show() 

В этой программе я пытаюсь создать линии электрического поля 2-х электрических зарядов (тогда, надеюсь, N # зарядов). Мой подход был следующим:

Шаг1: Определите окно LxL

Шаг2: Выберите случайные места для зарядов и определения величины. (В данном случае я просто взял величину -1,0,1) - Должны ли мои случайные позиции быть двумерными?

Шаг 3: Выберите массив для E Ex (L, L) и Ey (L, L)

Шаг 4: Во вложенном цикле над ix и iy

Ex = x / r ** 3, x = (dx - ix) a, где a - расстояние.

В настоящее время кажется, что мой код в настоящее время отображает только 1 заряд.

1 Ответ

0 голосов
/ 13 ноября 2018

Чтобы получить то, что вы хотите, вы можете использовать quiver plot и исправлять ошибки в коде. Вот как я мог бы изменить код для визуализации напряженности электрического поля:

import numpy as np
import matplotlib.pyplot as plt
import random

np.seterr(divide='ignore', invalid='ignore')

# grid size
N = 15
M = 25
# coordinates
X = np.arange(0, M, 1)
Y = np.arange(0, N, 1)
X, Y = np.meshgrid(X, Y)
# strength
Ex = np.zeros((N, M))
Ey = np.zeros((N, M))
# amount of charges
nq = 3

# computing
qq = [[], []]  # to store charges coordinates
for dummy in range(nq): 
    q = random.choice([-1, 1])
    qx, qy = random.randrange(1, N), random.randrange(1, M)
    # print(q, qx, qy)
    qq[0].append(qy)
    qq[1].append(qx)
    for i in range(N):
        for j in range(M):
            denom = ((i - qx) ** 2 + (j - qy) ** 2) ** 1.5
            if denom != 0: 
                Ex[i, j] += q * (j - qy) / denom
                Ey[i, j] += q * (i - qx) / denom

# arrows color
C = np.hypot(Ex, Ey)
# normalized values for arrows to be of equal length
E = (Ex ** 2 + Ey ** 2) ** .5
Ex = Ex / E
Ey = Ey / E

# drawing
plt.figure(figsize=(12, 8))
# charges
plt.plot(*qq, 'bo')
# field
plt.quiver(X, Y, Ex, Ey, C, pivot='mid')
# colorbar for magnitude
cbar = plt.colorbar()
cbar.ax.set_ylabel('Magnitude')
# misc
plt.title('Electric Field Strength')
plt.axis('equal')
plt.axis('off')
plt.show()

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...