Hola, hoy quiero ofrecerte una ayuda visual para modelar algunos procesos físicos y mostrarte cómo obtener bellas imágenes y animaciones. Precaución muchas fotos.
Todo el código se puede encontrar en google colab .Teoría
Primero, necesitamos un pequeño mínimo teórico sobre este tema. Comencemos por comprender qué son las líneas de tensión y cómo contarlas. De hecho, estas líneas son la fusión de muchos vectores de tensión, que se pueden calcular de la siguiente manera:.
E método de cálculo
Calculé el vector de tensión a través de la similitud de triángulos, obteniendo proyecciones en los ejes x e y dx y dy, respectivamente.
De la similitud se deduce que el radio del vector desde la carga hasta el punto en el espacio r y la longitud del vector de intensidad E es igual a la relación de las proyecciones de estos vectores (x1 y dx, respectivamente). Fórmula del vector resultante.Con este conocimiento obtenemos el primer resultado.
Función de cálculo de proyeccióndef 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 construcción de línea
Primero debes decidir el punto de inicio y final desde donde irán la línea y el documento. El comienzo son puntos en un círculo con un radio r alrededor de la carga, y los puntos finales no están más que r separados de las cargas.código para puntos 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]
Por lo tanto, vale la pena decir que las líneas se construyen solo a partir de cargas positivas.Y finalmente, la construcción de líneas. Para hacer esto, construimos la línea del vector de tensión en él desde el punto inicial, actualizamos el punto inicial al final de la línea construida y repetimos hasta que se alcanzan las condiciones finales mencionadas anteriormente.
función de cálculo de coordenadas de líneadef 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
Interacción entre cargos
Para reflejar su interacción, es necesario cambiar sus coordenadas y velocidad después de cada pequeño tiempo dt.

Función para actualizar coordenadas y proyecciones 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
Gravedad
Basado en el código existente, escribí un simulador que refleja los movimientos de los cuerpos bajo la influencia de la gravedad. Los cambios en el código son principalmente para la función de tensión ya que Ahora se considerará la aceleración utilizando una fórmula similar.
Los planetas comienzan desde el eje x a la distancia del perihelio y a la velocidad del perihelio. Todos los valores de los planetas y el sol (masa, distancia, extremidades) del directorio.Animación para los primeros 4 planetas + sol.
A la espera de críticas y sugerencias. Adiós.