Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
/*
 * This file:
 *   http://anggtwu.net/MAXIMA/eigshow1.mac.html
 *   http://anggtwu.net/MAXIMA/eigshow1.mac
 *          (find-angg "MAXIMA/eigshow1.mac")
 * Author: Eduardo Ochs <eduardoochs@gmail.com>
 *
 * Draw eigenvectors of 2x2 matrices using qdraw.
 * This was based on the "eigshow" program that Strang mentions here:
 *   (find-books "__alg/__alg.el" "strang")
 *   (find-books "__alg/__alg.el" "strang" "267" "Eigshow")
 *
 * Example of output:
 *   http://anggtwu.net/LATEX/2023-2-C3-Tudo.pdf#page=133
 *   3hT133 (c3m232mdp 7 "eigshows")
 *          (c3m232mda   "eigshows")
 *
 * (defun e () (interactive) (find-angg "MAXIMA/eigshow1.mac"))
 * (find-es "maxima" "qdraw-eigenvectors")
*/

load("eigen")$
load_qdraw()$
colors : [ red, orange, blue, dark_violet, gold, brown, forest_green ]$
colors : [ red, gold,   dark_red, orange,   dark_violet, violet ]$

seqn          (a,b,n) := makelist(a + (b-a)*k/n, k, 0, n);
columnvector      (L) := transpose(matrix(L))$
rowvector         (L) := matrix(L)$
rowvectortolist   (v) := v[1]$
columnvectortolist(v) := transpose(v)[1]$
gluecolumnvectors(vs) := transpose(apply('matrix, map('columnvectortolist, vs)))$
getcolumn       (M,i) := columnvector(transpose(M)[i])$
columnpara(v, [rest]) := apply('para, append(columnvectortolist(v), rest))$
columnpts(vs, [rest]) := apply('pts, append([map('columnvectortolist, vs)], rest))$
myqdraw([lists])      := apply('qdraw, apply('append, lists))$
xang(t)               := columnvector([cos(t), sin(t)])$
my_ps                 :  2$   /* change to 0.5 for pdf plots */

from_x1x2_la1la2() := (
  S      : gluecolumnvectors([x1,x2]),
  LA     : diag_matrix(la1, la2),
  Sinv   : S^^-1,
  A      : S . LA  . Sinv,
  projx1 : S . diag_matrix(1,0) . Sinv,      /* project on x1, kill x2 */
  projx2 : S . diag_matrix(0,1) . Sinv       /* project on x2, kill x1 */
  )$

from_th1th2_la1la2() := (
  [x1, x2] : [xang(th1), xang(th2)],
  from_x1x2_la1la2()
  )$

from_th_la1la2(th) := (
  [th1, th2] : [th, th+%pi/2],
  from_th1th2_la1la2()
  )$

from_A () := block([vals, multiplicities, vecss],
  [[vals, multiplicities], vecss]: eigenvectors (A),
  la1  : vals[1],
  la2  : vals[2],
  x1   : unitvector(columnvector(vecss[1][1])),
  x2   : unitvector(columnvector(vecss[2][1])),
  S    : gluecolumnvectors([x1,x2]),
  LA   : diag_matrix(la1, la2),
  Sinv : S^^-1
  );

/*
def_circles() := (
    xs     : columnpara(  xang(t), t, 0, 2*%pi, lc(colors[1])),
   Axs     : columnpara(A.xang(t), t, 0, 2*%pi, lc(colors[2])),
   xis     : columnpts([  x1,   x2], pc(colors[3]), ps(2)),
  Axis     : columnpts([A.x1, A.x2], pc(colors[4]), ps(2))
  )$
*/

eigen_circle()     := [columnpara(  xang(t), t, 0, 2*%pi, lc(colors[1]))]$
eigen_ellipse()    := [columnpara(A.xang(t), t, 0, 2*%pi, lc(colors[2]))]$
eigen_ptc(x,c1,c2) := [columnpts([  x], pc(colors[c1]), ps(my_ps)),
                       columnpts([A.x], pc(colors[c2]), ps(my_ps))]$
eigen_pt(x)        := eigen_ptc(x,3,4);
eigen_base()       := append(eigen_pt(x1), eigen_pt(x2))$
eigen_basic(r)     := append([xr(-r,r), yr(-r,r), more(proportional_axes=xy)],
                             eigen_circle(), eigen_ellipse(), eigen_base())$

mypdf_stem       :  "/tmp/a_";  /* replace this */
mypdf(n)         := [more(terminal=pdf, file_name=concat(mypdf_stem, n))];
x3(angle)        := columnvector([cos(angle), sin(angle)]);
eigen_pta(angle) := eigen_ptc(x3(angle), 5, 6);



/*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("~/MAXIMA/eigshow1.mac");

x1   : columnvector([1,1]);
x2   : columnvector([0,1]);
la1  : 2;
la2  : 3;

from_x1x2_la1la2();
myqdraw(eigen_basic(5));

x1 : unitvector(x1);
from_x1x2_la1la2();
myqdraw(eigen_basic(5));
myqdraw(eigen_basic(5), eigen_ptc(x1+x2, 5, 6));

A : matrix([0,2], [2,1]);
from_A()$
S;
LA;
myqdraw(eigen_basic(5));

la1 : 2;
la2 : 3;
from_th_la1la2(%pi/4);
myqdraw(eigen_basic(5));
myqdraw(eigen_basic(5), eigen_ptc(x1+x2, 5, 6));

myqdraw(eigen_basic(5), eigen_pta(0));
myqdraw(eigen_basic(5), eigen_pta(%pi/6));

my_ps : 0.75;

la1 : 2;
la2 : 3;
from_th_la1la2(%pi/4);
mypdf_stem : "/tmp/eigshow_a_";
for i: 0 thru 16 do
  myqdraw(eigen_basic(5),
          eigen_pta(2*%pi*(i/16)),
          mypdf(i));

la1 : 2;
la2 : -3;
from_th_la1la2(%pi/4);
myqdraw(eigen_basic(5));
mypdf_stem : "/tmp/eigshow_b_";
for i: 0 thru 16 do
  myqdraw(eigen_basic(5),
          eigen_pta(2*%pi*(i/16)),
          mypdf(i));

** (find-fline "/tmp/" "eigshow_a_0.pdf")
** (find-fline "~/LATEX/2023-2-C3/")
** (find-sh "cp -v /tmp/eigshow_*.pdf ~/LATEX/2023-2-C3/")


** (find-fline "/tmp/" "a.pdf")
** (find-fline "/tmp/a.pdf")

*/