In [31]:
#Simulador do potencial devido a uma carga pontual em espaço vazio e entre placas paralelas
#Autor: Danilo Lessa Bernardineli

#Este programa faz a simulação do potencial eletrostático pela eq. de Poisson
#bem como do campo elétrico através do método de relaxação de Jacobi em duas situações diferentes:
# - Carga pontual em um espaço vazio
# - Carga pontual entre duas placas paralelas com tensão constante

#Dependências
import matplotlib.pyplot as plt
import numpy as np

#Instruções de uso: 
#1 - Coloque True ou False no usarContorno
#2(opcional) - Altere as condições iniciais e parâmetro a gosto
#3 - Dê shift-enter até o final e espere sair o resultado

#%matplotlib inline #descomente caso queira gráficos no proprio IPython ao invés de janelas

In [54]:
#Bloco de condições iniciais

#Coloque True caso queira simular a carga pontual com a presença de placas paralelas
#Coloque False caso queira simular a carga pontual em um espaço vazio
usarContorno = False

#Tensão nas duas placas
Vp = 1
Vn = -1

#Carga pontual
q = 2

In [55]:
#Bloco de parâmetros de simulação

#Número de iterações pelo relaxamento de Jacobi
Ns = 300

#Tamanho da matriz de simulação: N=10*m. Altere somente o m pois ele é utilizado
#para manter a proporção de distância entre as placas bem como a carga
m = 5
N = 10 * m
n = N-1

#localização da carga
ind_q = (5*m, 1*m)

#Eixos x e y
x = np.arange(0, N)
y = np.arange(0, N)

#Condições de contorno
Vc = np.zeros((N, N))
Vc_inds = []
#Condições de contorno no caso das placas
if usarContorno:
    for i in range(2*m, N-2*m):
        Vc[3*m, i] = Vp
        Vc[7*m, i] = Vn
        Vc_inds.append((3*m, i))
        Vc_inds.append((7*m, i))

In [56]:
#cálculo do potencial eletrostático através do método de relaxamento de Jacobi
#Inicialização da matriz de resultados
V = np.zeros((N, N, Ns))
V[:,:,0] = Vc

#Lista contendo a convergência para cada iteração
conv_l = np.zeros((Ns, 1))

for n in range(1, Ns):
    conv = 0
    
    for i in range(1, N-1):
        for j in range(1, N-1):
            
            if  (i,j) in Vc_inds: #Caso caia na condição de contorno
                V[i, j, n] = Vc[i, j]    
                
            elif (i, j) == ind_q: #Caso caia na localização da carga pontual
                V[i, j, n] = (V[i+1,j, n-1]+V[i-1,j, n-1]+V[i,j+1, n-1]+V[i,j-1, n-1] + q)/4 
                
            else: #Espaço livre
                V[i, j, n] = (V[i+1,j,n-1] + V[i-1,j,n-1] + V[i,j+1, n-1] + V[i,j-1,n-1])/4
                
            #Calcular o termo de convergência
            conv += np.abs(V[i, j, n] - V[i, j, n-1])
            
    conv_l[n] = conv

In [57]:
#Obtenção do campo elétrico
Ex = np.zeros((N, N))
Ey = np.zeros((N, N))

n = N-1
for i in range(1, N-1):
    #Campo elétrico nos limites da matriz de simulação
    Ex[0, i] = -(V[1, i,Ns-1] - V[0, i,Ns-1]) / 2
    Ex[n, i] = -(V[n, i,Ns-1] - V[n-1, i,Ns-1]) / 2
    Ey[i, 0] = (V[i, 1,Ns-1] - V[i, 0,Ns-1]) / 2
    Ey[i, n] = (V[i, n,Ns-1] - V[i, n-1,Ns-1]) / 2
    
    for j in range(1, n):
        if (i,j) in Vc_inds: #Não há campo elétrico em um condutor
            continue
        #Campo elétrico no resto do espaço
        Ex[i,j] = -(V[i-1,j,Ns-1]-V[i+1,j,Ns-1]) / 2
        Ey[i,j] = (V[i,j-1,Ns-1]-V[i,j+1,Ns-1]) / 2

In [58]:
#Graficar potencial eletrostático e campo elétrico
plt.matshow(V[:,:,Ns-1])
cb = plt.colorbar()
cb.set_label("Potencial eletrostático")
plt.quiver(y,x,Ey,Ex, units='xy')
plt.title("Potencial eletrostático e campo elétrico")
plt.show()

In [60]:
#Graficar convergência por iteração
plt.plot(np.arange(0, Ns), conv_l, '+-')
plt.xlabel("Número de iterações")
plt.ylabel("Convergência")
plt.title("Convergência em cada termo")
plt.show()

In [61]:
0.2 / (50 * 50)


Out[61]:
8e-05

In [ ]: