可视化张力线和静电荷的运动,模拟太阳系的行星运动

嗨,今天,我想为您提供视觉帮助,以对一些物理过程进行建模,并展示如何获取精美的图像和动画。注意很多图片。


所有代码都可以在google colab中找到

理论


首先,我们需要在这个主题上有一个小的理论上的下限。让我们首先了解什么是张力线以及如何计算它们。实际上,这些线是许多张力矢量的合并,可以按以下方式计算:E=k|q|r2

图片

E计算方法


我通过三角形的相似性计算了张力矢量,从而分别获得了x和y轴dx和dy的投影。



从相似性出发,可以得出从电荷到空间r中的点的向量的半径以及强度向量E的长度等于这些向量的投影比(分别为x1和dx)。所得向量的公式RE=xdx=ydyE=(i=0Nxi|Ei|Rii=0Nyi|Ei|Ri)
有了这些知识,我们得到了第一个结果。



投影计算功能
def E(q_prop, xs, ys, nq): #q_prop=[[xq1, yq1, q1, mq1, vxq1, vyq1], [xq2, yq2, q2, mq2, vxq2, vyq2] ... ] 
    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


线施工方法


首先,您需要确定直线和文档的起点和终点。起点是围绕装药的半径为r的圆上的点,终点与装药之间的距离不超过r。

起点代码
theta = 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]#


因此,值得一提的是,这些线仅由正电荷构成。

最后,建造线。为此,我们从起点开始在其中构建张力矢量线,在构造的线的末端更新起点,然后重复直到达到上述结束条件。



线坐标计算功能
def 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 


收费之间的互动


为了反映它们的相互作用,必须在每个小时间dt之后更改其坐标和速度。

x+=Exqdt22m+vxdt


y+=Eyqdt22m+vydt


vx+=Exqdtm


vy+=Eyqdtm





用于更新充电速度的坐标和投影的功能
def 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
    #print(q_prop[c]-[x,y,q,m,vx,vy])
    q_prop_1[c]=[x,y,q,m,vx,vy]
  
  return q_prop_1#    


重力


在现有代码的基础上,我编写了一个模拟器,该模拟器反映了重力作用下物体的运动。代码的更改主要是针对张力函数,因为 现在将使用类似公式考虑加速度。

g=Gmr2


g=(i=0Nxi|gi|Rii=0Nyi|gi|Ri)


行星从x轴以近日点距离和近日点速度开始。目录中所有行星和太阳的值(质量,距离,末端)。

前4个行星+太阳的动画。



等待批评和建议。再见

Source: https://habr.com/ru/post/undefined/


All Articles