2012-03-01 56 views
2

我们有两个质量相等的质量为0.1kg的硬质弹簧连接,k = 10^5N/m。弹簧的剩余长度(以及两个质量之间的初始距离)为d0 = 0.15m质量1具有初始速度(2.77,1.25,0)m/s,而质量2具有初始速度(1.25,4 ,0)m/s。两个质量通过弹簧连接...试图模拟飞行,但有困难

我想写一个代码,模拟重力下这个系统的飞行,而忽略空气阻力。我也想放置位于系统质量中心的第三个球体。

这是我到目前为止已经写的:

from visual import * 

mass1 = sphere(radius = 0.01) 
mass2 = sphere(pos = (0.15, 0, 0), radius = 0.01) 
COM = sphere(pos = (0.15/2, 0, 0), radius = 0.01) 

mass1.m = 0.1 
mass2.m = 0.1 

k = 1*10**5 

mass1.v = vector(2.77, 1.25, 0) 
mass2.v = vector(1.25, 4, 0) 

mass1.p = mass1.v*mass1.m 
mass2.p = mass2.v*mass2.m 

dt = 0.0001 
t = 0 

while 1: 
    g = 9.8 
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos) 

    Ft12 = mass1.m*d*k*0.15 
    Ft21 = mass2.m*d*k*0.15 

    Fnet = Ft12 + Ft21 

    mass1.p += Fnet*dt 
    mass2.p += Fnet*dt 

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m)) 
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m)) 

    mass1.pos += mass1.vA*dt 
    mass2.pos += mass2.vA*dt 
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos 

    t += dt 

FT12是紧张的,从球1的力球2,Ft21从2到1。当然,我也不会发布如果我得到准确的结果,但我甚至没有得到我可以随时观察的结果。屏幕很快变得空白,我没有机会看到发生了什么。我基本上希望这个系统在重力的作用下被“抛出”,在这个系统中你可以想象投影机的轨迹将是抛物线的轨迹。任何帮助将不胜感激。如果我的部队错了,或者我需要在某些地方添加一些,请告诉我!

谢谢大家!

回答

3

我对此行十分怀疑:

dt += 1 

我猜dt是时间步长。每循环一次,您的时间步长就会增加一秒。通常你会增加时间:

t += dt 

但你还没有时间变量呢。一旦你的时间步长变大,所有的地狱都会崩溃。现在我只想删除dt += 1这一行。

至于其余的代码,我没有详细看过它,我无法猜测你的符号是什么意思。代码中可能存在更多问题。

+0

谢谢你指出。现在我想到了,它确实没有任何意义。 – 2012-03-01 21:06:27

2

你没有'睡眠'时间,你在延迟你的动画。随着时间的推移球体从屏幕上消失(我没有真正看过它的物理特性,所以我不知道你是否想要这样做),并且因为你在时间步长之间没有任何延迟 - 它们似乎立即消失。

如果

from time import sleep 

,那么你可以运行下面的循环,而不是

dt = 0.0001 
for step in range(1000): 
    g = 9.8 
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos) 

    Ft12 = mass1.m*d*k*0.15 
    Ft21 = mass2.m*d*k*0.15 

    Fnet = Ft12 + Ft21 

    mass1.p += Fnet*(dt*step) 
    mass2.p += Fnet*(dt*step) 

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m)) 
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m)) 

    mass1.pos += mass1.vA*(dt*step) 
    mass2.pos += mass2.vA*(dt*step) 
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos 
    sleep(0.5) 

我只取出,而(1),因为我不喜欢无限循环= P

这至少可以让你看到三个球体在做什么,所以你可以检查它们是否按照你的期望行事。

+0

“费率”不会以同样的方式工作吗? – 2012-03-01 21:24:33

+1

是的,如果你愿意使用它,费率也会以同样的方式工作。我不经常使用vpython,所以不知道它存在。 – MDT 2012-03-01 23:04:42