(*
Rigid Body Pendulum on a Flywheel
by Nasser M. Abbasi, version June 8, 2011*)
Manipulate[
Quiet[process[L, m, massOfFlyWheel, \[Theta]0, \[Phi]0, der\[Theta]0,
der\[Phi]0, viewPoint, currentTime], InterpolatingFunction::dmval],
{{L, 7.5, "rod length (m)"}, 2, 7.5, .1, Appearance -> "Labeled",
ImageSize -> Tiny},
{{m, 3.5, "mass of rod (kg)"}, 1, 100, .1, Appearance -> "Labeled",
ImageSize -> Tiny},
{{massOfFlyWheel, 3.5, "mass of flywheel (kg)"}, 1, 500, .1,
Appearance -> "Labeled", ImageSize -> Tiny},
Delimiter,
{{\[Theta]0, 45, "\[Theta](0) (deg)"}, -90, 90, 1,
Appearance -> "Labeled", ImageSize -> Tiny},
{{\[Phi]0, 90, "\[Phi](0) (deg)"}, 0, 360, 1,
Appearance -> "Labeled", ImageSize -> Tiny},
{{der\[Theta]0, 24, "\[Theta]'(0) (deg/sec)"}, 0, 90, 1,
Appearance -> "Labeled", ImageSize -> Tiny},
{{der\[Phi]0, 50, "\[Phi]'(0) (deg/sec)"}, 0, 90, 1,
Appearance -> "Labeled", ImageSize -> Tiny},
{{animRate, 1, "animate rate"}, .1, 2, .1, Appearance -> "Labeled",
ImageSize -> Tiny},
Delimiter,
{{currentTime, 0, "start simulation"}, 0, 100, .001,
ControlType -> Trigger, AnimationRate -> Dynamic[animRate],
ImageSize -> Tiny},
Delimiter,
{{viewPoint, {Pi, Pi/2, 2},
"select viewpoint"}, {{1.3, -2.4, 2} -> 1, {1, -2, 1} ->
2, {0, -2, 2} -> 3, {0, -2, -2} -> 4, {-2, -2, 0} ->
5, {2, -2, 0} -> 6, {Pi, Pi/2, 2} -> 7}, ControlType -> SetterBar,
ImageSize -> Small},
SynchronousUpdating -> True,
SynchronousInitialization -> True,
AutorunSequencing -> {9},
Initialization :>
(
g = 9.8;
h1 = .4;
r1 = 6*h1;
h0 = 3*h1; r0 = r1/3;
h2 = 4*h1;
r2 = h2/2;
r3 = r2/4;
process[L_, m_, massOfFlyWheel_, \[Theta]0_, \[Phi]0_,
der\[Theta]0_, der\[Phi]0_, viewPoint_, currentTime_] :=
Module[{eq1, eq2, Id, sol, sol\[Theta],
sol\[Phi], \[Theta], \[Phi], t, lines, i, title},
Id = massOfFlyWheel*r1^2/2;
(*The equations of motions of for the 2 generalized coordinates \
have beeen*)
(*derived using Lagrangian energy method and will now be \
numerically solved*)
eq1 =
Id \[Phi]''[
t] + (1/3 m L^2) (\[Phi]''[t] Sin[\[Theta][t]]^2 +
2 \[Phi]'[t] Sin[\[Theta][t]] Cos[\[Theta][t]] \[Theta]'[t]);
eq2 =
1/3 m L^2 \[Theta]''[t] -
1/3 m L^2 \[Phi]'[t]^2 Sin[\[Theta][t]] Cos[\[Theta][t]] +
m g L/2 Sin[\[Theta][t]];
sol =
First@Quiet@
NDSolve[{eq1 == 0,
eq2 == 0, \[Theta][0] == \[Theta]0 Degree, \[Theta]'[0] ==
der\[Theta]0 Degree, \[Phi][0] == \[Phi]0 Degree, \[Phi]'[
0] == der\[Phi]0 Degree}, {\[Theta], \[Phi]}, {t, 0, 100}];
sol\[Theta] = \[Theta] /. sol;
sol\[Phi] = \[Phi] /. sol;
With[{current\[Theta] = sol\[Theta][currentTime],
current\[Phi] = sol\[Phi][currentTime]},
(*make few lines to draw around the pendulum rod in order to \
make it *)
(*more clear that it is spining on its axes*)
lines = Table[Line[{
{r3 Cos[current\[Phi] + i*2 Pi/5],
r3 Sin[current\[Phi] + i*2 Pi/5] , -(h1/2 + h2 - r2/2) +
r3 Sin[current\[Theta]] Cos[current\[Phi] + i*2 Pi/5] },
{r3 Cos[current\[Phi] + i*2 Pi/5] + L Sin[current\[Theta]],
r3 Sin[current\[Phi] + i*2 Pi/5], - L Cos[
current\[Theta]] - (h1/2 + h2 - r2/2) +
r3 Sin[current\[Theta]] Cos[current\[Phi] + i*2 Pi/5] }
}], {i, 1, 5}];
title = Text@Style[Grid[{
{"time (sec)", "\[Theta] (deg)", "\[Phi] (deg)"},
{Row[{
Text@PaddedForm[currentTime, {4, 2},
NumberSigns -> {"-", ""}, NumberPadding -> {"0", "0"},
SignPadding -> True]
}],
Row[{
Text@PaddedForm[current\[Theta] 180./Pi , {5, 2},
NumberSigns -> {"-", "+"},
NumberPadding -> {"0", "0"}, SignPadding -> True]
}],
Row[{
Text@PaddedForm[Mod[current\[Phi] 180./Pi, 360], {5, 2},
NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"},
SignPadding -> True]
}]
}}, Frame -> All, Spacings -> 1, ItemSize -> 8]
, 12];
(*build the 3D graphics, one by one from top to bottom *)
Grid[{
{title},
{
Graphics3D[
{
Cylinder[{{0, 0, h1/2}, {0, 0, h1/2 + h0}}, r0],
Cylinder[{{0, 0, h1/2}, {0, 0, -h1/2}}, r1],
Cuboid[{-r2, -r2/2, -h2}, {r2, r2/2, 0}] ,
Cylinder[{{0, r2, -h2}, {0, -r2, -h2}}, r2] ,
{ EdgeForm[{Thick, Blue}], FaceForm[{Pink, Opacity[1]}],
Cylinder[{{0,
0, -(h1/2 + h2 - r2/2)}, {L Sin[current\[Theta]],
0, -(h1/2 + h2 - r2/2 + L Cos[current\[Theta]])}},
r3] },
(*line around cylinder*)
{Thickness[.005], Blue, lines},
{Thickness[.02], Red,
Line[{{0, 0, h1/2}, {r1 Cos[current\[Phi]],
r1 Sin[current\[Phi]], h1/2}}]},
{Thickness[.02], Red,
Line[{{r1 Cos[current\[Phi]], r1 Sin[current\[Phi]],
h1/2}, {r1 Cos[current\[Phi]],
r1 Sin[current\[Phi]], -h1/2}}]}
},
PlotRange -> {{-5, 5}, {-3, 3}, {-8, 1}},
ImageSize -> {330, 330}, Axes -> False, Boxed -> False,
AxesOrigin -> {0, 0, 0}, ImageMargins -> 2,
ImagePadding -> 2, PlotRangePadding -> 1,
ViewPoint -> viewPoint, ViewCenter -> {0, 0, 0}
]}
}, Alignment -> Center, Spacings -> 0,
Frame -> {False, -1 -> True}]
]
]
)
]