Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由弹簧连接的两个物体……试图模拟飞行,但有困难_Python_Physics_Vpython - Fatal编程技术网

Python 由弹簧连接的两个物体……试图模拟飞行,但有困难

Python 由弹簧连接的两个物体……试图模拟飞行,但有困难,python,physics,vpython,Python,Physics,Vpython,我们有两个质量相等的质量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(po

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


谢谢大家!

我对这句话非常怀疑:

dt += 1
我想dt是时间步长。在循环中,每次将时间步长增加一秒。通常,您会增加时间:

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


至于代码的其余部分,我没有详细研究过,也猜不出您的符号表示什么。代码中可能有更多问题。

您没有延迟动画的“睡眠”时间。随着时间的推移,球体从屏幕上消失了,我实际上还没有看它的物理性质,所以我不知道你是否想要它,因为你在时间步长之间没有延迟,它们看起来会立即消失

如果你

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)
我只是删除了while1,因为我不喜欢无限循环=p


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

谢谢你指出这一点。现在我想起来了,它真的没有意义。是的,如果你愿意使用它,费率也会以同样的方式工作。我不经常使用vpython,所以我不知道它的存在。