Show code cell content
import mmf_setup;mmf_setup.nbinit()
%matplotlib inline
import numpy as np, matplotlib.pyplot as plt
import manim.utils.ipython_magic
This cell adds /home/docs/checkouts/readthedocs.org/user_builds/physics-521-classical-mechanics-i/checkouts/latest/src to your path, and contains some definitions for equations and some CSS for styling the notebook. If things look a bit strange, please try the following:
- Choose "Trust Notebook" from the "File" menu.
- Re-execute this cell.
- Reload the notebook.
Manim Community v0.18.0
Assignment 5: Rigid Bodies#
Due: 11:59pm Wednesday 15 November 2023
Rolling Ring#
Consider a ring rolling in a circle. Treat the ring as thin, with radius \(R\) and uniform mass \(M\). Assume that the ring rolls without slipping. Determine all properties of the motion (period of the orbit, radius of the circle, angle of the ring, angular velocities etc.) Be sure to clearly sketch the geometry of your problem, perform a dimensional analysis, and check your solution by considering various limits.
Show how to compute the moment of inertial tensor \(I_{ij}\) from its definition:
Rolling Hoop (Phantom Torques)#
Show code cell content
import manim.utils.ipython_magic
Solve for the equations of motion for a rolling half-circle as discussed in the class notes Phantom Torque and shown below:
Show code cell source
%%manim -v WARNING -qm RollingHoop
from manim import *
from types import SimpleNamespace
class Hoop:
R = 4.0
theta0 = 0.6
r_cm = 2 / np.pi * R
m = 1.0
I_o = m * R ** 2
I_cm = I_o - m * r_cm ** 2
shift = UP
def __init__(self, **kw):
for k in kw:
assert hasattr(self, k)
setattr(self, k, kw.pop(k))
assert not kw
self.objects = self.annotations
def get_arc(self, theta=None):
"""Return a (arc, points) for a hoop"""
color = 'white'
if theta is None:
theta = self.theta0
color = 'BLUE_C'
z_o = -self.R * theta + 0j
z_cm = z_o - 1j * self.r_cm * np.exp(theta * 1j)
z_p = z_o - 1j * self.R
o, p, cm = [np.array([_z.real, _z.imag, 0]) for _z in [z_o, z_p, z_cm]]
e1 = o + self.R * np.array([np.cos(theta), np.sin(theta), 0])
arc = Arc(
radius=self.R, start_angle=PI + theta, angle=PI, arc_center=o,
color=color
)
arc.stroke_width = 10.0
points = SimpleNamespace(O=o+self.shift, P=p+self.shift, C=cm+self.shift)
arc.shift(self.shift)
# These are the actual objects we display
return (arc, points)
@property
def annotations(self):
"""Return a `Group` object with the hoop and all of the annotations."""
arc, points = self.get_arc()
objs = []
P, C, O = points.P, points.C, points.O
for _p0, _p1, _t in [
(arc.get_end(), O, "R"),
(C, O, r"a"),
]:
objs.append(BraceBetweenPoints(_p0, _p1))
objs.append(objs[-1].get_tex(_t))
#objs[-1].font_size = 40
objs.extend(
[
LabeledDot("O", point=O),
LabeledDot("P", point=P),
LabeledDot("C", point=C),
]
)
OC = DashedLine(O, C, color='BLUE_C')
OP = DashedLine(O, P, color='BLUE_C')
theta = Angle(OP, OC, radius=0.7, dot_radius=2.0)
theta_l = Tex(r"$\theta$")
_m = theta.get_midpoint()
theta_l.next_to(O + 1.5*(_m-O), 0)
objs.extend([OC, OP, theta, theta_l])
floor = Line((-6, -self.R, 0), (6, -self.R, 0))
floor.shift(self.shift)
floor.stroke_width = arc.stroke_width
self.arc = arc
annotations = Group(arc, floor, *objs)
return annotations
class HoopAnimation(Animation):
def __init__(self, hoop, **kw):
super().__init__(hoop.get_arc(theta=hoop.theta0)[0], **kw)
self.hoop = hoop
def interpolate_mobject(self, alpha):
# Fake dynamics
theta = self.hoop.theta0 * np.cos(2*np.pi * alpha)
self.mobject.points = self.hoop.get_arc(theta=theta)[0].points
class RollingHoop(Scene):
def construct(self):
hoop = Hoop()
self.add(hoop.annotations)
#self.play(HoopAnimation(hoop=hoop), run_time=3, rate_func=linear)
Here we have half of a hoop of mass \(m\) and radius \(R\), with center of mass at \(C\) which is distance \(a\) from the center of the hoop \(O\). The external torque is provided by the downward acceleration due to gravity \(g>0\). The hoop rolls without slipping along the floor with point of contact \(P\). The aim of this problem is to obtain the equations of motion for \(\theta(t)\).
Compute the moments of inertia \(I_{O}\), \(I_{C}\), and \(I_{P}(\theta)\) and relate these to each other using the parallel axis theorem. Express your answer in terms of \(m\), \(R\), \(a\), and \(\theta\). (For this problem, show that \(a=2R/\pi\), but express everything in terms of \(a\). This allows you to generalize to symmetric but unequal mass distributions.)
Solve for the equations of motion using the Lagrangian framework about the two points where the rotational and transitional motions can be decoupled. Show that this gives the same equations of motion, with the parallel axis theorem adjusting the moments of inertia exactly as needed to correct the equations.
Solve the equations of motion using Newton’s law about the center-of-mass \(C\):
\[\begin{gather*} \diff{\vect{L}}{t} = \vect{\tau}. \end{gather*}\]Draw all forces and calculate the torque \(\vect{\tau}\) in terms of these.
-
Try solving the equations of motion using Newton’s law about the instantaneously stationary point \(P\). You should find that a simple application of Newton’s law does not give the correct answer. Instead, you will need to correct Newton’s law to include a “phantom torque” [Turner and Turner, 2010].
Show that these corrections arise from the \(\theta\) dependence of \(I_{P}(\theta)\). For this reason, one can use \(P\) for the analysis if \(I_{P}\) is independent of \(\theta\) as it is for a complete hoop, balls, cylinders etc.
Nutation#
Using the parametrization of the Euler angles in Landau and Lifshitz Volume 1, describe
nutation in the small amplitude limit (i.e. treat this as an application of the
normal-mode theory discussed in class.) Clearly state all steps in formulating the
problem, i.e. deriving the equations (use the Lagrangian approach, and conserved
quantities to obtain an effective 1D theory with an appropriate effective potential),
find the “stationary” solution - this corresponds to simple precession. Check this
by considering the Newton’s law in the form of the time-evolution of the angular
momentum \(\dot{\vec{L}} = \vec{\Omega}\times\vec{L} = \vec{\tau}\). Then, describe the
deviations from the stationary solution to derive the normal modes. Try to identify all
of the modes shown in Fig. 49, and check your answer numerically using the analytic
solution (7). (References are version available on
Perusall.)
Let me know if you need any help setting up the numerical checks. I recommend using the
scipy.integration.quad
routine.