【问题标题】:Two masses connected by a spring...trying to simulate flight but having difficulties由弹簧连接的两个质量...试图模拟飞行但遇到困难
【发布时间】:2012-03-01 21:00:02
【问题描述】:

我们有两个质量相等的 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 的轨迹将是抛物线的轨迹。任何帮助将不胜感激。如果我弄错了力量,或者我需要在某些地方添加一些,请告诉我!

谢谢大家!

【问题讨论】:

    标签: python physics vpython


    【解决方案1】:

    我对这条线有严重的怀疑:

    dt += 1
    

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

    t += dt
    

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

    至于代码的其余部分,我没有详细查看它,我无法猜测您的符号表示什么。代码中可能还有更多问题。

    【讨论】:

    • 感谢您指出这一点。现在想来,确实没有道理。
    【解决方案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)
    

    我只删除了 while(1),因为我不喜欢无限循环 =P

    这至少可以让您看到三个球体在做什么,这样您就可以检查它们的行为是否符合您的预期。

    【讨论】:

    • 是的,如果您更愿意使用 rate ,它的工作方式也一样。我不经常使用 vpython 所以不知道它的存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2019-10-14
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多