# Radio Bar in Manipulate leading to changes in Axis and Eigenvalue system (Localised Linear System of Lorenz Equations)

Just wondering how to control the variable X using a radio button (bar) in Manipulate because it appears to not be working. If anyone could help, that would be great!

Manipulate[
{evals, evecs} = Eigensystem[( {
{-\[Sigma], \[Sigma], 0},
{r - X[[3]], -1, -X[[1]]},
{X[[2]], X[[1]], -\[Beta]}
} )];
GraphicsColumn[{Show[VectorPlot3D[( {
{-\[Sigma], \[Sigma], 0},
{r - X[[3]], -1, -X[[1]]},
{X[[2]], X[[1]], -\[Beta]}
} ).{x, y, z}, {x, X[[1]] - 2, X[[1]] + 2}, {y, X[[2]] - 2,
X[[2]] + 2}, {z, X[[3]] - 2, X[[3]] + 2}, Axes -> True,
PerformanceGoal -> "Quality", AxesLabel -> {"x", "y", "z"},
Ticks -> None],
If[evecs == Re[evecs],
ParametricPlot3D[Evaluate[t evecs], {t, -3, 3},
PlotStyle -> {{Thick, RGBColor[0.5, 0.21, 0.36]}}], {}],
PlotRange -> 1, ImageSize -> {275, 275}]}],
{x},
{y},
{z}
} )' == Dynamic[( {
{-\[Sigma], \[Sigma], 0},
{r - X[[3]], -1, -X[r, \[Beta]][[1]]},
{X[r, \[Beta]][[2]], X[r, \[Beta]][[1]], -\[Beta]}
} )] ( {
{x},
{y},
{z}
} )]], Medium]]}], Delimiter,
{{r, 1, Style["r", Medium]}, 0, 20, .1, Appearance -> "Labeled"},
{{\[Beta], 8/3, Style["\[Beta]", Medium]}, 0, 20, .01,
Appearance -> "Labeled"},
{{\[Sigma], 10, Style["\[Sigma]", Medium]}, 0, 50, 5,
Appearance -> "Labeled"},
DynamicModule[{X},
X, { {0, 0, 0} -> "\!$$\*SubscriptBox[\(C$$, $$0$$]\)",
Dynamic[{Sqrt[\[Beta]*(r - 1)], Sqrt[\[Beta]*(r - 1)], r - 1}] ->
"\!$$\*SubscriptBox[\(C$$, $$+$$]\)",
Dynamic[{-Sqrt[\[Beta]*(r - 1)], -Sqrt[\[Beta]*(r - 1)],
r - 1}] -> "\!$$\*SubscriptBox[\(C$$, $$-$$]\)"}]],
{evecs, 0, 1, ControlType -> None},
{evals, 0, 1, ControlType -> None},
Dynamic[Graphics[{PointSize[.04], RGBColor[0.5, 0.21, 0.36],
Point[{Re[#], Im[#]}] & /@ evals},
PlotRange -> {{-3 - Max[Abs[evals]],
3 + Max[Abs[evals]]}, {-3 - Max[Abs[evals]],
3 + Max[Abs[evals]]}}, Axes -> True,
AxesLabel -> {"Re(Z)", "Im(Z)"}, Ticks -> None, ImagePadding -> 33,
ImageSize -> 250, PlotLabel -> "Eigenvalues"]],
ControlPlacement -> Left, AutorunSequencing -> {1, 2, 3, 4}]

I want to be able to select between the three X values and have the axis of the VectorPlot3D and the {evals, evecs} adjust as X varies.

Get rid of the DynamicModule and use the following:

{{X, {0, 0, 0}}, 0, 1, ControlType -> None},
{{X0, 1, "X"},
Dynamic[X0, (X0 = #;
X = {{0, 0, 0},
{Sqrt[β*(r - 1)], Sqrt[β*(r - 1)], r - 1},
{-Sqrt[β*(r - 1)], -Sqrt[β*(r - 1)], r - 1}} ~Part~ X0) &],
{1 -> "\!$$\*SubscriptBox[\(C$$, $$0$$]\)",
2 -> "\!$$\*SubscriptBox[\(C$$, $$+$$]\)",
3 -> "\!$$\*SubscriptBox[\(C$$, $$-$$]\)"}] &}

I think it needs to be indirect (i.e. X0 is an index), because the data values for the rules in your construction, such as

{Sqrt[β*(r - 1)], Sqrt[β*(r - 1)], r - 1}

depend on dynamic variables. When you move their sliders, the value of X will no longer match the value for the button.

Maybe this is close to what you're after overall:

Manipulate[
Show[
VectorPlot3D[
({{-σ, σ, 0}, {r - X[[3]], -1, -X[[1]]}, {X[[2]], X[[1]], -β}}).{x, y, z},
{x, X[[1]] - 2, X[[1]] + 2}, {y, X[[2]] - 2, X[[2]] + 2}, {z, X[[3]] - 2, X[[3]] + 2},
Axes -> True,(*PerformanceGoal\[Rule]"Quality",*)
AxesLabel -> {"x", "y", "z"}, Ticks -> None],
If[evecs == Re[evecs],
ParametricPlot3D[Evaluate[t evecs], {t, -3, 3},
PlotStyle -> {{Thick, RGBColor[0.5, 0.21, 0.36]}},
PlotPoints -> 2], {}],
PlotRange -> 1, ImageSize -> {275, 275}],

Row[{Spacer[60],
Dynamic[Style[
HoldForm[({{x}, {y}, {z}})' ==
Dynamic[({{-σ, σ, 0}, {r - X[[3]], -1, -X(*[r,β]*)[[1]]}, {X(*[r,β]*)[[2]],
X(*[r,β]*)[[1]], -β}})] ({{x}, {y}, {z}})]],
Medium]]}],
Delimiter,
{{r, 1, Style["r", Medium]}, 0, 20, .1, Appearance -> "Labeled",
TrackingFunction -> ((r = #; updateFN[]) &)},
{{β, 8/3, Style["β", Medium]}, 0, 20, .01,
Appearance -> "Labeled",
TrackingFunction -> ((β = #; updateFN[]) &)},
{{σ, 10, Style["σ", Medium]}, 0, 50, 5,
Appearance -> "Labeled",
TrackingFunction -> ((σ = #; updateFN[]) &)},

{{X, {0, 0, 0}}, 0, 1, ControlType -> None},
{{X0, 1, "X"},
{1 -> "\!$$\*SubscriptBox[\(C$$, $$0$$]\)",
2 -> "\!$$\*SubscriptBox[\(C$$, $$+$$]\)",
3 -> "\!$$\*SubscriptBox[\(C$$, $$-$$]\)"},
RadioButtonBar, TrackingFunction -> ((X0 = #; updateFN[]) &)},

{evecs, ControlType -> None}, {evals,
ControlType -> None}, {{updateFN, updateFN}, ControlType -> None},
Dynamic@Graphics[{PointSize[.04], RGBColor[0.5, 0.21, 0.36],
Point[Dynamic@ReIm@evals]},
PlotRange ->
Dynamic@{{-3 - Max[Abs[evals]],
3 + Max[Abs[evals]]}, {-3 - Max[Abs[evals]],
3 + Max[Abs[evals]]}}, Axes -> True,
AxesLabel -> {"Re(Z)", "Im(Z)"}, Ticks -> None, ImagePadding -> 33,
ImageSize -> 250, PlotLabel -> "Eigenvalues"],
ControlPlacement -> Left, AutorunSequencing -> {1, 2, 3, 5},
Initialization :> (
updateFN[] := (
X = {{0, 0, 0}, {Sqrt[β*(r - 1)], Sqrt[β*(r - 1)], r - 1},
{-Sqrt[β*(r - 1)], -Sqrt[β*(r - 1)], r - 1}} ~Part~ X0;
{evals, evecs} =
Eigensystem[({{-σ, σ, 0}, {r - X[[3]], -1, -X[[1]]}, {X[[2]], X[[1]], -β}})];
);
updateFN[]
)]
• I want X[[1]], X[[2]] and X[[3]] in the rest of the code to reflect the choice made in the radio buttons. The above for example, does not give me what I want as for $X=C_0$, where $X[[i]]\neq0,~\forall i\in\{1,2,3\}$ Jan 8, 2018 at 23:10
• Ok the edited one looks better, but it doesn't adjust the {x, X[[1]] - 2, X[[1]] + 2}, {y, X[[2]] - 2, X[[2]] + 2}, {z, X[[3]] - 2, X[[3]] + 2} in VectorPlot3D Jan 8, 2018 at 23:32
• @Jelmes Again, I'm not sure what's supposed to happen. The plot limits change when X changes for me. How are they supposed to be adjusted? Or why do you say it doesn't adjust them? Or how do you know it doesn't? I'm not sure what I'm supposed to look at. Jan 8, 2018 at 23:57
• Set Ticks->Automatic and you'll see the values doesn't change. The VectorPlot3D should centralise around X but doesn't. Jan 9, 2018 at 0:08
• @Jelmes That's because you override the VectorPlot3D range by setting PlotRange -> 1 in Show. Jan 9, 2018 at 0:21

First you could replace

DynamicModule[{X},...]

to

{{X, {0, 0, 0},
""}, {{0, 0, 0} ->
"\!$$\*SubscriptBox[\(C$$, $$0$$]\)", {Sqrt[\[Beta]*(r - 1)],
Sqrt[\[Beta]*(r - 1)], r - 1} ->
"\!$$\*SubscriptBox[\(C$$, $$+$$]\)", {-Sqrt[\[Beta]*(r -
1)], -Sqrt[\[Beta]*(r - 1)], r - 1} ->
"\!$$\*SubscriptBox[\(C$$, $$-$$]\)"}, ControlType -> RadioButton}