Exercise 1.24: Constraint forces

This is a special case of a solution we found in exercise 1.22. In that exercise, we found the constraint forces on a driven pendulum. By setting inline_formula not implemented, we can read off the constraint forces for the undriven pendulum.

(require '[sicmutils.env :refer :all])

Take some definitions that we need:

(defn U-constraint [q0 q1 F l]
  (* (/ F (* 2 l))
     (- (square (- q1 q0))
        (square l))))
(defn extract-particle [pieces]
  (fn [[t q v] i]
    (let [indices (take pieces
                        (iterate
                         inc (* i pieces)))
          extract (fn [tuple]
                    (mapv (fn [i]
                            (ref tuple i))
                          indices))]
      (up t (extract q) (extract v)))))
(defn KE-particle [m v]
  (* (/ 1 2) m (square v)))
(defn L-driven-free [m l y U]
  (fn [local]
    (let [extract (extract-particle 2)
          [_ q qdot] (extract local 0)
          F (ref (coordinate local) 2)]
      (- (KE-particle m qdot)
         (U q)
         (U-constraint (up 0 (y (state->t local)))
                       q
                       F
                       l)))))
(defn U-gravity [g m]
  (fn [[_ y]]
    (* m g y)))
(defn driven-polar->rect [y]
  (fn [[t [theta c F]]]
    (up (* c (sin theta))
        (- (y t) (* c (cos theta)))
        F)))
(defn L-driven-pend [m l y U]
  (compose (L-driven-free m l y U)
           (F->C (driven-polar->rect y))))

The second equation of motion, for the inline_formula not implemented coordinate, gives us an equation in terms of tension. Substitute in a constant pendulum support position by defining the support position function to be (lambda (t) 'l):

(let [q (up (literal-function 'theta)
            (fn [_] 'l)
            (literal-function 'F))
      y (fn [_] 'l)
      L (L-driven-pend 'm 'l y (U-gravity 'g 'm))
      f ((Lagrange-equations L) q)]
  (ref (f 't) 1))

Solve for inline_formula not implemented, the tension on the pendulum linkage:

formula not implemented
Runtimes (1)