Untitled
unknown
plain_text
2 years ago
1.7 kB
11
Indexable
Web VPython 3.2
scene = canvas(background = color.white)
g = 9.8
mu = 0.008
L = 2.5
k = 5
#Natural length
L_0 = 2
mass = 2
ground = box(pos = vec(0,-0.02,0), size = vec(3,0.02,0.4), color = color.green)
b_box = box(pos = vec(-1,0.1,0), size = vec(0.4, 0.2, 0.1), color = color.red)
s_box = box(pos = b_box.pos + vec(L, 0, 0), v = vec(0,0,0), m = mass, size = vec(0.2, 0.2, 0.1), color = color.blue)
spring = helix(pos = b_box.pos, axis = s_box.pos - b_box.pos, radius = 0.05, color = color.orange)
s_box.p = s_box.m * s_box.v
#Velocity graph
vgraph = graph(title = "Velocity", xtitle = "t", ytitle = "v(t)")
#Velocity curve
vx_s = gcurve(graph = vgraph, color = color.cyan)
#Friction graph
fgraph = graph(title = "Force", xtitle = "t", ytitle = "N")
#Friction curves
fscurve = gcurve(graph = fgraph, color = color.orange)
ffcurve = gcurve(graph = fgraph, color = color.green)
t = 0
dt = 0.01
s_box.old_v = s_box.v
s_box.T = 0
scene.waitfor("click")
while t < 20:
rate(1000)
spring.axis = s_box.pos - b_box.pos
L = s_box.pos - b_box.pos
spring.s = mag(L) - L_0
#Hooke's Law
F_s = -k * spring.s * L.hat
#Friction force
F_f = -mu * mass * g * s_box.v.hat
#Total force on system
F = F_s + F_f
s_box.p = s_box.p + F*dt
s_box.v = s_box.p / s_box.m
s_box.pos = s_box.pos + s_box.v * dt
vx_s.plot(pos = (t, s_box.v.x))
fscurve.plot(t, F_s.mag)
ffcurve.plot(t, F_f.mag)
t += dt
if s_box.old_v.x > 0 and s_box.v.x < 0:
print('period: ', s_box.T, '; analytical: ', 2*pi*sqrt(s_box.m/k))
s_box.T = 0
s_box.old_v = s_box.v
s_box.T += dt
Editor is loading...
Leave a Comment