我正在Python中进行重力模拟(准确地说是在3D中使用VPython),并且我确定代码没有错,但是当两个对象彼此靠近时,它的行为会很奇怪。

我的灵感来自http://testtubegames.com/gravity.html。请注意如何放置两个没有速度的行星,它们彼此相对移动,超车,减速并向后转。在我的程序中,它们会超车并减速,但仅与距离成比例,因此从技术上讲,它无论如何都不应后退。

我认识到,如果r(距离)为0或太接近0,则定律f = G *(m1 * m2)/ r ** 2将不起作用,因此我包括了最大输出,所以如果如果小于1,则将其设置为1(顺便说一下,单位不是像素),但仍然无法正常工作。

简单的逻辑还建议对象不应以这种方式做出反应,因此接下来的第二件事是我必须丢失某些东西。

以下是代码摘录:

from visual import *
a = sphere(x=-10,mass=10, vel=vector())
b = sphere(x=10, mass=10, vel=vector())

while 1:
    rate(20)

    #distance between the two objects, a and b, where a.r.mag would be the magnitude of the vector
    a.r = b.pos - a.pos
    b.r = a.pos - b.pos

    a.force = a.r
    if a.r.mag > 1:
        a.force.mag = (a.mass * b.mass) / a.r.mag**2
    else:
        a.force.mag = (a.mass * b.mass) / 1
    a.vel = a.vel + a.force / a.mass


    b.force = b.r
    if b.r.mag > 1:
        b.force.mag = (a.mass * b.mass) / b.r.mag**2
    else:
        b.force.mag = (a.mass * b.mass) / 1
    b.vel = b.vel + b.force / b.mass

    a.pos = a.pos + a.vel
    b.pos = b.pos + b.vel


编辑:为响应Shockburner而重新编写了代码:

from visual import *
import sys

limit2 = sys.float_info.min
limit = limit2**0.5
timestep = 0.0005

a = sphere(x=-5,mass=10, vel=vector())
b = sphere(x=5, mass=10, vel=vector())

def force(ob1, ob2):
    ob1.r = ob2.pos - ob1.pos
    ob1.force = ob1.r + vector()
    if ob1.r.mag > limit:
        ob1.force.mag = (ob1.mass * ob2.mass) / ob1.r.mag2
    else:
        ob1.force.mag = (ob1.mass * ob2.mass) / limit2
    return ob1.force

while 1:
    rt = int(1/timestep)
    rate(rt)

    a.acc = force(a, b) / a.mass
    b.acc = force(b, a) / b.mass

    a.pos = a.pos + timestep * (a.vel + timestep * a.acc / 2)
    b.pos = b.pos + timestep * (b.vel + timestep * b.acc / 2)

    a.acc1 = force(a,b) / a.mass
    b.acc1 = force(b,a) / b.mass

    a.vel = a.vel + timestep * (a.acc + a.acc1) / 2
    b.vel = b.vel + timestep * (b.acc + b.acc1) / 2


朝正确方向的任何帮助或指示将不胜感激,并且如果答案真的很白痴(通常是这种情况),请记住我还是个白痴。

最佳答案

我以前也有这个问题。如果您直接进入Runge-Kutta,一切都会自动进行。该pdf文件将说明如何合并方法:http://spiff.rit.edu/richmond/nbody/OrbitRungeKutta4.pdf。祝好运!

关于python - Python重力模拟器表现异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18620546/

10-11 00:50