(*By Nasser M. Abbasi. Show constant angular velocity and \ acceleration motion 1/4/2014*) Manipulate[ tick; Module[{x, y, linearAcc, maxOmega = 3 + 0.1*maxSimulationTime, maxR = 1, maxAlpha = 0.1, at, an, v, normaAcc, tanAcc, debug = False}, If[debug, Print["calling makeStep ", state]]; If[debug, Print["stat is ", state]]; If[debug, Print["BEFORE, currentTime= ", currentTime, "\ncurrentTheta= ", currentTheta, "\ncurrentOmega= ", currentOmega, "\nalpha= ", alpha, "\ndelT= ", delT, "\nr= ", r, "\nmaxOmega= ", maxOmega, "\nmaxR= ", maxR, "\nmaxAlpha= ", maxAlpha]]; {currentSpeed, currentTheta, currentOmega, linearAcc, normaAcc, tanAcc, at, an, v, x, y} = makeStep[currentTheta, currentOmega, alpha, delT, r, maxOmega, maxR, maxAlpha]; currentTime += delT; If[debug, Print["\n\nAFTER, currentTime= ", currentTime, "\ncurrentTheta= ", currentTheta, "\ncurrentOmega= ", currentOmega, "\nalpha= ", alpha, "\ndelT= ", delT, "\nr= ", r, "\nmaxOmega= ", maxOmega, "\nmaxR= ", maxR, "\nmaxAlpha= ", maxAlpha, "\nat= ", at, "\nan= ", an, "\nx= ", x, "\ny= ", y, "\nv= ", v]]; g = Grid[{ { Grid[{ {"current time", padIt2[currentTime, {4, 2}] , "sec"}, {"normal acceleration", padIt2[Norm@normaAcc, {4, 3}] , "rad/\!\(\*SuperscriptBox[\(sec\), \(2\)]\)"}, {"tangential acceleration", padIt2[Norm@tanAcc, {3, 2}] , "rad/\!\(\*SuperscriptBox[\(sec\), \(2\)]\)"}, {"linear acceleration ", padIt2[linearAcc, {3, 2}], "m/\!\(\*SuperscriptBox[\(sec\), \(2\)]\)"}, {"linear velocity ", padIt2[currentSpeed, {4, 3}], "m/sec"}, {"angular velocity ", padIt2[currentOmega, {4, 3}], "rad/sec"}, {"\[Theta] ", padIt2[currentTheta*180/Pi, {4, 1}], "degree"} }, Alignment -> Left ] }, {Graphics[ { {RGBColor[{.9, .9, .9}], Disk[{0, 0}, r]}, {Red, Disk[{x, y}, 0.08*r]}, Disk[{0, 0}, 0.05*r], If[showVelocity , {Arrowheads -> Small, Arrow[v]}], If[showAcc, {{Thick, Red, Arrowheads -> Small, Arrow[an]}, {Thick, Red, Arrowheads -> Small, Arrow[at]} } ], (*Text[v,{1.2x,1.2y},{0,0}]*) (*{Thin,Dashed,Line[{{0,0},{x,y}}]},*) {Dashed, Arrow[{{0, 0}, {1.1, 0}}]}, {Dashed, Arrow[{{0, 0}, {0, 1.1}}]}, Text["x", {1.15, 0}, {0, 0}], Text["y", {0, 1.15}, {0, 0}] }, PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}}, ImagePadding -> 5, ImageSize -> 300, AspectRatio -> 1 ] } }, Spacings -> {.5, .1}, Frame -> True, Alignment -> Center ]; Which[ state == "running" || state == "step", ( If[currentTime <= maxSimulationTime, If[state == "running", tick = Not[tick] ], currentTheta = -omega*delT; currentOmega = omega; currentTime = -delT ] ) , state == "reset", ( currentTheta = -omega*delT; currentOmega = omega; currentTime = -delT; state = "step"; tick = Not[tick] ) ]; g ], Grid[{ {Grid[{ { Button[Text[Style["run", 12]], state = "running"; tick = Not[tick], ImageSize -> {80, 35}], Button[Text[Style["step", 12]], state = "step"; tick = Not[tick], ImageSize -> {80, 35}], Button[Text[Style["reset", 12]], state = "reset"; tick = Not[tick], ImageSize -> {80, 35}] } }] }, { Grid[{ { "maximum simulation time", Manipulator[Dynamic[maxSimulationTime, {maxSimulationTime = #; state = "reset"; tick = Not[tick]} &], {0.1, 10, 0.01}, ImageSize -> Tiny, ContinuousAction -> True], Row[{Dynamic@padIt2[maxSimulationTime, {3, 1}], Spacer[2], "sec"}], SpanFromLeft }, { "angular acceleration \[Alpha]", Manipulator[Dynamic[alpha, {alpha = #} &], {-0.1, 0.1, 0.01}, ImageSize -> Tiny, ContinuousAction -> True], Row[{Dynamic@padIt1[alpha, {3, 2}], Spacer[2], "rad/sec"}], SpanFromLeft }, { "initial angular velocity \[Omega]", Manipulator[Dynamic[omega, {omega = #; currentOmega = omega; tick = Not[tick]} &], {-3, 3, 0.1}, ImageSize -> Tiny, ContinuousAction -> True], Row[{Dynamic@padIt1[omega, {3, 1}], Spacer[2], "rad/sec"}], SpanFromLeft }, { "r", Manipulator[Dynamic[r, {r = #; tick = Not[tick]} &], {0.1, 1, 0.1}, ImageSize -> Tiny, ContinuousAction -> True], Dynamic@Row[{padIt2[r, {3, 2}], Spacer[2], "meter"}], SpanFromLeft } } ] }, { Grid[{ {"show acceleration ", Checkbox[Dynamic[showAcc, {showAcc = #; tick = Not[tick]} &]]}, {"show velocity ", Checkbox[Dynamic[showVelocity, {showVelocity = #; tick = Not[tick]} &]]} }] } } ] , {{tick, True}, None}, {{state, "step"}, None}, {{omega, 1.5}, None}, {{currentOmega, 1.5}, None}, {{currentTheta, 0}, None}, {{currentSpeed, 0}, None}, {{maxSimulationTime, 1}, None}, {{alpha, 0}, None}, {{r, .8}, None}, {{currentTime, 0}, None}, {{delT, 0.01}, None}, {{g, 0}, None}, {{showAcc, False}, None}, {{showVelocity, True}, None}, SynchronousUpdating -> True, ControlPlacement -> Left, TrackedSymbols :> {tick}, Initialization :> ( (*definitions used for parameter checking*) integerStrictPositive = (IntegerQ[#] && # > 0 &); integerPositive = (IntegerQ[#] && # >= 0 &); numericStrictPositive = (Element[#, Reals] && # > 0 &); numericPositive = (Element[#, Reals] && # >= 0 &); numericStrictNegative = (Element[#, Reals] && # < 0 &); numericNegative = (Element[#, Reals] && # <= 0 &); bool = (Element[#, Booleans] &); numeric = (Element[#, Reals] &); integer = (Element[#, Integers] &); (*--------------------------------------------*) padIt1[v_?numeric, f_List] := AccountingForm[v, f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True]; (*--------------------------------------------*) padIt1[v_?numeric, f_Integer] := AccountingForm[Chop[v], f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True]; (*--------------------------------------------*) padIt2[v_?numeric, f_List] := AccountingForm[v, f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True]; (*--------------------------------------------*) padIt2[v_?numeric, f_Integer] := AccountingForm[Chop[v], f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True]; (*--------------------------------------------*) makeStep[currentAngle_, currentOmega_, alpha_, delT_, r_, maxOmega_, maxR_, maxAlpha_] := Module[{$currentAngle = currentAngle, $currentSpeed, $currentOmega = currentOmega, x, y, v0, v, v0Normalized, normaAcc, normaAccNormalized, an, tanAcc, tanAccNormalized, at, linearAcc, debug = False}, x = r Cos[$currentAngle]; y = r Sin[$currentAngle]; $currentSpeed = {-$currentOmega y, $currentOmega x}; v0Normalized = {-$currentOmega y, $currentOmega x}/(maxOmega maxR); v = {{x, y}, {x, y} + v0Normalized}; normaAcc = {-$currentOmega^2 x, -$currentOmega^2 y}; normaAccNormalized = normaAcc/(maxOmega^2 maxR); If[debug, Print["normaAcc=", normaAcc, "\nnormaAccNormalized=", normaAccNormalized, "\n(maxOmega^2 maxR)=", (maxOmega^2 maxR), "\nNorm[normaAcc]= ", Norm[normaAcc]]]; an = {{x, y}, {x, y} + normaAccNormalized}; tanAcc = {-alpha y, alpha x}; tanAccNormalized = tanAcc/(maxAlpha maxR); at = {{x, y}, {x, y} + tanAccNormalized}; linearAcc = Norm[at + an]; $currentAngle += $currentOmega*delT + 1/2 alpha*delT^2; $currentOmega += alpha*delT; {Norm@$currentSpeed, Mod[$currentAngle, 2 Pi], $currentOmega, linearAcc, normaAcc, tanAcc, at, an, v, x, y} ] ) ]