我们有两个等质量0.1kg的质量块,由一个k = 10 ^ 5 N / 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.当然,如果我得到准确的结果,我不会发布这个,但我甚至没有得到结果我很容易观察到。屏幕很快就会空白,我没有机会看到发生了什么。我基本上希望这个系统在引力的作用下被“抛出”,你可以想象COM的轨迹将是抛物线的轨迹。任何帮助将不胜感激。如果我的力量不对,或者我需要在某些地方添加一些,请告诉我!
谢谢大家!
答案 0 :(得分:3)
我对这一行感到严重怀疑:
dt += 1
我猜dt
是时间步。您每次在循环周围将时间步长递增一秒。通常你会增加时间:
t += dt
但你还没有时间变量。一旦你的时间步长变大,一切都会破裂。现在我只想删除dt += 1
行。
至于其余的代码,我没有详细查看它,我无法猜出你的符号是什么意思。代码中可能存在更多问题。
答案 1 :(得分:2)
您没有延迟动画的“睡眠”时间。随着时间的推移球体从屏幕上消失(我实际上并没有看过它的物理因素,所以我不知道你是否想要那个)并且因为你没有时间步之间的延迟 - 它们似乎立即消失了。 p>
如果你
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)
我只删除了while(1),因为我不喜欢无限循环= P
这至少可以让你看到三个领域正在做什么,这样你就可以检查它们是否符合你的预期。