http://ocw.usal.es/ensenanzas-tecnicas/algebra-lineal-y-geometria-ii/descargar-curso-completo/

Subespacio incidente

Sea V el subespacio vectorial de E generado por los vectores { (Subscript[v, 1]),......,(Subscript[v, m])}. Su subespacio incidente es el subespacio del espacio dual   (SuperStar[E])cuyos elementos son las formas lineales que se anulan sobre los vectores de V. Por tanto, el subespacio incidente de  V  es el subespacio solución del sistema homogéneo de matriz asociada la matriz cuyas filas son las coordenadas de los vectores { (Subscript[v, 1]),......,(Subscript[v, m])}. Así , representando también por V  la  matriz  { (Subscript[v, 1]),......,(Subscript[v, m])}, se tiene que  Incidente(V)=Ker(V); por lo que en Mathematica definimos:

Incidente[V_]:=NullSpace[V]

Ejemplo 1
Calculemos una base del subespacio incidente con el subespacio V de (R^4) generado por los vectores  (1,2,2,-1), 
(2,-1,3,0) y  (1,-3,1,1).

V={{1,2,2,-1},{2,-1,3,0},{1,-3,1,1}};

Incidente[V]

Luego unas ecuaciones implícitas de V son : x+2y+5t=0 , -8x-y+5z=0.

Recordando que el  incidente del incidente de un subespacio es el propio subespacio:
	- Dado un sistema de generadores de V, podremos encontrar una base de V sin más que calcular el Incidente(Incidente(V)).
	- Dado un sistema de generadores W del incidente con V, es decir unas ecuaciones implícitas de V, podremos encontrar una base de V sin más que calcular el Incidente(W).

Ejemplo 2
Calcular una base del subespacio de (R^4) generado por los vectores {1,2,0,1},{1,-1,3,1},{0,1,-1,0},{1,0,2,1}.

S={{1,2,0,1},{1,-1,3,1},{0,1,-1,0},{1,0,2,1}};

(*Base de S*)
Incidente[Incidente[S]]

Ejemplo 3
Calcular una base del subespacio (Subscript[E, 1]) de (R^4) de ecuaciones implícitas x+2y-t=0, 2x-3y+z-t=0.

(*Incidente de (Subscript[E, 1])*)
W={{1,2,0,-1},{2,-3,1,-1}};

(*Base de (Subscript[E, 1])*)
Incidente[W]

Clear[V,S,W]

Subespacio ortogonal respecto de una  métrica no singular

Sea (E, (Subscript[T, 2])) un espacio métrico.
Vamos a definir una función que nos permita calcular el subespacio ortogonal a un subespacio V de E cuando la métrica  (Subscript[T, 2]) es irreducible o no singular.
Para ello, recordemos que  el subespacio ortogonal a V se identifica con el subespacio antiimagen de su  subespacio incidente por la polaridad asociada a la métrica, (Subscript[ϕ, (Subscript[T, 2])]):
			Ortogonal(V)=((Subscript[ϕ, (Subscript[T, 2])])^(-1))( Incidente(V) )
Por otra parte, como la matriz de la polaridad coincide con la transpuesta de la matriz de la métrica,  Matriz ((Subscript[T, 2])) = G,  Matriz((Subscript[ϕ, (Subscript[T, 2])])) = (G^t), y , en este caso, G es una matriz no singular y por tanto invertible, se tiene:
	Si  {(Subscript[w, 1]),....., (Subscript[w, p])} es una base del Incidente(V) los vectores {(G^(-1))(Subscript[w, 1]),.....,(G^(-1))(Subscript[w, p])} forman una base del Ortogonal(V):
	Incidente(V)= {(Subscript[w, 1]),....., (Subscript[w, p])} ⟺ Ortogonal(V)= {(G^(-1))(Subscript[w, 1]),.....,(G^(-1))(Subscript[w, p])} 
Así, conocido un sistema de generadores de V y la matriz de la métrica G, en Mathematica, podemos definir el subespacio ortogonal a V  respecto de la métrica irreducible G, recordando que Incidente[V]=NullSpace[V] ,  en la forma siguiente:

Ortogonalirre[V_,G_]:=Table[Inverse[Transpose[G]].NullSpace[V][[i]],{i,1,Length[NullSpace[V]]}]

Ejemplo 4
Calculemos el subespacio ortogonal al subespacio generado por los vectores (1, -1, 0), (0, 1, -1), (-1, 0, 1), respecto de la métrica de matriz asociada G=(({{3, 0, 1}, {0, 2, 1}, {1, 1, 1}})).

(*G es no singular, pues su determinante es no nulo*)

G={{3,0,1},{0,2,1},{1,1,1}};Det[G]=!=0

V={{1,-1,0},{0,1,-1}, {-1,0,1}};

Ortogonalirre[V,G]

Subespacio ortogonal para métricas cualesquiera

Si la métrica es singular no existe (G^(-1)), por lo que la función anterior no sirve para calcular el subespacio ortogonal. Programaremos otra función para calcular el ortogonal utilizando para ello su definición:
		Ortogonal(V)={e∈E : (Subscript[T, 2])(e, v)=0 para todo v∈V}
	El ortogonal es el subespacio solución del sistema homógeneo {e.G.(Subscript[v, 1])=0, ....., e.G.(Subscript[v, m])=0}, siendo m=nºgeneradores de V  y   e  el vector de incógnitas, es decir, el subespacio ortogonal a V es el núcleo de la matriz asociada a este sistema (matrizort) o, lo que es equivalente, el núcleo de la aplicación lineal  fortog( e )=( e.G.(Subscript[v, 1]), ....., e.G.(Subscript[v, m ])).
	Así, conocido un sistema de generadores de V y la matriz de la métrica G, en Mathematica, podemos definir el subespacio ortogonal a V  respecto de la métrica  G en la forma siguiente:

Ortogonal[V_,G_]:=Module[{e,i,fortog,matrizort},
e=Array[x,Length[V]];
fortog[e_]:=Table[e.G.V[[i]],{i,1,Length[V]}];
matrizort=Transpose[Map[fortog,IdentityMatrix[Length[G]]]];
NullSpace[matrizort]]

Ejemplo 5
Calculemos con esta nueva función el ortogonal del subespacio V respecto de la métrica G del ejemplo 4.

Ortogonal[V,G]

Ejemplo 6
Calculemos, con las dos  funciones definidas para el ortogonal, el ortogonal al subespacio V del ejercicio anterior respecto de la métrica G'=(({{3, 5, 1}, {0, 2, 1}, {1, 1, 0}})).

(*G'es singular, pues su determinante es nulo*)

G'={{3,5,1},{0,2,1},{1,1,0}};Det[G']==0

Ortogonalirre[V,G']

Ortogonal[V,G']

Métricas euclídeas

Una métrica (Subscript[T, 2]) sobre un espacio vectorial real es euclídea si es:
	- Simétrica :   (Subscript[T, 2])(e, e')= (Subscript[T, 2])(e', e) , cualesquiera que sean  e, e' ∈ E
	- Definido positiva : (Subscript[T, 2])(e, e)⩾0 para todo e ∈ E  y   (Subscript[T, 2])(e, e)=0 ⇔ e=0
La polaridad asociada a una métrica euclídea es un isomorfismo, luego toda métrica euclídea es no singular.
Si  G  es la matriz asociada a una métrica euclídea  G es simétrica, G=Transpose[G], y todos sus menores diagonales son estrictamente positivos. Recíprocamente, toda matriz simétrica cuyos menores diagonales son estrictamente positivos es una matriz asociada a una métrica euclídea.

Ejemplo 7
Veamos si las matrices G=(({{3, 0, 1}, {0, 2, 1}, {1, 1, 1}})) y  G'= (({{3, 5, 1}, {5, 2, 1}, {1, 1, 0}})) son  matrices asociadas a métricas euclídeas

Comprobamos que  G  y  G'  son matrices simétricas

G={{3,0,1},{0,2,1},{1,1,1}};Transpose[G]==G

G'={{3,5,1},{5,2,1},{1,1,0}};Transpose[G']==G'

Calculamos los menores diagonales de las matrices   G  y  G'

(*Calculamos los menores uno a uno y comprobamos si son positivos*)

{Minors[G,1][[1,1]],Minors[G,2][[1,1]],Minors[G,3][[1,1]]}

Deducimos que  G es euclídea

{Minors[G',1][[1,1]],Minors[G',2][[1,1]],Minors[G',3][[1,1]]}

Deducimos que  G'  no es euclídea

(*Podemos simplificar los cálculos anteriores obteniendo directamente si todos los menores son positivos con la instrución siguiente*)

Table[Minors[G,n][[1,1]]>0,{n,1,Length[G]}]

Table[Minors[G',n][[1,1]]>0,{n,1,Length[G']}]

Los cálculos efectuados en el Ejemplo 7 anterior  van a servir para programar una función que nos diga cuando una métrica dada por su matriz en una base es o no euclídea

euclidea[G_]:=If[Transpose[G]===G&&Table[Minors[G,n][[1,1]]>0,{n,1,Length[G]}]===Table[True,{Length[G]}],Print["Es euclidea"],Print["No es euclidea"]]

Utilicemos ahora esta función para averigüar si las métricas del ejemplo 7 son o no euclídeas

euclidea[G]

euclidea[G']

Módulo del vector e : |e|=(Sqrt[(Subscript[T, 2])[e,e]])

Coseno del ángulo determinado por los vectores e  y  e' : cos(e,e')=((|(Subscript[T, 2])[e,e]|)/(|e||e'|))

Una base  {(Subscript[e, 1]), (Subscript[e, 2]),...., (Subscript[e, n])} de un espacio euclídeo  (E, (Subscript[T, 2])) es una base  ortogonal   si sus vectores son ortogonales dos a dos,
 (Subscript[T, 2])((Subscript[e, i]), (Subscript[e, j]))=0  si  i≠ j
 
 Una base  {(Subscript[e, 1]), (Subscript[e, 2]),...., (Subscript[e, n])} de un espacio euclídeo  (E, (Subscript[T, 2])) es una base  ortonormal si es ortogonal y sus vectores son de módulo 1.

Ejemplo 8

Dada  la matriz   G=(({{3, 0, 1}, {0, 2, 1}, {1, 1, 1}})), se pide:
1.  Comprobar que define una métrica euclídea  (Subscript[T, 2])  y  calcular en coordenadas el producto escalar  asociado.
2.  Calcular el producto escalar de los vectores  e=(1,-1,5)  y  e'=(2,3,-1). Calcular también el módulo de e y  el de e'  y el ángulo que ambos determinan.
3.  Averigüar si los vectores  (2,3,-6)  y  (6,0,0) son ortogonales.
4.  Calcular el subespacio ortogonal  al plano  x+y+z=0.
5.  Calcular la distancia del punto P=(1,2,3) a la recta  r≡((x-1)/2)= -y = z+1
6.  Ortonormalizar la base en la que la matriz de la métrica  (Subscript[T, 2 ]) es  G.

Solución
1.

G=(({{3, 0, 1}, {0, 2, 1}, {1, 1, 1}}));

G es simétrica y definido positiva

Transpose[G]==G
Table[Minors[G,n][[1,1]]>0,{n,1,3}]

Producto escalar asociado

T2[u_,v_]:=u.G.v

Calculemos la expresión de este producto escalar en coordenadas respecto de la base en la que la matriz de   (Subscript[T, 2]) es G

T2[{x,y,z},{x',y',z'}]

2.   Producto escalar de  e   por  e'

e={1,-1,5} ;e'={2,3,-1};T2[e,e']

Módulo de  e , módulo de  e'

(*módulo de un vector respecto de la métrica T2*)

modulo[v_]:=Sqrt[T2[v,v]]

modulo[e]

modulo[e']

(*ángulo determinado por dos vectores respecto de la métrica T2*)

angulo[u_,v_]:=ArcCos[Abs[T2[u,v]]/(modulo[u]*modulo[v])]

angulo[e,e']

(*aproximación en radianes*)    angulo[e,e']//N

3.   Son ortogonales pues su producto escalar es 0

T2[{2,3,-6},{6,0,0}]

(*Calculemos el ángulo que determinan estos vectores*)

angulo[{2,3,-6},{6,0,0}]

4.  Como una métrica euclídea es no singular podemos calcular el ortogonal de un subespacio mediante la función siguiente

Ortogonalirre[V_,G_]:=Table[Inverse[Transpose[G]].Incidente[V][[i]],{i,1,Length[Incidente[V]]}]

(*Recordemos el incidente*)
Incidente[V_]:=NullSpace[V]

(*Base del plano x+y+z=0*)
V={{1,-1,0},{0,1,-1}};

Subespacio ortogonal al plano   x+y+z=0

Ortogonalirre[V,G]

5.   Se define la distancia entre dos puntos A y B como el módulo del vector AB , dis(A,B)=modulo[AB].
Recordemos que  la distancia de un punto P a una recta r  es  igual a la distancia del punto P a su proyección ortogonal sobre r:
			dis(P, r)=dis(P, Q) ,  donde Q =pl⋂ r , siendo  pl  el plano que pasa por  P  y es perpendicular a r

P={1,2,3};
(*Un vector director de r es *) e={2,-1,1};
(*Las ecuaciones implícitas de r son*) r={x+2y==1,y+z==-1};

Ecuación del plano pl  que pasa por P y es perpendicular a  r

{x-1,y-2,z-3}.G.{2,-1,1}==0

pl=Simplify[%]

Punto Q = pl⋂ r

Solve[Flatten[{pl,r}],{x,y,z}]

Q=Flatten[{x,y,z}/.%]

Distancia del punto  P  a la recta  r  dis(P, r)=dis(P, Q)=modulo[PQ]

PQ=Q-P;modulo[PQ]

6. Si {e1,e2,e3} es la  base en la que la matriz de la métrica  T2  es  G  tenemos que calcular una base {u1,u2,u3} en la que la matriz de  G  sea la identidad, es decir, una base ortonormal.
Para ello, recordemos primero cómo obtener a partir de {e1,e2,e3} una base ortogonal {v1,v2,v3}:

v1=e1 ;   v2=e2-((T2(e2,v1))/(T2(v1,v1)))v1 ;  v3=e3 - ((T2(e3,v1))/(T2(v1,v1))) v1- ((T2(e3,v2))/(T2(v2,v2)))v2

Normalizando esta base, es decir, dividiendo cada vector por su módulo respecto de la métrica T2, se obtiene la base ortonormal {u1,u2,u3}:

u1=(v1/(modulo[v1])) ;  u2=(v2/(modulo[v2])) ;  u3=(v3/(modulo[v3]))

Ahora calculémosla con el Mathematica:

Base inicial   {e1, e2, e3}

{e1,e2,e3}=IdentityMatrix[3]

Ortogonalización de la base inicial   {v1, v2, v3}

v1=e1;
v2=e2-(T2[e2,v1]/T2[v1,v1])v1;
v3=e3-(T2[e3,v1]/T2[v1,v1])v1-(T2[e3,v2]/T2[v2,v2])v2;
(*Base ortogonal obtenida*)
{v1,v2,v3}

Base ortonormalizada   {u1, u2, u3}

{u1,u2,u3}={v1/modulo[v1],v2/modulo[v2],v3/modulo[v3]}

Veamos que, en efecto, la matriz de la métrica T2 en la  base {u1,u2,u3} es la matriz identidad:

matriz[T2_,b_]:=Table[T2[b[[i]],b[[j]]],{i,1,Length[b]},{j,1,Length[b]}]

matriz[T2,{u1,u2,u3}]

Simplify[matriz[T2,{u1,u2,u3}]]

El programa Mathematica permite directamente ortonormalizar una base  respecto de una métrica T2 dada utilizando la función
 GramSchmidt[base, InnerProduct->T2] , que sólo está accesible si se carga el package  LinearAlgebra`Orthogonalization`. 
 Comprobemos, utilizando esta función los resulatdos anteriores.

Ortonormalizamos la base {e1, e2, e3} respecto de la métrica definida T2

Orthogonalize[{e1,e2,e3},T2,Method->"GramSchmidt"]