(*Simulation of motion of Kharitonov rectangle by Nasser M. Abbasi version Nov 28,2014*) Manipulate[ tick; Module[{p}, If[z == 1, state = "STOP"; store = {}; np = 0 , p = Graphics[ {EdgeForm[{Red, Thin}], White, Rectangle[{Re[k1 /. w -> z], Im[k3 /. w -> z]}, {Re[k2 /. w -> z], Im[k4 /. w -> z]}]}, Axes -> True, Frame -> True, PlotRange -> {{xMin, xMax}, {yMin, yMax}}, AspectRatio -> 1, ImagePadding -> All ]; If[buffer, np++; AppendTo[store, p]; r = Show[store[[1 ;; np]], ImageSize -> 400, PlotRange -> {{xMin, xMax}, {yMin, yMax}}] , r = Show[p, ImageSize -> 400, PlotRange -> {{xMin, xMax}, {yMin, yMax}}] ]; Which[state == "RUN" || state == "STEP", z = z + delW; If[state == "RUN", tick = Not[tick]] ] ]; Grid[{ {Row[{"sweep frequency \[Omega] = ", padIt2[z, {3, 2}]}]}, {currentPoly}, {r}}, Spacings -> {.1, .5}] ], Text@Grid[{ { Grid[{ {Button[Text@Style["run", 12], {state = "RUN", If[z == 1, store = {}; np = 0; z = 0]; tick = Not[tick]}, ImageSize -> {60, 40}], Button[Text@Style["step", 12], {state = "STEP"; If[z == 1, store = {}; np = 0; z = 0]; tick = Not[tick]}, ImageSize -> {60, 40}], Button[Text@Style["stop", 12], {state = "STOP"; tick = Not[tick]}, ImageSize -> {60, 40}], Button[Text@Style["reset", 12], {state = "RESET"; store = {}; np = 0; z = 0; tick = Not[tick]}, ImageSize -> {60, 40}]} }, Spacings -> {.5, 0}, Frame -> True, FrameStyle -> Gray ] }, { Grid[ { {Style["select interval polynomial", 12], PopupMenu[Dynamic[poly, {poly = #; Which[poly == "p1", {k1, k2, k3, k4} = {0.25 + 0.75*I*w - 3.25*w^2 - 1.25*I*w^3, 1.25 + 1.25*I*w - 2.75*w^2 - 0.25*I*w^3, 1.25 + 0.75*I*w - 2.75*w^2 - 1.25*I*w^3, 0.25 + 1.25*I*w - 3.25*w^2 - 0.25*I*w^3}; delW = 1./100; currentPoly = Style["[0.25,1.25]\!\(\*SuperscriptBox[\(s\), \(3\)]\)+[2.75,3.25]\!\(\*SuperscriptBox[\(s\), \ \(2\)]\)+[0.75,1.25]s+[0.25,1.25]", 12]; xMax = 1.5; xMin = -3; yMin = -0.6; yMax = 1; store = {}; np = 0; z = 0 , poly == "p3", {k1, k2, k3, k4} = {11 + 9*I*w - 8*w^2 - 6*I*w^3 + 3*w^4 + I*w^5, 12 + 10*I*w - 7*w^2 - 5*I*w^3 + 4*w^4 + 2*I*w^5, 12 + 9*I*w - 7*w^2 - 6*I*w^3 + 4*w^4 + I*w^5, 11 + 10*I*w - 8*w^2 - 5*I*w^3 + 3*w^4 + 2*I*w^5}; currentPoly = Style["[1,2]\!\(\*SuperscriptBox[\(s\), \(5\)]\)+[3,4]\!\(\*SuperscriptBox[\(s\), \(4\)]\)+[5,6]\!\(\*SuperscriptBox[\ \(s\), \(3\)]\)+[7,8]\!\(\*SuperscriptBox[\(s\), \(2\)]\)+[9,10]s+[11,12]", 12]; delW = 1./100; xMin = 6; xMax = 12.5; yMin = 0; yMax = 7; store = {}; np = 0; z = 0 , poly == "p2", {k1, k2, k3, k4} = {0.45 + 1.95*I*w - 3.05*w^2 - 6.05*I*w^3 + 3.95*w^4 + 3.95*I*w^5 - w^6, 0.55 + 2.05*I*w - 2.95*w^2 - 5.95*I*w^3 + 4.05*w^4 + 4.05*I*w^5 - w^6, 0.55 + 1.95*I*w - 2.95*w^2 - 6.05*I*w^3 + 4.05*w^4 + 3.95*I*w^5 - w^6, 0.45 + 2.05*I*w - 3.05*w^2 - 5.95*I*w^3 + 3.95*w^4 + 4.05*I*w^5 - w^6}; delW = 1./100; currentPoly = Style["[0.45,0.55]+[1.95,2.05]s+[2.95,3.05]\!\(\*SuperscriptBox[\(s\), \ \(2\)]\)+[5.95,6.05]\!\(\*SuperscriptBox[\(s\), \(3\)]\)+[3.95,4.05]\!\(\*SuperscriptBox[\(s\), \ \(4\)]\)+[3.95,4.05]\!\(\*SuperscriptBox[\(s\), \(5\)]\)+\!\(\*SuperscriptBox[\(s\), \(6\)]\)", 12]; xMin = -0.3; xMax = 0.6; yMin = -0.4; yMax = 0.55; store = {}; np = 0; z = 0 ], tick = Not[tick] } &], {"p1" -> Style["Example 5.7.4", 12], "p2" -> Style["Example 5.10.1", 12], "p3" -> Style["Example 5.5.2", 12] }, ImageSize -> All], "" }, { Style["buffer rectangles", 12], Checkbox[Dynamic[buffer, {buffer = #; store = {}; np = 0; z = delW; tick = Not[tick]} &]], "" } }, Frame -> True] } }, Alignment -> Center, Frame -> None ], {{tick, True}, None}, {{store, {}}, None},(*buffer to save plots*) {{np, 0}, None},(*How many in store*) {{xMin, -3}, None}, {{xMax, 1.5}, None}, {{yMin, -0.6}, None}, {{yMax, 1}, None}, {{poly, "p1"}, None}, {{delW, 1./100}, None}, {{z, 0}, None}, {{buffer, True}, None}, {{state, "STOP"}, None}, {{r, 0}, None}, {{currentPoly, Style[ "[0.25,1.25]\!\(\*SuperscriptBox[\(s\), \(3\)]\)+[2.75,3.25]\!\(\*SuperscriptBox[\(s\), \(2\)]\)+[0.75,1.25]s+[0.25,1.25]", 12]}, None}, TrackedSymbols :> {tick}, Initialization :> ( {k1, k2, k3, k4} = {0.25 + (0. + 0.75*I)*w - 3.25*w^2 - (0. + 1.25*I)*w^3, 1.25 + 1.25*I*w - 2.75*w^2 - 0.25*I*w^3, 1.25 + 0.75*I*w - 2.75*w^2 - 1.25*I*w^3, 0.25 + 1.25*I*w - 3.25*w^2 - 0.25*I*w^3}; 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]; (*--------------------------------------------*) ) ]