Página 1 de 1

Pêndulo físico em VPython

MensagemEnviado: Terça Abr 10, 2012 1:26 pm
por jap
Aqui vai o programazito que vos foi apresentado na 3ª sessão do Quark!-2012.

Código: Seleccionar Todos
"""
Pendulo com amortecimento, sujeito a um momento de torsao constante
@jap 29/10/2011
"""

from visual import *
from visual.graph import * # graphing capability

scene = display(title='Pendulum')

# draw pendulum
pendulum = frame()
bob = sphere(frame = pendulum, pos = (0,-1,0), \
             radius = 0.15, color = color.red)
rod = cylinder(frame = pendulum, pos = (0,0,0), axis = (0,-1,0),\
               length = 0.85, radius = 0.02, color = color.blue)
# draw suport of pendulum
suport = frame()
hasth = cylinder(frame = suport, pos = (0,0,0), axis = (0,0,-1),\
               length = 0.50, radius = 0.02, color = color.yellow)
hastv = cylinder(frame = suport, pos = (0,0,-0.5), axis = (0,-1,0),\
               length = 2.0, radius = 0.02, color = color.yellow)
base = box(pos=(0,-2,-0.5), length=0.3, height=0.08, width=0.4, \
           material=materials.wood)

# set up graphs
graph1 = gdisplay(x=10, y=475, width=400, height=300,
title='Angle vs. Time', xtitle='time (s)', ytitle='angle (rad)',
foreground=color.black, background=color.white)
curve1 = gcurve(gdisplay = graph1, color = color.black)

graph2 = gdisplay(x=500, y=475, width=400, height=300,
title='Velocity vs. Time', xtitle='time (s)', ytitle='omega (rad/s)',
foreground=color.black, background=color.white)
curve2 = gcurve(gdisplay = graph2, color = color.black)

graph3 = gdisplay(x=1000, y=100, width=400, height=300,
title='Phase Space', xtitle='angle (rad)', ytitle='omega (rad/s)',
foreground=color.black, background=color.white)
curve3 = gcurve(gdisplay = graph3, color = color.blue)


# time
time = 0
dt = 0.01
tmax = 200

print "Physical pendulum\n\n\n\n"
gamma, beta = 0.0,0.02
theta, omega = 30.0,5.0

# draw pendulum at starting position
theta = math.radians(theta)
pendulum.rotate(angle = theta, axis = (0,0,1), origin = (0,0,0))

# integration via simple Euler-Cromer method; not very precise but should do.

print "Please wait..."
while time <tmax:
    rate(100)
    time += dt
    alpha = gamma - beta*omega - sin(theta)
    omega += alpha * dt
    theta += omega * dt
    nn,theta=divmod(theta,2*pi)
    if theta > pi: theta -=2*pi
    pendulum.rotate(angle = omega * dt, axis = (0,0,1), origin = (0,0,0))
    curve1.plot(pos = (time, theta))
    curve2.plot(pos = (time, omega))
    curve3.plot(pos = (theta, omega))
print "Done."

Re: Pêndulo físico em VPython

MensagemEnviado: Terça Abr 10, 2012 2:24 pm
por ruifm
muito obrigado.
estava na duvida de como se trabalhava com frames...

Re: Pêndulo físico em VPython

MensagemEnviado: Terça Abr 10, 2012 3:40 pm
por filipematos
Muito obrigado professor, assim como o Rui também estava com alguns problemas na tentativa de utilizar os frames, que desconhecia mas são bastante úteis :)