ここに示す簡単な重力シミュレーションを作成しました。

最初は、1 回の更新にかかる時間を計算し、それを次の更新 (標準的なもの) に適用することで、可変タイムステップを使用しました。
ただし、この方法では決定性が低下し、シミュレーションごとに結果が異なる可能性があります。これは絶対に望んでいないことです。
固定の時間ステップ (10 秒) を使用する必要があると考えましたが、その後、シミュレーションが定期的な間隔 (約 1 秒) で速度を上げたり下げたりすることに気付きました。
なぜそれが起こっているのですか?Python自体と何か関係がありますか?
コード
メインループ:
while run:
    uni.update(10)
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False
更新方法:
def update (self, dt):
    self.time += dt
    for b1, b2 in combinations(self.bodies.values(), 2):
        fg = self.Fg(b1, b2)
        if b1.position.x > b2.position.x:
            b1.force.x -= fg.x
            b2.force.x += fg.x
        else:
            b1.force.x += fg.x
            b2.force.x -= fg.x
        if b1.position.y > b2.position.y:
            b1.force.y -= fg.y
            b2.force.y += fg.y
        else:
            b1.force.y += fg.y
            b2.force.y -= fg.y
    for b in self.bodies.itervalues():
        ax = b.force.x/b.m
        ay = b.force.y/b.m
        b.position.x += b.velocity.x*dt
        b.position.y += b.velocity.y*dt
        nvx = ax*dt
        nvy = ay*dt
        b.position.x += 0.5*nvx*dt
        b.position.y += 0.5*nvy*dt
        b.velocity.x += nvx
        b.velocity.y += nvy
        b.force.x = 0
        b.force.y = 0