Isometrías en el plano y el espacio

Realizado por el Prof. Pedro González Rodelas 
para los alumnos del grupo 1º A de Arquitectura Técnica
como complemento a la práctica correspondiente de la asignatura de Álgebra Lineal

Última revisión: Marzo de 2007

Isometrías y matrices asociadas

La idea sería definir una aplicación vectorial de variable vectorial, con tres componentes genéricas indicadas con las variables comodín  {x_, y_, z_}. Nótese que las llaves nos permitirán aplicar dicha aplicación lineal directamente a vectores de tres componentes e incluso a matrices cuadradas de orden 3, como se verá a continuación a la hora de obtener su matriz asociada.

Clear[f, x, y, z]
f[{x_, y_, z_}] := {(1/4) (-2 + (Sqrt[2])) x - 
          (y/2) + (1/4) (2 + (Sqrt[2])) z, 
        (x/2) + (y/(Sqrt[2])) + (z/2), (1/4) (2 + (Sqrt[2])) x - 
          (y/2) + (1/4) (-2 + (Sqrt[2])) z}

B = IdentityMatrix[3];
B // MatrixForm

A = f[B];  A // MatrixForm

Simplify[A . Transpose[A]] == B

Isometrías en el plano

Giro de ángulo θ

En este caso, sabiendo la expresión que tiene la correspondiente matriz de giro, obtenida mediante la imagen de los vectores de la base canónica del espacio mediante dicho giro, ya tenermos determinada completamente dicha isometría del plano.

θ = (π/6);
G=(({{Cos[θ], -Sin[θ]}, {Sin[θ], Cos[θ]}}));
G // MatrixForm

Si queremos, con la ordenes gráficas Graphics y Line,  podemos representar el vector director de cualquier punto del plano.

v = {0, 0};  u = {2, 1};
du = Graphics[Line[{v, u}]];
Show[du, Axes -> Automatic];

Para calcular el vector imagen del vector anterior, bastará pues con multiplicarlo por la correspondiente matriz de giro.

imu = G . u

Ahora también podemos representar, con la ordenes gráficas Graphics y Line, el correspondiente vector imagen.

gu = Graphics[Line[{v, imu}]];
Show[{du, gu}, Axes -> Automatic, 
        AspectRatio -> Automatic];

Lo mismo podríamos haber hecho al representar las imágenes de los dos vectores de la base canónica.

v = {0, 0};  e1 = {1, 0};  e2 = {0, 1};
de1 = Graphics[Line[{v, e1}]];
de2 = Graphics[Line[{v, e2}]];
Show[de1, de2, Axes -> None, 
        AspectRatio -> 1];

ime1 = G . e1;
ime2 = G . e2;

ge1 = Graphics[Line[{v, ime1}]];
ge2 = Graphics[Line[{v, ime2}]];
Show[{de1, ge1, de2, ge2}, Axes -> Automatic, 
        AspectRatio -> Automatic];

Simetría respecto de una recta 

       r≡{ (x,y) / y = a x }

Para obtener fácilmente la matriz de esta simetría respecto de una recta, nos bastará con disponer de una base del plano formada un vector director de la recta y otro vector ortogonal cualquiera.

Clear[a]
B=(({{1, a}, {-a, 1}}));

De esta forma, respecto de esta nueva base cada uno de estos vectores tendrá de componentes (1,0) y (0,1) respectivamente y la matriz traspuesta de B, será pues la matriz de cambio de base de la nueva base a la base canónica.

Transpose[B] . {1, 0}
Transpose[B] . {0, 1}

Y la matriz de esta simetría, respecto de esta nueva base, tendrá una forma evidente, ya que el primer vector se mantendrá invariante y el otro se transformará en su opuesto.

A=(({{1, 0}, {0, -1}}));

A . {1, 0}
A . {0, 1}

Ahora bastará con efectual el habitual cambio de base a la base canónica, multiplicando por la correspondiente matriz de cambio de base a un lado y por su inversa al otro lado, para obtener la matriz asociada a esta misma simetría expresada en la base canónica.

Ac = Transpose[B] . A . Inverse[Transpose[B]];
Ac // MatrixForm

Podemos comprobar sin esfuerzo que efectivamente se trata de una isometría, ya que al multiplicar por su traspuesta nos da la identidad.

Simplify[Ac . Transpose[Ac]] == IdentityMatrix[2]

Y finalmente bastará con introducir la pendiente de la recta vectorial respecto de la que efectuaremos la simetría para obtener tanto la matriz asociada (sustituyendo a por su valor en la expresión genérica anterior) como la imagen de cualquier vector que nos interese.

a = 1/3;

v = {0, 0};  u = {1, 2};
du = Graphics[Line[{v, u}]];
Show[du, Axes -> Automatic];

imu = Ac . u

rec = 
        Plot[a x, {x, 0, 3}, PlotStyle -> Thickness[0.01], 
          DisplayFunction -> Identity];

gu = Graphics[Line[{v, imu}]];
Show[{du, gu, rec}, Axes -> Automatic, 
        AspectRatio -> Automatic];

La única excepción al caso genérico anterior sería el caso de una recta vertical (con pendiente infinita a priori), en cuyo caso la simetría sería evidente, ya que bastaría con tomar como base la canónica usual y como matriz de la simetría la obvia

Ac = {{-1, 0}, {0, 1}};
Ac // MatrixForm

Ac . {1, 0}

que transforma al primer vector de la base canónica en su opuesto

Ac . {0, 1}

y al segundo vector de la base canónica lo deja invariante, al estar contenido en la recta de la simetría (y evidentemente cualquier vector de esta recta tendrá que quedarse fijo).

Isometrías en el espacio

Simetría respecto a un plano

      π≡{ (x,y,z) / a x + b y +c z = 0 }

En este caso, necesitaremos disponer de una base del espacio formada por al menos dos vectores del plano linealmente independientes (que se mantendrán fijos) y por otro vector que sea ortogonal a dicho plano (y que se transformará en su opuesto).

Clear[a, b, c]
v1 = {a, b, c};
v2 = {0, -c, b};
v3 = {-c, 0, a};

Sin mucha dificultad, podremos entresacar el correspondiente vector ortogonal al plano a partir de la ecuación vectorial del mismo (si no dispusiéramos de esta tendríamos que calcularla o trabajar con la correspondiente ecuación en paramétricas, etc.) y dos vectores cualesquiera del plano (que podremos elegir libremente con tal de que satisfagan la correspondiente ecuación del plano vectorial).

{v1 . v2, v1 . v3}

En este caso concreto, como v1 corresponde precisamente con el vector perpendicular al plano, bastará con encontrar sendos vectores v2 y v3 que sean ortogonales al mismo y linealmente independientes entre sí.

B = {v1, v2, v3};
B // MatrixForm

Evidentemente, respecto de esta nueba base, dichos vectores tendrán componentes  (1,0,0), (0,0,1) y (0,0,1), respectivamente y la matriz de cambio hacia la base canónica, resultará ser precisamente Transpose[B]

Transpose[B] . {1, 0, 0}
Transpose[B] . {0, 1, 0}
Transpose[B] . {0, 0, 1}

Por otro lado, la matriz que va a tener esta simetría respecto del plano expresada a partir de esta base especial tendrá una forma trivial, ya que el primer vector se transformará en su opuesto y los otros dos se mantendrán invariables.

A=(({{-1, 0, 0}, {0, 1, 0}, {0, 0, 1}}));

Pero si lo que nos interesa es obtener la matriz asociada a esta isometría expresada en la base canónica, bastará con realizar el correspondiente cambio de base (multiplicando esta matriz por la izquierda por la matriz de cambio a la base canónica y por la derecha por su inversa)

Ac = 
        Transpose[B] . A . Inverse[Transpose[B]] // Simplify;
Ac // MatrixForm

Ahora, en un caso concreto, bastará con sustituir los valores que tienen las componentes de este vector perpendicular al plano en cuestión para obtener la matriz buscada.

a = 3;  b = 1;  c = -1;

Ac // MatrixForm

Y la imagen de cualquier vector por la aplicación de esta simetría se obtendrá sin más que multiplicar las componentes del mismo en la base canónica por la matriz así calculada.

Ac . {1, 2, 3/4}

Giro de ángulo θ respecto de una recta

      r≡{ (x,y,z) / (x, y, z) = t (a, b, c), tϵ ℝ }

En ese caso, podríamos empezar exactamente como antes, salvo que para poder utllizar una expresión de la matriz de giro equivalente a la que teníamos en el caso del plano, será necesario que los dos vectores del plano sean ortonormales entre sí (a la vez que perpendiculares al vector director escogido de la recta, que es el único que no tendría en principio que tener norma uno).

Clear[a, b, c]
v1 = {a, b, c};
v2  = {0, -c, b};

v1 . v2

Sin mucho esfuerzo hemos entresacado el vector ortogonal al plano y un vector cualquiera del mismo, pero aún nos faltaría calcular otro vector más del plano que sea ortogonal a ambos. Para ello, una posiblidad sería elegir un vector genéricco, cuyo producto escalar con los anteriores se anule

v3 = {x, y, z};

v3 . v1 == 0
v3 . v2 == 0

resolviendo las dos ecuaciones con tres incógnitas que aparecen

sol = Solve[{v3 . v1 == 0, v3 . v2 == 0}, {x, y, z}]

eligiendo para ello un valor cualquiera de entre la variedad lineal de dimensión uno de  posibles soluciones

v3 = {x, y, z} //. ({sol[[1]], z -> 1} // Flatten)

Antes de continuar, podemos comprobar que efectivamente este vector es ortogonal a los dos anteriores

{v3 . v1, v3 . v2} // Simplify

No obstante, todavía tendríamos que normalizar al menos estos dos últimos vectores del plano para poder considerar una base apropiada

B = {v1, (v2/(Sqrt[v2 . v2])), 
          (v3/(Sqrt[v3 . v3]))}; 
B // MatrixForm

Comprobemos que efectivamente, se cumplen todas las condiciones exigidas a esta base

B . Transpose[B] // Simplify // MatrixForm

Evidentemente, si disponemos de una subrutina de ortogonalización de Gram-Schmidt (en este caso dentro del paquete de Mathematica "LinearAlgebra`Orthogonalization`" que habría que cargar previamente, pero tan sólo una vez), ya podríamos evitarnos todo este proceso y simplemente ejecutar lo siguiente (aunque en este caso también se normalizará el primer vector):

<< LinearAlgebra`Orthogonalization`

Bbis = GramSchmidt[{v1, v2, v3}] // Simplify

Comprobemos pues la ortonormalidad de dicha nueva base, a partir de la ortogonalidad de la correspondiente matriz

Simplify[Bbis . Transpose[Bbis]] // MatrixForm

Con cualquiera de estas dos nuevas bases, la expresión que va a tener esta isometría (giro de ángulo θ respecto a la recta indicada) es de todos conocida

Clear[θ, M, G];
(Subscript[M, G])=(({{1, 0, 0}, {0, Cos[θ], -Sin[θ]}, {0, Sin[θ], Cos[θ]}}))

Y para obtener la expresiónn de esta isometría respecto de la base canónica, tan sólo tendremos que efectuar el consabido cambio de base.

Ac = 
        Transpose[B] . (Subscript[M, G]) . Inverse[Transpose[B]] // 
          Simplify; 
Ac // MatrixForm

que también comprobaremos que se trata de una matriz ortogonal

Simplify[Ac . Transpose[Ac]]

Para un caso concreto, bastará con introducir los valores específicos de estos parámetros que aparecen en la expresión general de esta matriz.

\(θ = π\/3; \ a = \ 2; \ b = 0; \ 
    c = 6.25 // Rationalize; \  (*\ 
      hemos\ racionalizado\ este\ último\ valor\ para\ evitar\ posteriores\ errores\ de\ redondeo\ *) 
Ac // MatrixForm\)

que también comprobaremos que se trata de una matriz ortogonal

Simplify[Ac . Transpose[Ac]] // Chop

También podemos comprobar que efectivamente el primer vector de la base se mantiene invariante

Ac . v1 == v1

mientras que los demás vectores de la base (que se encuentran incluidos en el plano ortogonal al vector anterior) son girados dentro de ese plano, un ángulo especificado por θ

Ac . v2

Ac . v3

Veámos una representación gráfica tridimensional de este hecho

rec = 
        ParametricPlot3D[t {a, b, c}, {t, 0, 2}, 
          DisplayFunction -> Identity];

imu1 = Ac . v1;  v = {0, 0, 0};
du1 = Graphics3D[Line[{v, v1}]];
gu1 = Graphics3D[Line[{v, imu1}]];
Show[{du1, gu1, rec}, Axes -> Automatic, 
        AspectRatio -> 1];

imv2 = Ac . v2;
du2 = Graphics3D[Line[{v, v2}]];
gu2 = Graphics3D[Line[{v, imv2}]];
Show[{du2, gu2, rec}, Axes -> Automatic, AspectRatio -> 1, 
        ViewPoint -> {0.837,  -1.545,  2.892}];

y comprobemos a su vez cuál ha sido el ángulo de giro, por ejemplo mediante el arcocoseno del producto escalar de los vectores unitarios determinados por estos vectores del plano y sus correspondientes imágenes

(v2/(Sqrt[v2 . v2])) . (imv2/(Sqrt[imv2 . imv2]))

?ArcCos

ArcCos[0.5]

(π/3) // N

Lo mismo podemos hacer con el último vector de la base

imv3 = Ac . v3;
du3 = Graphics3D[Line[{v, v3}]];
gu3 = Graphics3D[Line[{v, imv3}]];
Show[{du3, gu3, rec}, Axes -> Automatic, 
        AspectRatio -> 1];

(v3/(Sqrt[v3 . v3])) . (imv3/(Sqrt[imv3 . imv3]))

Composición del giro respecto a una recta con la simetría respecto al plano perpendicular a dicha recta

En este último caso, se trata pues de una composición de isometrías, por lo que bastará con multipicar las correspondientes matrices.

Clear[a, b, c, θ, M, G, S]

(Subscript[M, G])=(({{1, 0, 0}, {0, Cos[θ], -Sin[θ]}, {0, Sin[θ], Cos[θ]}}))

(Subscript[M, S])=(({{-1, 0, 0}, {0, 1, 0}, {0, 0, 1}}))

Podemos también comprobar que en este caso concreto, ambas isometrías conmutan

(Subscript[M, G]) . (Subscript[M, S]) == (Subscript[M, S]) . (Subscript[M, G])

y la forma final de la matriz (como en el caso anterior) expresada en una base ortogonal, con los dos vectores del plano ortogonal a la recta de giro  de norma uno,

M = (Subscript[M, G]) . (Subscript[M, S]);  M // MatrixForm

Clear[a, b, c]
v1 = {a, b, c};
v2  = {0, -c, b};
v3 = {-(((b^2) + (c^2))/(a c)), (b/c), 1};

B = {v1, (v2/(Sqrt[v2 . v2])), (v3/(Sqrt[v3 . v3]))};  
    B // MatrixForm

Simplify[B . Transpose[B]] // MatrixForm

Ac = 
        Transpose[B] . M . Inverse[Transpose[B]] // Simplify; 
Ac // MatrixForm

que también comprobaremos que se trata de una matriz ortogonal

Simplify[Ac . Transpose[Ac]]

Para un caso concreto, bastará con introducir los valores específicos de estos parámetros que aparecen en la expresión general de esta matriz.

θ = (π/4);  a =  2;  b = -2;  c = 0.3;
Ac // MatrixForm

Simplify[Ac . Transpose[Ac]] // Chop

También podemos comprobar que efectivamente el primer vector de la base se transforma en su opuesto

Ac . v1 == -v1

mientras que los demás vectores de la base (que se encuentran incluidos en el plano ortogonal al vector anterior) son girados dentro de ese plano, un ángulo especificado por θ

Ac . v2

Ac . v3

Veámos una representación gráfica tridimensional de este hecho

rec = 
        ParametricPlot3D[t {a, b, c}, {t, 0, 2}, 
          DisplayFunction -> Identity];

imu1 = Ac . v1;
du1 = Graphics3D[Line[{v, v1}]];
gu1 = Graphics3D[Line[{v, imu1}]];
Show[{du1, gu1, rec}, Axes -> Automatic, 
        AspectRatio -> 1];

imv2 = Ac . v2;
du2 = Graphics3D[Line[{v, v2}]];
gu2 = Graphics3D[Line[{v, imv2}]];
Show[{du2, gu2, rec}, Axes -> Automatic, AspectRatio -> 1, 
        ViewPoint -> {0.837,  -1.545,  2.892}];

y comprobemos a su vez cuál ha sido el ángulo de giro, por ejemplo mediante el arcocoseno del producto escalar de los vectores unitarios determinados por estos vectores del plano y sus correspondientes imágenes

(v2/(Sqrt[v2 . v2])) . (imv2/(Sqrt[imv2 . imv2]))

?ArcCos

ArcCos[(v2/(Sqrt[v2 . v2])) . (imv2/(Sqrt[imv2 . imv2]))]

(π/4) // N

Lo mismo podemos hacer con el último vector de la base

imv3 = Ac . v3;
du3 = Graphics3D[Line[{v, v3}]];
gu3 = Graphics3D[Line[{v, imv3}]];
Show[{du3, gu3, rec}, Axes -> Automatic, 
        AspectRatio -> 1];

(v3/(Sqrt[v3 . v3])) . (imv3/(Sqrt[imv3 . imv3]))

ArcCos[(v3/(Sqrt[v3 . v3])) . (imv3/(Sqrt[imv3 . imv3]))] - (π/4) // 
      Chop