我正在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/