-
Notifications
You must be signed in to change notification settings - Fork 0
/
Pendulum.py
76 lines (58 loc) · 2.31 KB
/
Pendulum.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#
# See the exercise "Pendulum.pdf" from Pendulum.html
# in http://www.physics.cornell.edu/sethna/StatMech/ComputerExercises/
#
"""Simple example animating the motion of a pendulum."""
# The "visual" module can create 3D objects (such as spheres, curves, etc.)
# and animate their motions in space.
# See www.vpython.org
import visual
# kludge required to get visual window up and running before import scipy/numpy
scene2 = visual.display()
c = visual.cone(radius=1.0e-10)
c.visible = 0
# numpy allows us to use "array", "sin", "cos" etc.
# numpy is also imported in "visual"
from numpy import *
# Physical properties and initial conditions for pendulum
g = 9.8
L = 1.0 # physical length of bar
d = 0.02 # thickness of bar: needed for graphics
theta = 2.*pi/3. # initial upper angle (from vertical)
thetaDot = 0. # start pendulum at rest
# Set up graphics display
visual.scene.title = 'Pendulum'
visual.scene.height = visual.scene.width = 800
pivot = array([0,0,0]) # pivot position of pendulum
visual.scene.center = pivot # graphics center
# Build a cylinder representing current position of pendulum
# Cylinder extends from bar.pos to bar.pos + bar.axis.
#
# "visual" will automagically move the image of the pendulum whenever
# one of its properties changes: we'll be moving bar.axis
bar = visual.cylinder(pos=pivot, axis = (L*sin(theta),
-L*cos(theta),0),
radius = d, color=visual.color.red)
# The scale of the graph is set automatically by the system by default.
# We allow it to do so for the first frame (created above when we
# constructed "bar"), but don't want it to keep rescaling as the pendulum moves
visual.scene.autoscale = False
# visual.rate(rateWait) will pause to ensure not too many frames are drawn
# so that the graphics can keep up
framesPerSecond = 50
# Time steps for our pendulum
# Simple time stepping algorithm
dt = 0.01
t = 0.
while 1:
# Calculate accelleration due to gravity
thetaDotDot = -(g/L) * sin(theta)
# Change velocity according to accelleration
thetaDot += thetaDotDot * dt
# Change position according to (updated) velocity
theta += thetaDot * dt
# Change position according to (updated) velocity
bar.axis = (L*sin(theta), -L*cos(theta), 0)
t = t+dt
# Slow down graphics
visual.rate(framesPerSecond)