Making an interactive visualization of the eigenvectors of two-dimensional matrices

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
2
down vote

favorite












I've recently stumbled upon this very nice interactive visualization of eigenvectors of two-dimensional matrices, and how powers $A^k$ act on various vectors.



How can this sort of visualization be realized with Mathematica, leveraging its dynamical capabilities?










share|improve this question



























    up vote
    2
    down vote

    favorite












    I've recently stumbled upon this very nice interactive visualization of eigenvectors of two-dimensional matrices, and how powers $A^k$ act on various vectors.



    How can this sort of visualization be realized with Mathematica, leveraging its dynamical capabilities?










    share|improve this question

























      up vote
      2
      down vote

      favorite









      up vote
      2
      down vote

      favorite











      I've recently stumbled upon this very nice interactive visualization of eigenvectors of two-dimensional matrices, and how powers $A^k$ act on various vectors.



      How can this sort of visualization be realized with Mathematica, leveraging its dynamical capabilities?










      share|improve this question















      I've recently stumbled upon this very nice interactive visualization of eigenvectors of two-dimensional matrices, and how powers $A^k$ act on various vectors.



      How can this sort of visualization be realized with Mathematica, leveraging its dynamical capabilities?







      graphics dynamic visualization eigenvalues eventhandler






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 1 hour ago

























      asked 1 hour ago









      glS

      4,73911140




      4,73911140




















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          4
          down vote













          The following is an attempt to recreate a similar sort of interactive visualization, showing the eigenvectors (when real), and how the various points of the unit circle are transformed by the matrix.



          The matrix can be chosen by moving its two column vectors using the mouse. I used EventHandler for this, instead of Locators, for greater customizability and a more natural look.



          Here is the full code:



          arrowRepresentationActionMatrix[matrix_] := 
          With[pts = MeshCoordinates@DiscretizeRegion@Region@Circle,
          With[finalPts = Dot[matrix, #] & /@ pts,
          Graphics[
          PointSize@0.012, Point@finalPts,
          Arrow /@ Thread@pts, finalPts
          ]
          ]];

          DynamicModule[v1 = 0.7, -0.6, v2 = 0.6, 0.6, v3 = 1, 1,
          movingPointIndex, matrix, frameSize = 1.5, numOfIterations = 30,
          Row[
          EventHandler[
          Dynamic[
          matrix = Transpose@v1, v2;
          Show[
          arrowRepresentationActionMatrix@matrix,
          Graphics[
          PointSize@0.02, Circle, Point@0, 0,
          Red,
          If[TrueQ[movingPointIndex == 1], PointSize@0.04,
          PointSize@0.03],
          Point@v1, Arrow@0, 0, v1,
          Green,
          If[TrueQ[movingPointIndex == 2], PointSize@0.04,
          PointSize@0.03],
          Point@v2, Arrow@0, 0, v2
          ,
          Dynamic@Blue, PointSize@0.03, Point@v3, Arrowheads@0.02,

          Arrow /@
          Partition[NestList[Dot[matrix, #] &, v3, numOfIterations],
          2, 1]
          ,

          Dynamic@With[eigs = Eigenvectors@N@matrix,

          If[MatchQ[eigs, __Real ..], Purple, Thickness@0.01,
          InfiniteLine@-#, # & /@ eigs, ]
          ]

          ],
          Frame -> True,
          PlotRange -> Dynamic[-#, #, -#, # &@frameSize],
          ImageSize -> 500
          ]
          ],
          "MouseDown" :> With[mp = MousePosition["Graphics"],
          movingPointIndex =
          Position[v1, v2, v3, First@Nearest[v1, v2, v3, mp]][[1, 1]]
          ],
          "MouseDragged" :> ReleaseHold[
          Hold[Set][Hold[v1, v2, v3][[movingPointIndex]],
          MousePosition["Graphics"]]
          ]
          ],
          Column@
          "PlotRange",
          VerticalSlider[Dynamic@frameSize, 1, 10, 0.01,
          Appearance -> "Labeled"]
          , " ",
          Column@
          "Number of iterations",
          VerticalSlider[Dynamic@numOfIterations, 1, 40, 1,
          Appearance -> "Labeled"]

          ]
          ]


          and this is the result:



          enter image description here






          share|improve this answer






















          • This is really cool
            – user6014
            1 hour ago










          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "387"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f185644%2fmaking-an-interactive-visualization-of-the-eigenvectors-of-two-dimensional-matri%23new-answer', 'question_page');

          );

          Post as a guest






























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          4
          down vote













          The following is an attempt to recreate a similar sort of interactive visualization, showing the eigenvectors (when real), and how the various points of the unit circle are transformed by the matrix.



          The matrix can be chosen by moving its two column vectors using the mouse. I used EventHandler for this, instead of Locators, for greater customizability and a more natural look.



          Here is the full code:



          arrowRepresentationActionMatrix[matrix_] := 
          With[pts = MeshCoordinates@DiscretizeRegion@Region@Circle,
          With[finalPts = Dot[matrix, #] & /@ pts,
          Graphics[
          PointSize@0.012, Point@finalPts,
          Arrow /@ Thread@pts, finalPts
          ]
          ]];

          DynamicModule[v1 = 0.7, -0.6, v2 = 0.6, 0.6, v3 = 1, 1,
          movingPointIndex, matrix, frameSize = 1.5, numOfIterations = 30,
          Row[
          EventHandler[
          Dynamic[
          matrix = Transpose@v1, v2;
          Show[
          arrowRepresentationActionMatrix@matrix,
          Graphics[
          PointSize@0.02, Circle, Point@0, 0,
          Red,
          If[TrueQ[movingPointIndex == 1], PointSize@0.04,
          PointSize@0.03],
          Point@v1, Arrow@0, 0, v1,
          Green,
          If[TrueQ[movingPointIndex == 2], PointSize@0.04,
          PointSize@0.03],
          Point@v2, Arrow@0, 0, v2
          ,
          Dynamic@Blue, PointSize@0.03, Point@v3, Arrowheads@0.02,

          Arrow /@
          Partition[NestList[Dot[matrix, #] &, v3, numOfIterations],
          2, 1]
          ,

          Dynamic@With[eigs = Eigenvectors@N@matrix,

          If[MatchQ[eigs, __Real ..], Purple, Thickness@0.01,
          InfiniteLine@-#, # & /@ eigs, ]
          ]

          ],
          Frame -> True,
          PlotRange -> Dynamic[-#, #, -#, # &@frameSize],
          ImageSize -> 500
          ]
          ],
          "MouseDown" :> With[mp = MousePosition["Graphics"],
          movingPointIndex =
          Position[v1, v2, v3, First@Nearest[v1, v2, v3, mp]][[1, 1]]
          ],
          "MouseDragged" :> ReleaseHold[
          Hold[Set][Hold[v1, v2, v3][[movingPointIndex]],
          MousePosition["Graphics"]]
          ]
          ],
          Column@
          "PlotRange",
          VerticalSlider[Dynamic@frameSize, 1, 10, 0.01,
          Appearance -> "Labeled"]
          , " ",
          Column@
          "Number of iterations",
          VerticalSlider[Dynamic@numOfIterations, 1, 40, 1,
          Appearance -> "Labeled"]

          ]
          ]


          and this is the result:



          enter image description here






          share|improve this answer






















          • This is really cool
            – user6014
            1 hour ago














          up vote
          4
          down vote













          The following is an attempt to recreate a similar sort of interactive visualization, showing the eigenvectors (when real), and how the various points of the unit circle are transformed by the matrix.



          The matrix can be chosen by moving its two column vectors using the mouse. I used EventHandler for this, instead of Locators, for greater customizability and a more natural look.



          Here is the full code:



          arrowRepresentationActionMatrix[matrix_] := 
          With[pts = MeshCoordinates@DiscretizeRegion@Region@Circle,
          With[finalPts = Dot[matrix, #] & /@ pts,
          Graphics[
          PointSize@0.012, Point@finalPts,
          Arrow /@ Thread@pts, finalPts
          ]
          ]];

          DynamicModule[v1 = 0.7, -0.6, v2 = 0.6, 0.6, v3 = 1, 1,
          movingPointIndex, matrix, frameSize = 1.5, numOfIterations = 30,
          Row[
          EventHandler[
          Dynamic[
          matrix = Transpose@v1, v2;
          Show[
          arrowRepresentationActionMatrix@matrix,
          Graphics[
          PointSize@0.02, Circle, Point@0, 0,
          Red,
          If[TrueQ[movingPointIndex == 1], PointSize@0.04,
          PointSize@0.03],
          Point@v1, Arrow@0, 0, v1,
          Green,
          If[TrueQ[movingPointIndex == 2], PointSize@0.04,
          PointSize@0.03],
          Point@v2, Arrow@0, 0, v2
          ,
          Dynamic@Blue, PointSize@0.03, Point@v3, Arrowheads@0.02,

          Arrow /@
          Partition[NestList[Dot[matrix, #] &, v3, numOfIterations],
          2, 1]
          ,

          Dynamic@With[eigs = Eigenvectors@N@matrix,

          If[MatchQ[eigs, __Real ..], Purple, Thickness@0.01,
          InfiniteLine@-#, # & /@ eigs, ]
          ]

          ],
          Frame -> True,
          PlotRange -> Dynamic[-#, #, -#, # &@frameSize],
          ImageSize -> 500
          ]
          ],
          "MouseDown" :> With[mp = MousePosition["Graphics"],
          movingPointIndex =
          Position[v1, v2, v3, First@Nearest[v1, v2, v3, mp]][[1, 1]]
          ],
          "MouseDragged" :> ReleaseHold[
          Hold[Set][Hold[v1, v2, v3][[movingPointIndex]],
          MousePosition["Graphics"]]
          ]
          ],
          Column@
          "PlotRange",
          VerticalSlider[Dynamic@frameSize, 1, 10, 0.01,
          Appearance -> "Labeled"]
          , " ",
          Column@
          "Number of iterations",
          VerticalSlider[Dynamic@numOfIterations, 1, 40, 1,
          Appearance -> "Labeled"]

          ]
          ]


          and this is the result:



          enter image description here






          share|improve this answer






















          • This is really cool
            – user6014
            1 hour ago












          up vote
          4
          down vote










          up vote
          4
          down vote









          The following is an attempt to recreate a similar sort of interactive visualization, showing the eigenvectors (when real), and how the various points of the unit circle are transformed by the matrix.



          The matrix can be chosen by moving its two column vectors using the mouse. I used EventHandler for this, instead of Locators, for greater customizability and a more natural look.



          Here is the full code:



          arrowRepresentationActionMatrix[matrix_] := 
          With[pts = MeshCoordinates@DiscretizeRegion@Region@Circle,
          With[finalPts = Dot[matrix, #] & /@ pts,
          Graphics[
          PointSize@0.012, Point@finalPts,
          Arrow /@ Thread@pts, finalPts
          ]
          ]];

          DynamicModule[v1 = 0.7, -0.6, v2 = 0.6, 0.6, v3 = 1, 1,
          movingPointIndex, matrix, frameSize = 1.5, numOfIterations = 30,
          Row[
          EventHandler[
          Dynamic[
          matrix = Transpose@v1, v2;
          Show[
          arrowRepresentationActionMatrix@matrix,
          Graphics[
          PointSize@0.02, Circle, Point@0, 0,
          Red,
          If[TrueQ[movingPointIndex == 1], PointSize@0.04,
          PointSize@0.03],
          Point@v1, Arrow@0, 0, v1,
          Green,
          If[TrueQ[movingPointIndex == 2], PointSize@0.04,
          PointSize@0.03],
          Point@v2, Arrow@0, 0, v2
          ,
          Dynamic@Blue, PointSize@0.03, Point@v3, Arrowheads@0.02,

          Arrow /@
          Partition[NestList[Dot[matrix, #] &, v3, numOfIterations],
          2, 1]
          ,

          Dynamic@With[eigs = Eigenvectors@N@matrix,

          If[MatchQ[eigs, __Real ..], Purple, Thickness@0.01,
          InfiniteLine@-#, # & /@ eigs, ]
          ]

          ],
          Frame -> True,
          PlotRange -> Dynamic[-#, #, -#, # &@frameSize],
          ImageSize -> 500
          ]
          ],
          "MouseDown" :> With[mp = MousePosition["Graphics"],
          movingPointIndex =
          Position[v1, v2, v3, First@Nearest[v1, v2, v3, mp]][[1, 1]]
          ],
          "MouseDragged" :> ReleaseHold[
          Hold[Set][Hold[v1, v2, v3][[movingPointIndex]],
          MousePosition["Graphics"]]
          ]
          ],
          Column@
          "PlotRange",
          VerticalSlider[Dynamic@frameSize, 1, 10, 0.01,
          Appearance -> "Labeled"]
          , " ",
          Column@
          "Number of iterations",
          VerticalSlider[Dynamic@numOfIterations, 1, 40, 1,
          Appearance -> "Labeled"]

          ]
          ]


          and this is the result:



          enter image description here






          share|improve this answer














          The following is an attempt to recreate a similar sort of interactive visualization, showing the eigenvectors (when real), and how the various points of the unit circle are transformed by the matrix.



          The matrix can be chosen by moving its two column vectors using the mouse. I used EventHandler for this, instead of Locators, for greater customizability and a more natural look.



          Here is the full code:



          arrowRepresentationActionMatrix[matrix_] := 
          With[pts = MeshCoordinates@DiscretizeRegion@Region@Circle,
          With[finalPts = Dot[matrix, #] & /@ pts,
          Graphics[
          PointSize@0.012, Point@finalPts,
          Arrow /@ Thread@pts, finalPts
          ]
          ]];

          DynamicModule[v1 = 0.7, -0.6, v2 = 0.6, 0.6, v3 = 1, 1,
          movingPointIndex, matrix, frameSize = 1.5, numOfIterations = 30,
          Row[
          EventHandler[
          Dynamic[
          matrix = Transpose@v1, v2;
          Show[
          arrowRepresentationActionMatrix@matrix,
          Graphics[
          PointSize@0.02, Circle, Point@0, 0,
          Red,
          If[TrueQ[movingPointIndex == 1], PointSize@0.04,
          PointSize@0.03],
          Point@v1, Arrow@0, 0, v1,
          Green,
          If[TrueQ[movingPointIndex == 2], PointSize@0.04,
          PointSize@0.03],
          Point@v2, Arrow@0, 0, v2
          ,
          Dynamic@Blue, PointSize@0.03, Point@v3, Arrowheads@0.02,

          Arrow /@
          Partition[NestList[Dot[matrix, #] &, v3, numOfIterations],
          2, 1]
          ,

          Dynamic@With[eigs = Eigenvectors@N@matrix,

          If[MatchQ[eigs, __Real ..], Purple, Thickness@0.01,
          InfiniteLine@-#, # & /@ eigs, ]
          ]

          ],
          Frame -> True,
          PlotRange -> Dynamic[-#, #, -#, # &@frameSize],
          ImageSize -> 500
          ]
          ],
          "MouseDown" :> With[mp = MousePosition["Graphics"],
          movingPointIndex =
          Position[v1, v2, v3, First@Nearest[v1, v2, v3, mp]][[1, 1]]
          ],
          "MouseDragged" :> ReleaseHold[
          Hold[Set][Hold[v1, v2, v3][[movingPointIndex]],
          MousePosition["Graphics"]]
          ]
          ],
          Column@
          "PlotRange",
          VerticalSlider[Dynamic@frameSize, 1, 10, 0.01,
          Appearance -> "Labeled"]
          , " ",
          Column@
          "Number of iterations",
          VerticalSlider[Dynamic@numOfIterations, 1, 40, 1,
          Appearance -> "Labeled"]

          ]
          ]


          and this is the result:



          enter image description here







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 1 hour ago

























          answered 1 hour ago









          glS

          4,73911140




          4,73911140











          • This is really cool
            – user6014
            1 hour ago
















          • This is really cool
            – user6014
            1 hour ago















          This is really cool
          – user6014
          1 hour ago




          This is really cool
          – user6014
          1 hour ago

















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f185644%2fmaking-an-interactive-visualization-of-the-eigenvectors-of-two-dimensional-matri%23new-answer', 'question_page');

          );

          Post as a guest













































































          Popular posts from this blog

          How to check contact read email or not when send email to Individual?

          Displaying single band from multi-band raster using QGIS

          How many registers does an x86_64 CPU actually have?