Pêndulo físico em VPython

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Pêndulo físico em VPython

Mensagempor jap em Terça Abr 10, 2012 1:26 pm

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."
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Pêndulo físico em VPython

Mensagempor ruifm em Terça Abr 10, 2012 2:24 pm

muito obrigado.
estava na duvida de como se trabalhava com frames...
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Re: Pêndulo físico em VPython

Mensagempor filipematos em Terça Abr 10, 2012 3:40 pm

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 :)
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron