我正在为我的物理课做一个教程。
我做了一个程序,应该在一个弹簧移动的盒子上有一个推车,应该减速停止,然而,当我运行时,看起来春天正在加速推车(无论我做哪个事情)否定。)
我听说vPython舍入数字可能是一个问题导致加速,如果这是真的,我可以让所有数字大1000倍并修复吗?
谢谢!
from visual import *
from visual.graph import *
length=1.0
track=box(pos=vector(0,-0.05,0),
size=(length, 0.05, 0.10),
material=materials.bricks,)
# creates the track which is "length"meters in the
# x direction, 0.05m tall, and 1m deep
start=-0.5*length+0.05
cart=box(pos=vector(start+0.01,0,0),
size=(0.1,0.05,0.1),
color=color.green)
k=-4
#spring constant
sprL=(start-0.05)-0.1
#sets position of left end of spring
spring=helix(pos=(sprL,0,0),
axis=((cart.x-0.05)-sprL,0,0),
radius=0.02,
color=color.yellow)
cart.m=0.70
#mass of cart
cart.vel=vector(0,0,0)
#initial velocity of cart
cart.force = k*(cart.x)*vector(1,0,0)
#force of the spring
cart.accel=cart.force/cart.m
#acceleration of the cart taking into account the fan
t=0
deltat=0.01
end=0.5*length-0.05
#defining the end of the track
gdisplay(x=100,
y=500,
xtitle='time (sec)',
ytitle='X (cyan), Px (red)')
xcurve = gcurve(color=color.cyan)
pcurve= gcurve (color=color.red)
while cart.x<end+0.01 and (cart.x>(start-0.01)):
#we include -0.01 so the cart does not fail immediately upon start...
cart.pos = cart.pos + cart.vel*deltat+(0.5)*(cart.accel)*deltat**2
#x equals x naught plus v times delta t plus one half a delta t squared
#note that ** means "to the power of"
xcurve.plot(pos=(t,cart.x))
pcurve.plot(pos=(t,cart.vel.x))
cart.vel=cart.vel+cart.accel*deltat
#new velocity is old velocity plus acceleration times time
cart.force=k*(cart.x)*vector(1,0,0)
cart.accel=cart.force/cart.m
spring.axis=((cart.x-0.05)-sprL,0,0)
t=t+deltat
#increments time
rate(100)
#rate means no more than 100 loops per second
答案 0 :(得分:2)
你的系统中没有耗散力(一个从中泄漏能量的力量)。等式F = -kx
节省了能量(这是你有点迂回编码的等式,代表弹簧施加在物体上的力)。请注意,这里的等式并不意味着力总是负的,它只是指向cart.pos
的相反方向。这就是你获得正弦运动的方法。
物体需要耗散力才能实际减速。对于某个常量F = -kx -bv
,b
代表了这个典型的例子,v
是对象的速度。这表示你的春天被流体(空气/水/任何你喜欢的东西)减速。
在这种情况下,对代码的最小更改将在您的循环中:
cart.force=(k*(cart.x)-0.1*cart.vel.x)*vector(1,0,0)
这会产生一个欠阻尼系统,试用一个过阻尼系统,你可以设置0.1到10。