Python 太阳系模拟-我的计算哪里出错了?

Python 太阳系模拟-我的计算哪里出错了?,python,tkinter,python-3.6,simulation,physics,Python,Tkinter,Python 3.6,Simulation,Physics,我正在使用物理方程、x和y坐标以及使用2D列表的字典为一个项目进行2D太阳系模拟。我正在使用tkinter画布构建动画 “地球”这颗行星似乎在屏幕上消失了,起初加速非常缓慢,不久之后又以巨大的加速度消失了。我看不出有什么问题 在此之前,我只让地球绕着太阳旋转,以类似的方式成功地使用了方程,并通过计算位移的x和y分量在画布上移动地球。字典的顺序是:{code>{(-body):[[x,y],[x速度,y速度],质量,[x位移的变化,y位移的变化]}。如果需要,计算出的值将存储或添加到此字典中的某些

我正在使用物理方程、x和y坐标以及使用2D列表的字典为一个项目进行2D太阳系模拟。我正在使用tkinter画布构建动画

“地球”这颗行星似乎在屏幕上消失了,起初加速非常缓慢,不久之后又以巨大的加速度消失了。我看不出有什么问题

在此之前,我只让地球绕着太阳旋转,以类似的方式成功地使用了方程,并通过计算位移的x和y分量在画布上移动地球。字典的顺序是:{code>{(-body):[[x,y],[x速度,y速度],质量,[x位移的变化,y位移的变化]}。如果需要,计算出的值将存储或添加到此字典中的某些值。我使用的代码如下:

G = 6.67384 * 10 ** -11                                              
scale = 10 ** 13                                                                             
speed = 1                 
global user_status
screen = Tk()
screen.title('Solar System' + ' - ' + user_status)
screen.geometry('1300x700')

ani = Canvas(screen, width=1300, height=700)
ani.pack()
ani.create_rectangle(0, 0, 1300, 700, fill='Black')

sunx = 636
suny = 343
sun = ani.create_oval(sunx-10, suny-10, sunx+10, suny+10, fill='yellow')

earthx = 746
earthy = 343

moonx = 747
moony = 343

bodies = {'sun':  [[sunx, suny],     [0, 0],                         1.989 * 10 ** 30 * speed / scale,      [0, 0]],
          'earth':[[earthx, earthy], [0, 347.3833062 * 1.033447099], 5.972 * 10 ** 24 * speed / scale,      [0, 0]],
          'moon': [[moonx, moony],   [0, 360],                       7.34767309 * 10 ** 22 * speed / scale, [0, 0]]
          }

body_names = []
for Ω in bodies.keys():
    body_names.append(Ω)

moon = ani.create_oval(moonx - 4, moony - 4, moonx + 4, moony + 4, fill='grey70')
earth = ani.create_oval(earthx-6, earthy-6, earthx+6, earthy+6, fill='sky blue')

timestep = 0.0001

while True:
    for i in range(len(body_names)):
        body1 = body_names[i]
        x1 = bodies[body1][0][0]
        y1 = bodies[body1][0][1]
        total_Fx = 0
        total_Fy = 0
        body1_mass = bodies[body1][2]
        for j in range(len(body_names)):
            body2 = body_names[j]
            if body1 != body2:
                x2 = bodies[body2][0][0]
                y2 = bodies[body2][0][1]
                body2_mass = bodies[body2][2]

                r = sqrt(((x1 - x2) ** 2) + ((y1 - y2) ** 2))
                rx = (x1 - x2)
                angle = (acos(rx/r))

                F = (G * body1_mass * body2_mass) / (r ** 2)
                Fx = F * cos(angle)
                Fy = F * sin(angle)

                total_Fx += Fx
                total_Fy += Fy

        ax = (total_Fx / body1_mass)
        ay = (total_Fy / body1_mass)

        ux = bodies[body1][1][0]
        uy = bodies[body1][1][1]

        vx = ux - (ax * timestep)
        if x1 <= sunx:
            vy = uy + (ay * timestep)
        else:
            vy = uy - (ay * timestep)

        sx = vx * timestep * speed
        sy = vy * timestep * speed

        bodies[body1][3][0] = sx
        bodies[body1][3][1] = sy

        bodies[body1][1][0] += vx
        bodies[body1][1][1] += vy

        bodies[body1][0][0] = x1 + sx
        bodies[body1][0][1] = y1 + sy
        print(bodies[body1][1], body1)

    move_e_x = bodies['earth'][3][0]
    move_e_y = bodies['earth'][3][1]
    ani.move(earth, move_e_x, move_e_y)

    move_m_x = bodies['moon'][3][0]
    move_m_y = bodies['moon'][3][1]
    ani.move(moon, move_m_x, move_m_y)

    ani.update()
G=6.67384*10**-11
比例=10**13
速度=1
全局用户状态
screen=Tk()
屏幕标题('太阳系'+'-'+用户状态)
屏幕几何(“1300x700”)
ani=画布(屏幕,宽度=1300,高度=700)
ani.pack()
ani.创建矩形(0,0,1300,700,fill='Black')
sunx=636
纽约州立大学=343
sun=ani.创建椭圆(sunx-10、suny-10、sunx+10、suny+10、fill='yellow')
earthx=746
土质=343
月X=747
穆尼=343
body={'sun':[[sunx,suny],[0,0],1.989*10**30*速度/刻度,[0,0]],
“地球”:[earthx,earthy],[0347.3833062*1.033447099],5.972*10**24*速度/刻度,[0,0]],
“月亮”:[moonx,moony],[0360],7.34767309*10**22*速度/刻度,[0,0]]
}
body_names=[]
对于body.keys()中的Ω:
主体名称。附加(Ω)
moon=ani.创建椭圆(moonx-4,moony-4,moonx+4,moony+4,fill='grey70')
earth=ani.创建椭圆(earthx-6,earthy-6,earthx+6,earthy+6,填充为天蓝色)
时间步长=0.0001
尽管如此:
对于范围内的i(len(body_name)):
body1=body_名称[i]
x1=主体[body1][0][0]
y1=实体[body1][0][1]
总数Fx=0
总计_Fy=0
车身1_质量=车身[body1][2]
对于范围内的j(len(body_name)):
body2=body_名称[j]
如果body1!=body2:
x2=主体[body2][0][0]
y2=主体[body2][0][1]
body2_mass=物体[body2][2]
r=sqrt((x1-x2)**2)+(y1-y2)**2))
rx=(x1-x2)
角度=(acos(rx/r))
F=(G*车身1_质量*车身2_质量)/(r**2)
Fx=F*cos(角度)
Fy=F*sin(角度)
总_Fx+=Fx
总计_Fy+=Fy
ax=(总重量/车身1重量)
ay=(总重量/车身1重量)
ux=主体[body1][1][0]
uy=主体[body1][1][1]
vx=ux-(ax*时间步)

如果x1两次接收到初始速度:在每个循环中,调用并使用初始速度,因此将其自身和新速度相加,使其每次增加一倍以上


现在计算新增加的速度,然后只将其添加到初始速度中一次。行星现在绕轨道运行。目前有9个天体绕太阳运行。

这些数字太大了。请尝试缩小它们的比例。感谢您的评论,但我已成功地使用这些数字创建了一个绕轨道影响,但没有di字典存储系统,所以我不认为数字需要缩放,但我不知道为什么数字会变得这么大。这似乎发生在速度或位移计算中。然后你需要做一些调试,以找出计算在什么时候停止。对不起,但我觉得这个建议没有特别的帮助。我不知道为什么或者,当值变得如此之大时,似乎无法解释。首先,找出哪个数字太大-
(x1-x2)**2
(y1-y2)**2
。然后找出
x1
y1
x2
y2
是否是您所期望的。通过代码查看它们是如何计算的。换句话说,手动逐步完成代码并自己进行计算。在某些情况下,数字会偏离您所期望的。