Olá, hoje eu quero oferecer uma ajuda visual para modelar alguns processos físicos e mostrar como obter belas imagens e animações. Cuidado com muitas fotos.
Todo o código pode ser encontrado no google colab .Teoria
Primeiro, precisamos de um pequeno mínimo teórico sobre esse tópico. Vamos começar entendendo o que são linhas de tensão e como contá-las. De fato, essas linhas são a fusão de muitos vetores de tensão, que podem ser calculados da seguinte maneira:.
Método de cálculo E
Calculei o vetor de tensão através da semelhança de triângulos, obtendo assim projeções nos eixos xey y dx e dy, respectivamente.
Da semelhança, segue-se que o raio do vetor da carga até o ponto no espaço re comprimento do vetor de intensidade E é igual à razão das projeções desses vetores (x1 e dx, respectivamente). Fórmula do vetor resultantecom esse conhecimento, obtemos o primeiro resultado.
Função de cálculo de projeçãodef E(q_prop, xs, ys, nq):
l=1
k=9*10**9
Ex=0
Ey=0
c=0
for c in range(len(q_prop)):
q=q_prop[c]
r=((xs-q[0])**2+(ys-q[1])**2)**0.5
dEv=(k*q[2])/r**2
dEx=(xs-q[0])*(dEv/r)*l
dEy=(ys-q[1])*(dEv/r)*l
Ex+=dEx
Ey+=dEy
return Ex, Ey
Método de construção de linha
Primeiro, você precisa decidir sobre o ponto inicial e final de onde a linha e o documento irão. O começo são pontos em um círculo com um raio r ao redor da carga, e os pontos finais não estão mais do que r separados das cargas.código para pontos de partidatheta = np.linspace(0, 2*np.pi, n)
mask=q_prop[ q_prop[:,2]>0 ]
for cq in range(len(mask)):
qmask=mask[cq]
xr = r_q*np.cos(theta)+qmask[0]
yr = r_q*np.sin(theta)+qmask[1]
Portanto, vale a pena dizer que as linhas são construídas apenas a partir de cargas positivas.E, finalmente, a construção de linhas. Para isso, construímos a linha do vetor de tensão a partir do ponto inicial, atualizamos o ponto inicial no final da linha construída e repetimos até que as condições finais mencionadas acima sejam atingidas.
função de cálculo de coordenadas de linhadef Draw(size, q_prop,r_q, n):
linen=np.empty((np.count_nonzero(q_prop[:,2]>0),n, 2000000), dtype=np.float64)
linen[:] = np.nan
theta = np.linspace(0, 2*np.pi, n)
mask=q_prop[ q_prop[:,2]>0 ][ q_prop[q_prop[:,2]>0][:,3]==1 ]
for cq in range(len(mask)):
qmask=mask[cq]
x11 = r_q*np.cos(theta)+qmask[0]
x22 = r_q*np.sin(theta)+qmask[1]
for c in range(len(x11)):
xs=x11[c]
ys=x22[c]
lines=np.empty((2,1000000), dtype=np.float64)
lines[:]=np.nan
stop=0
nnn=0
lines[0][nnn]=xs
lines[1][nnn]=ys
while abs(xs)<size+2 and abs(ys)<size+2:
nnn+=1
for cq1 in range(len(q_prop)):
q=q_prop[cq1]
if ((ys-q[1])**2+(xs-q[0])**2)**0.5<r_q/2 :
stop=1
break
if stop==1:
break
dx, dy = E1(q_prop,xs,ys)
xs+=dx
ys+=dy
lines[0][nnn]=xs
lines[1][nnn]=ys
linen[cq,c,:]=lines.reshape(-1)
return linen
Interação entre cobranças
Para refletir sua interação, é necessário alterar suas coordenadas e velocidade após cada pequeno tempo dt.

Função para atualizar coordenadas e projeções de velocidades de cargadef Update_all(q_prop):
vx=0
vy=0
x=0
y=0
q_prop_1=np.copy(q_prop)
for c in range(len(q_prop)):
xs=q_prop[c][0]
ys=q_prop[c][1]
q =q_prop[c][2]
m =q_prop[c][3]
vx=q_prop[c][4]
vy=q_prop[c][5]
Ex, Ey= E(q_prop, xs, ys, c)
x=(((Ex*q)/m)*dt**2)/2+vx*dt+xs
y=(((Ey*q)/m)*dt**2)/2+vy*dt+ys
vx+=((Ex*q)/m)*dt
vy+=((Ey*q)/m)*dt
q_prop_1[c]=[x,y,q,m,vx,vy]
return q_prop_1
Gravidade
Com base no código existente, escrevi um simulador que reflete os movimentos dos corpos sob a influência da gravidade. As alterações no código são principalmente para a função de tensão, pois a aceleração agora será considerada usando uma fórmula semelhante.
Os planetas começam no eixo x à distância do periélio e à velocidade do periélio. Todos os valores dos planetas e do sol (massa, distância, extremidades) do diretório.Animação para os 4 primeiros planetas + sol.
À espera de críticas e sugestões. Tchau.