Here is the visual python code for a “fancy” pendulum exhibiting simple harmonic motion. Clicking anywhere in the window will reset the pendulum to that angle.
from __future__ import division, print_function from visual import * import numpy as np # Set the constants g = 9.80 # (m/s^2) L = 10 # Length of the pendulum initialAngle = 1.3 # In radians # Make the pendulum bob, a small ceiling, a hinge, and the rod. position = [L*np.sin(initialAngle), -L*np.cos(initialAngle), -0.15] pend = cylinder(pos=position, axis=(0, 0, 0.3), radius=1) box(pos=(0, 0.25, -2.6), length=10, height=0.5, width=5) box(pos=(0, 0.25, 2.6), length=10, height=0.5, width=5) cylinder(pos=(0, 0, -0.15), axis=(0, 0, 0.3), radius=0.4) rod = cylinder(pos=(0, 0, 0), axis=(pend.pos[0], pend.pos[1], 0), radius=0.1) def position(time): """ Given time, t, this function moves the pendulum to its new position. We use the equation: theta(t) = theta_0*cos(sqrt(g/L)*t) """ theta = initialAngle*np.cos((g/L)**(1/2)*time) # Angle of the pendulum pend.pos = [L*np.sin(theta), -L * np.cos(theta), -0.15] # Update position of bob rod.axis = [pend.pos[0], pend.pos[1], 0] # Update rod's position i = 0 while True: rate(100) if scene.mouse.clicked: m = scene.mouse.getclick() angle = np.arctan2(m.pos[0], -m.pos[1]) pend.pos = [L * np.sin(angle), -L * np.cos(angle), -0.15] rod.axis = [pend.pos[0], pend.pos[1], 0] initialAngle = angle else: position(i) i += 0.01
This script does not work in my anaconda Ver3.7 install under Windows 10.
Does it in anaconda Ver2.7 ? How can we make this work?
But I also have PythonXY() 2.7 and only in that it works
I just tested the version at https://github.com/leonhostetler/undergrad-projects/blob/master/computational-physics/04_visual_python/fancy_simple_pendulum.py (which I believe is the same as the above) in my Python 2.7 on Linux, and it works. When I first wrote this, I wrote it on Windows in some version of Python 3, I believe. So it should work provided that you have VPython installed and working.