Está en la página 1de 73

El método de Gauss-Jordan y

preliminares de Álgebra Lineal


Práctica 1

Objetivos de la sesión

Presentar al alumno las posibilidades de aplicación del programa Maple al Álgebra


Lineal.

Familiarizar al alumno con la sintaxis básica de Maple e introducir algunos comandos


nuevos.

Que el alumno repase algunos de los conceptos básicos del Álgebra Lineal ya
estudiados en cursos anteriores.

Que el alumno repase y afiance su comprensión del método de Gauss-Jordan para la


resolución de un sistema de ecuaciones lineales y utilice Maple para resolver por este
método varios sistemas de ecuaciones lineales. En la práctica 3 se tratarán los
correspondientes métodos numéricos.

> #Pulsa return

Tiempos

La duración de la práctica (incluida la evaluación) es de dos horas. La primera hora


(aproximadamente) se dedicará al desarrollo-estudio de los contenidos de los apartados
"Uso del Sistema Maple en Álgebra Lineal" y "Lección y comandos de Maple
necesarios," donde se introducen y repasan los conceptos y se muestran los comandos
de Maple precisos para el desarrollo de la práctica. La segunda hora a la realización del
test de evaluación.

> #Pulsa return

Como se debe realizar la siguiente práctica

El presente guión seguido con las indicaciones y observaciones del profesor contiene las
instrucciones precisas para realizar con el ordenador ejercicios sobre los contenidos
presentados en las clases teóricas.

Lo deseable, para que queden afianzadas las ideas y las nociones básicas sobre la
sintaxis de Maple, es que se realicen prueba y nuevos ejemplos sobre la base de los
ejemplos planteados.
> #Pulsa return

Uso del Sistema Maple en Álgebra Lineal


En esta primera parte de la práctica se recuerdan algunas características y comandos de
Maple y se describen a través de ejemplos algunos comandos del paquete "linalg" útiles
para el desarrollo de esta y otras prácticas. Así pues el alumno deberá ejecutar dichos
ejemplos y tecleará otros que le permitan comprender la aplicación de dichos comandos.

> #Pulsa return

Maple es un Sistema de Computación Matemática (abreviadamente S.C.M.) que


permite realizar cálculos numéricos, manipular expresiones simbólicas y crear nuevos
procedimientos , entendiendo por éstos una secuencia de instrucciones, sentencias y
funciones cuyo objetivo es resolver o realizar una determinada aplicación.

A este respecto es importante señalar que, además del núcleo de Maple que incorpora
ciertas funciones y comandos de uso corriente, y que se carga automáticamente al
arrancar el sistema, el sistema Maple tiene una biblioteca compuesta de librerías. En las
librerías residen las funciones que realizan tareas matemáticas complejas.

Para trabajar con las funciones y/o los procedimientos de una de estas librerías, es
preciso utilizar el comando with . Así por ejemplo, para trabajar con la librería linalg ,
escribiremos:

with(linalg);

Para ejecutar ese comando, colocaremos el cursor tras el ";" y pulsaremos la tecla
"intro". Al ejecutar ese comando aparece una lista con las funciones y procedimientos
accesibles en esa librería.

> with(linalg);

Warning, new definition for norm


Warning, new definition for trace
Si se quiere trabajar con una librería de Maple sin que aparezca la lista con las funciones
y procedimientos accesibles en ella,

basta con utilizar ":" en vez de ";" despues del comando with( nombre_librería ). Por
ejemplo:

> with(linalg):

> #Pulsa return

Teniendo en cuenta que, al menos para la mayoría de vosotros, éste no es el primer


curso en el que habeis tenido contacto con Sistemas de Computación Matemática,
vamos a dedicar la primera parte de la sesión a recordar algunos elementos de la sintaxis
de Maple y a familiarizarnos con el tipo de problemas en el que podemos emplear esta
herramienta.

Maple es una herramienta útil para manipular fórmulas, ecuaciones y datos. La siguiente
sesión está preparada como sesión introductoria al manejo de Maple en el marco del
Álgebra Lineal.

ÁLGEBRA LINEAL Y MANIPULACIÓN DE MATRICES.

Llamamos al paquete utilizando el comando with(linalg):

> restart;with(linalg):

Warning, new definition for norm


Warning, new definition for trace

Obsérvese que los avisos que aparecen en pantalla son "outputs" normales y no indican
un problema.

Definamos una matriz cuadrada A, de dimensión 3, con caracteres alfanuméricos


utilizando el comando matrix() :

> A:= matrix([[1,-alpha,2/3],[-1,0,1],[beta/3,2,-1]]);


Para obtener la matriz anterior, se puede utilizar también la sintaxis

> A:= matrix(3,3,[1,-alpha,2/3,-1,0,1,beta/3,2,-1]);

Es también posible definir una matriz A como una función de los pares ordenados de
índices (i,j), expresando cada coeficiente A[i,j] en función de los valores de i y de j.

Así la matriz identidad de dimensión 6 se puede definir como una función

con dominio igual a {1,2,3,4,5,6}x{1,2,3,4,5,6}:

> Id:=(i,j)-> if i=j then 1 else 0;fi;

> I6:=matrix(6,6,Id);

Obtenemos la traspuesta de A:

> transpose(A);
Calculamos su determinante (simbólico):

> det(A);

Calculamos su inversa :

> inverse(A);

Ahora definimos una matriz numérica B:

B:= matrix(3,2,[[1,2],[1,1],[-1,0]]);

Para obtener el coeficiente (i,j) de una matriz B, se utiliza el comando B[i,j], por
ejemplo:

> B[3,1];

También es posible multiplicar matrices. Por ejemplo, sea C = AB:

> C:= multiply(A,B);


Para cálculos más complicados con expresiones matriciales, la función evalm() permite
utilizar una notación más natural. Obsérvese que el operador especial " &* " denota el
producto habitual de matrices, mientras que el operador "*" denota la multiplicación
por escalares . El siguiente ejemplo calcula AB-(1/3)*C:

> evalm(A &* B - 1/3*C);

Finalmente, los sistemas de ecuaciones lineales también pueden ser resueltos utilizando
su representación matricial. En ese caso se emplea el comando linsolve(A,B) ,
entendiéndose entonces que lo que se está resolviendo es la ecuación matricial

. Por ejemplo:

> A:= matrix([[2,2,2],[1,1,0],[-1,0,1]]);

> B:=matrix([[3],[2],[1]]);

> X:=linsolve(A,B);
> #Pulsa return

Para finalizar esta parte de la práctica, vamos a ver cómo se puede utilizar Maple para
obtener la representación gráfica de los sistemas de ecuaciones con tres incógnitas
mediante los planos determinados por cada una de las ecuaciones que lo componen.

Consideremos ahora el sistema

que podemos escribir como una lista de tres ecuaciones lineales:

> Sistema:=[2*x+y+z = 1,2*x+y+z = 5, 3*x-y-z = 0];

Expresando en cada ecuación la variable explícitamente en función de las variables

e , se obtiene el sistema de ecuaciones

Maple contiene el comando isolate(ecuación, expresión) en la librería isolate , que nos


permite escribir las ecuaciones en esta última forma:

> readlib(isolate):

> Sistz:={isolate(Sistema[1],z),isolate(Sistema[2],z),isolate(Sistema[3],z)};
Si queremos representar las tres ecuaciones en una única gráfica, se puede utilizar el
comando plot3d:

> plot3d({1-2*x-y,5-2*x-y,3*x-y},x=-10..10,y=-10..10);

Nota: Si se pincha con el cursor la gráfica obtenida, aparecen nuevos botones en la


barra de herramientas y podéis explorara que acciones se corresponden. También, se
puede arrastrar el cursor en el área de la gráfica para cambiar de perspectiva.

Con la representación gráfica de los planos anteriores a la vista, ¿es compatible el


sistema de ecuaciones lineales anterior?

> #Pulsa return

También es posible representar los planos directamente utilizando las ecuaciones

originales del sistema (donde la variable depende de la variables e de forma


implícita) y un comando especial que requiere del uso de la librería plots . Para ello
usaremos el comando with(plots): (recordamos que los dos puntos al final de la "línea
de input de comandos" tienen el mismo efecto que el punto y coma pero no "producen
eco", es decir, el sistema ejecuta la operación pero no da una respuesta en pantalla).

> with(plots):

> implicitplot3d({2*x+y+z = 1, 2*x+y+z = 5,3*x-y-z = 0},x=-10..10,y=-10..10, z=-


40..40);
Para irnos familiarizando con algunos comandos que se emplearán en las siguientes
prácticas, tras la definición de los correspondientes vectores, utilizaremos el comando
dotprod (producto escalar usual) para definir la longitud (la norma) de un vector
genérico (en Maple sqrt =raíz cuadrada).

> u:=vector([1,2,3]);

> v:=vector([2,5,7]);

> dotprod(u,v);

> longitud:=x->sqrt(dotprod(x,x));

> longitud(u);

Podemos ahora calcular la proyección ortogonal de u sobre v, utilizando la fórmula :

> evalm((dotprod(u,v)/dotprod(v,v))*v);
#Pulsa return

Lección
Introducción

En la sección anterior se ha visto, entre otras cosas, cómo se pueden resolver sistemas
de ecuaciones lineales, invertir matrices y calcular el valor de determinantes. Vamos
ahora a utilizar Maple para aplicar los métodos de reducción de matrices por medio de
transformaciones elementales vistos en las clases teóricas.

> #Pulsa return

Como hemos visto, Maple tiene implementada en la librería linalg un comando para

resolver sistemas de ecuaciones lineales, siendo su sintaxis , donde A es


la matriz de coeficientes y B es la matriz de los términos independientes (y por
consiguiente una matriz columna).

El objetivo de este apartado es exponer con claridad cuales son las herramientas básicas
que configuran los métodos

de eliminación gaussiana y de Gauss-Jordan, al margen de que el uso del comando


linsolve permita resolver sistemas de ecuaciones sin saber realmente cómo se está
haciendo.

> #Pulsa return

Matrices asociadas a un sistema de ecuaciones lineales

En general, si consideramos un sistema de ecuaciones lineales de la forma:

+....+

+....+

.....

+....+ ,

es posible plantearlo en la forma matricial :

> A:=matrix(3,4,(i,j)->a[i,j]);
> B:=matrix(3,1,(i,j)->b[i]);

> X:=matrix(4,1,(i,j)->x[i]);

> evalm(A&*X)=evalm(B);

y trabajar directamente con la matriz ampliada de dicho sistema = (A|B),


utilizando el comando concat :

> Am:=concat(A,B);

Ejemplo 1

Dado el sistema
> S:={x[1]+x[2]+x[3] = 1, 2*x[1]-2*x[2]+x[3] = 2, 3*x[1]+3*x[2]+3*x[3] = 3};

su matriz ampliada asociada sería

> Am:=matrix([[1, 1, 1, 1], [2, -2, 1, 2], [3, 3, 3, 3]]);

La matriz se puede también definir utilizando el comando coeffs(polinomio) , que


permite crear la lista de los coeficientes de las variables de un polinomio

> coeffs(x[1]+x[2]+x[3]);

> coeffs(2*x[1]-2*x[2]+x[3]);

> coeffs(3*x[1]+3*x[2]+3*x[3]);

y creando la matriz asociada a nuestro sistema

> A:=matrix([[coeffs(x[1]+x[2]+x[3])],[coeffs(2*x[1]-
2*x[2]+x[3])],[coeffs(3*x[1]+3*x[2]+3*x[3])]]);
La matriz ampliada =( | ) es

> B:=matrix(3,1,[1,2,3]);

> Am:=concat(A,B);

> #Pulsa return

Compatibilidad e incompatibilidad

Para determinar si un sistema es compatible o no, y resolverlo en su caso por el método


de eliminación gaussiana o por el de Gauss-Jordan, realizaremos transformaciones
elementales por filas (intercambiar filas, multiplicar filas por un número distinto de

cero, sumar o restar filas) sobre la matriz ampliada , lo que equivale a realizar las
mismas operaciones sobre las ecuaciones que representan dichas filas. En símbolos:

-> ->...->

donde es el resultado de aplicar la transformación , , a la matriz

(notar que = es la matriz original).

> #Pulsa return

Para el método de eliminación gaussiana tendrá que estar en forma


escalonada del tipo:
donde las primeras filas contienen los unos principales que corresponden a las
variables principales del sistema.

> #Pulsa return

Según vimos, si es distinto de cero el sistema es incompatible .

Por otra parte, si y , entonces =1 y el sistema es compatible


determinado y se puede resolver o bien con el método de Gauss-Jordan (realizando
transformaciones elementales por filas hasta que la matriz obtenida esté en forma
escalonada reducida ), o bien por sustitución hacia atrás .

Por ejemplo, está claro que con la representación establecida para los sistemas de

ecuaciones lineales, el sistema correspondiente a la matriz , tendría

como solución .

Finalmente, si y r<n, pasaríamos a considerar el sistema obtenido al dejar


en el primer miembro las variables principales, trasladando las variables secundarias
(parámetros) al segundo miembro de la igualdad:

> #Pulsa return

+....+ -...-
.....

-...-

obteniendo así un sistema que se puede resolver, como en el caso anterior, o bien
realizando transformaciones elementales por filas sobre la matriz ampliada hasta que las
r primeras columnas de la matriz considerada (es decir, todas menos la última) sean las

de la matriz , o bien por sustitución hacia atrás.

> #Pulsa return

Ejemplo 2

En el Ejemplo 1, hallamos la matriz ampliada asociada al sistema

> Am:=concat(A,B);

que, sometida a oportunas transformación elementales por filas, daría lugar a

> matrix([[1, 1, 1, 1], [0, 1, 1/4, 0], [0, 0, 0, 0]]);

por lo que deberíamos pasar al sistema


con su correspondiente matriz asociada

> matrix([[1, 1, 1-x[3]], [0, 1, -x[3]/4]]);

Para calcular las soluciones, podemos sustituir en la ecuación

, o escribir la matriz en su forma escalonada reducida:

> matrix([[1, 0, 1-x[3]+1/4*x[3]], [0, 1, -1/4*x[3]]]);

Tranformaciones elementales por filas con Maple

Dada una matriz

> A:=matrix([[1,1,1,-1,1],[2,-2,1,2,0],[3,3,3,3,1],[1,0,-3,4,5]]);

Los comandos de Maple que corresponden a las transformaciones elementales por filas

sobre una matriz son los siguientes:

para intercambiar las filas i y j se emplea el comando swaprow(A, i, j) :


> swaprow(A,1,2);

el comando mulrow(A, i, k) permite multiplicar una fila i por un número k (distinto


de cero) :

> mulrow(A,1,24);

para sumar a la fila j la fila i multiplicada por un número k se emplea el comando


addrow(A, i, j, k) :

> addrow(A,1,3,-3);

En algunos casos puede resultar conveniente "personalizar" los comandos.

Por ejemplo, si definimos la función "filapor" en el siguiente modo:

> filapor:=(i,k)->mulrow(A,i,k);

la función así definida multiplica la fila i-ésima de A por k.

> filapor(1,24);
Cuando los sistemas resulten compatibles indeterminados, pueden resultar útiles los

siguientes comandos (el primero multiplica una columna por un número distinto de
cero, el segundo elimina filas y el tercero elimina columnas):

> mulcol(A,1,k);

> delrows(A,1..2);

> delcols(A,3..4);

Finalmente la función pivot , que tiene la forma pivot(A, i, j) , devuelve una nueva
matriz en la que en todos los elementos de la columna j se han convertido en ceros (por

medio de transformaciones elementales), a excepción del elemento de dicha

matriz, que es el que se ha utilizado como pivote. Si el elemento es nulo, al aplicar


el comando pivot se obtiene un mensaje de error:

> pivot(A,2,3);
> A[2,5];pivot(A,2,5);

Error, (in pivot) cannot pivot on zero entry

Si se quiere que se conviertan en ceros sólo los elementos de la columna j que


pertenecen a filas inferiores a la fila i , se utiliza pivot(A, i, j, r..s) :

> pivot(A,2,3,3..4);

La función gausselim reduce una matriz a su forma escalonada (sin que los coeficientes
principales sean igual a 1):

> gausselim(Am);

La función gaussjord reduce una matriz a su forma escalonada reducida:

> gaussjord(Am);
En todo caso, como ya hemos comentado, la función que resuelve de forma directa el

sistema de ecuaciones lineales es , que básicamente realiza


secuencialmente las operaciones descritas.

Por ejemplo, el sistema de ecuaciones de los ejemplos 1 y 2 anteriores lo resolveríamos


del siguiente modo:

> A:=matrix([[1,1,1],[2,-2,1],[3,3,3]]);

> B:=matrix([[1],[2],[3]]);

> linsolve(A,B);

> #Pulsa return

Los comandos vistos también pueden ser utilizados para trabajar con sistemas de
ecuaciones dependientes de parámetros, pero en ese caso hay que tener cuidado ,
pues el tipo de simplificación que, por ejemplo, efectúa el comando gaussjord no
permite resolver el problema teniendo en cuenta todos los posibles valores de los
parámetros, como se puede ver en el siguiente ejercicio-ejemplo:

Ejemplo 3

Encontrar los valores de a, b y c que hacen que el siguiente sistema de ecuaciones sea
incompatible:
> A:=matrix(3,5,[2,1,3,5,a,3,2,-1,4,b,3,1,10,11,c]);

> gaussjord(A);

> gausselim(A);

Como se puede ver, al emplear gaussjord, el sistema ha trabajado con las variables a, b
y c sin distinguir entre los posibles casos, de manera que los parámetros han
desaparecido (¿porqué?).

Sin embargo, en este caso, al emplear gausselim podemos extraer fácilmente los valores
de a, b y c que hacen el sistema incompatible (¿por qué?).

> #fin

Práctica 2

Método de Gauss y rango.


Determinantes
Objetivos de la sesión

Recordar algunas de las funciones de la librería linalg que se introdujeron en la práctica


1 e introducir otras nuevas necesarias para el desarrollo de esta práctica.
Afianzar en el alumno la comprensión de la base teórica del método de Gauss-Jordan,
las transformaciones y matrices elementales y sus diferentes aplicaciones mediante el
uso de Maple.

Utilizar las transformaciones elementales para desarrollar el concepto de determinante,


sus propiedades y sus aplicaciones al estudio de la dependencia e independencia lineal
de sistemas de vectores.

Relacionar el concepto de determinante con la idea de volumen.

> #Pulsa return

Tiempos

La duración de la práctica (incluida la evaluación) es de dos horas. La primera hora


(aproximadamente) se dedicará al desarrollo-estudio de los contenidos de los apartados
"Comandos de Maple necesarios para la realización de esta práctica" y "Lección",
donde se introducen y repasan los conceptos y se muestran los comandos de Maple
precisos para el desarrollo de la práctica. La segunda hora a la realización del test de
evaluación.

> #Pulsa return

Como se debe realizar la siguiente práctica

El presente guión seguido con las indicaciones y observaciones del profesor contiene las
instrucciones precisas para realizar con el ordenador ejercicios sobre los contenidos
presentados en las clases teóricas.

Lo deseable, para que queden afianzadas las ideas y las nociones básicas sobre la
sintaxis de Maple, es que se realicen prueba y nuevos ejemplos sobre la base de los
ejemplos planteados.

> #Pulsa return

Comandos de Maple necesarios para la realización de esta práctica

En esta primera parte de la práctica se describen, a través de ejemplos, algunos


comandos del paquete linalg útiles para la aplicación del método de Gauss que vamos a
exponer y se repasarán los comandos utilizados en la práctica 1. Así pues el alumno
deberá ejecutar dichos ejemplos y tecleará otros que le permitan comprender la
aplicación de dichos comandos.

Los siguientes son algunos comandos incorporados por Maple que pueden ser
necesarios para la realización de esta práctica (referida fundamentalmente al método de
Gauss) que están disponibles en la librería linalg:

stackmatrix augment addcol addrow mulcol mulrow delcols delrows

swapcol swaprow row col pivot linsolve gausselim gaussjord


equal rank transpose inverse innerprod crossprod %

with(combinat) permute det

Descripción de los comandos mencionados:

> restart:with(linalg):

Warning, new definition for norm

Warning, new definition for trace

OBSERVACIÓN: En la línea de input de comandos anterior hemos introducido el


símbolo ":" cuya acción, recordemos, es la misma del ";" pero no hace eco (es decir, no
se imprime nada como output aunque realiza la acción que le precede).

> A1:=matrix(3,3,[1,-2,5,0,0,Pi/4,7,8,9/5]);

> B1:=matrix(3,3,[0,0,3,-5,2,1,8,0,0]);

Para acceder al elemento (i,j) de una matriz C hay que escribir C [i,j]. Por ejemplo:

> B1[2,1];

Las funciones row(A,r1) , col(A,c1) devuelven la fila r1 y la columna c1 de A


respectivamente (nótese que col(A,c1) devuelve una matriz fila, no una matriz
columna):

> r2:=row(A1,2); c3:=col(B1,3);


El comando stackmatrix une dos matrices verticalmente:

> stackmatrix(A1,B1);

La función augment (como la función concat ) une dos matrices horizontalmente:

> augment(A1,B1);

> concat(A1,B1);

La función delcols(A,r..s) (delrows(A,r..s)) elimina las columnas (respectivamente


filas) r,r+1,...,s de la matriz A:

> delcols(augment(A1,B1),2..4);

> delrows(stackmatrix(A1,B1),3..3);
> #Pulsa return

Recordemos las funciones addrow y addcol , ya empleadas en la práctica anterior:

Llamadas a las funciones addrow y addcol:

addrow(A, r1, r2, m)

addcol(A, c1, c2, m)

Parámetros:

A - matriz

r1,r2,c1,c2 - enteros; índices de fila (columna)

m - expresión escalar (opcional. Por defecto m=1).

La llamada addrow(A,r1,r2,m) devuelve una copia de la matriz A en la cual la fila r2 ha


sido reemplazada por m*row(A,r1)+row(A,r2). La función addcol tiene un
comportamiento similar pero para columnas.

Recordemos los coeficientes de la matriz A1 anterior.

Nota: Según vimos, la acción del comando "evalm" es similar a la del comando "eval"
pero para matrices.

> evalm(A1);

> addcol(A1,1,2,-1);
> addrow(A1,2,3,-9);

Recordemos también las funciones mulcol y mulrow :

Llamadas a las funciones:

mulcol(A, c, expr)

mulrow(A, r, expr)

Parámetros:

A - matriz

r,c - enteros positivos

expr - expresión escalar

La llamada mulcol(A,c,expr) devuelve una matriz que tiene las mismas componentes
que la matriz A, pero con los elementos de la columna c-ésima multiplicados por la
expresión expr. La función mulrow(A,r,expr) tiene un comportamiento análogo:

> mulcol(A1,2,x);mulrow(B1,1,2/3);
La función equal determina si dos matrices son iguales:

> equal(A1,B1);

> Z:=A1: equal(A1,Z);

La función transpose traspone una matriz:

> C1 := matrix([[1, 0, 7], [-2, 0, 8], [5, 1, 9]]);

> C1:=transpose(A1);

> v1:=row(C1,3);

> v2:=col(A1,3);

> equal(v1,v2);
Recordemos las funciones swapcol y swaprow también empleadas en la primera
práctica:

Llamada a las funciones swapcol y swaprow:

swaprow(A, r1, r2)

swapcol(A, c1, c2)

Parámetros:

A - matriz

r1,r2,c1,c2 - naturales

La función swaprow(A,r1,r2) crea una nueva matriz a partir de la matriz A


intercambiando las filas r1 y r2. Análogamente swapcol(A,c1,c2) crea una nueva matriz
a partir de A intercambiando las columnas c1 y c2.

> swapcol(A1,1,2);

> swaprow(B1,3,1);

En esta práctica también vamos a utilizar la función pivot , ya empleada en la práctica


anterior:

Llamada a la función pivot:

pivot(A, i, j)

pivot(A, i, j, r..s)

Parámetros:

A - matriz

i,j - enteros positivos


r..s - rango de filas

La función pivot toma como entradas una matriz A y un par de enteros positivos i y j
que determinan el elemento A[i,j] de A. Este elemento debe ser distinto de cero,
produciéndose un error en caso contrario. La función devuelve una matriz del mismo
orden que A, resultado de aplicar transformaciones elementales de fila con el objeto de
obtener ceros en la columna j excepto, por supuesto, el elemento A[i,j].

La llamada pivot(A,i,j,r..s) tiene prácticamente la misma funcionalidad que pivot(A,i,j)


excepto que las transformaciones tan sólo afectan a las filas r, r+1,...,s:

> P1:=pivot(stackmatrix(A1,B1),1,1);

> P2:=pivot(swapcol(P1,2,3),2,2);

> pivot(P2,3,3,4..6);
Señalaremos también que la función linsolve permite resolver sistemas de ecuaciones
lineales. La sintaxis de esta función es:

"linsolve(A,b)" o también "linsolve(A,B)", donde A y B son matrices y b es un vector:

> A:=matrix(3,3,[2,1,1,2,0,1,1,1,1]);b:=matrix([[5],[1],[1]]);

> linsolve(A,b);

También es posible determinar la inversa de una matriz empleando la función linsolve.

En ese caso estaríamos resolviendo la ecuación matricial :

> Id:=matrix(3,3,[1,0,0,0,1,0,0,0,1]);

> linsolve(A,Id);
Veamos que la función inverse nos devuelve la misma matriz:

> inverse(A);

> equal(inverse(A),linsolve(A,Id));

El símbolo % permiten recuperar la última expresión evaluada, %% la penúltima, y así


sucesívamente.

Verifiquemos el resultado:

> multiply(A,%%);

Para finalizar, recordaremos cómo actúan los comandos gausselim y gaussjord ya


introducidos en la práctica anterior:

> gausselim(A);

> gaussjord(A);
La función rank(A) determina el rango de una matriz A.

> r1:=rank(A1);r2:=rank(B1);r3:=rank(stackmatrix(A1,B1));

Lección
> #Pulsa return

Introducción

Para comenzar, vamos a recordar en qué consiste el método de Gauss-Jordan para


resolver un sistema de ecuaciones lineales. Primero lo resolveremos empleando el
comando "linsolve" que tiene implementado Maple, y posteriormente iremos
desarrollando el método de Gauss paso a paso para mejorar su comprensión.
Consideremos el siguiente sistema de ecuaciones lineales:

En primer lugar lo resolvemos directamente:

> with(linalg):

Warning, new definition for norm

Warning, new definition for trace

> A:=matrix(3,3,[3,2,-1,1,-2,1,1,-1,1]);

> B:=matrix([[5],[3],[1]]);
> linsolve(A,B);

Ahora ya sabemos la solución. Esta solución la ha obtenido el sistema aplicando el


método de Gauss-Jordan que tiene implementado. Vamos a obtenerla usando el método
de Gauss-Jordan paso a paso según vimos en las clases teóricas:

> Am:=concat(A,B);

> Am:=pivot(Am,1,1);

> Am:=mulrow(Am,1,1/3);

> Am:=pivot(Am,2,2);
> Am:=mulrow(Am,2,-3/8);

> Am:=pivot(Am,3,3);

> Am:=mulrow(Am,3,2);

Como puede comprobarse, hemos obtenido la solución esperada.

> #Pulsa return

Las transformaciones y las matrices elementales

Estamos ya en condiciones de desarrollar nuevas aplicaciones de los métodos de


reducción de matrices basados en el uso de transformaciones elementales estudiados
en las clases teóricas.

Sea A una matriz mxn .

Las transformaciones elementales por filas y las matrices elementales


correspondientes son las siguientes:
Transformación elemental : sumar a la fila i de A un múltiplo de la fila j .

Matriz elemental de orden m : es la matriz que se obtiene aplicando la

transformación elemental anterior a la matriz identidad de orden m.

Por ejemplo:

-- -->

> #Pulsa return

Transformación elemental : multiplicar la fila i de A por un escalar no


nulo.

Matriz elemental de orden m : es la matriz que se obtiene aplicando la

transformación elemental anterior a la matriz identidad de orden m.

Por ejemplo:

-- -->

> #Pulsa return

Transformación elemental <--> : intercambiar la fila i de A con la fila j .

Matriz elemental de orden m : es la matriz que se obtiene aplicando la

transformación elemental anterior a la matriz identidad de orden m.


Por ejemplo:

-- <--> -->

> #Pulsa return

Las transformaciones elementales por columnas y las matrices


elementales correspondientes son las siguientes:

Transformación elemental : sumar a la columna i de A un múltiplo de la


columna j .

Matriz elemental de orden n : es la matriz que se obtiene aplicando la transformación

elemental anterior a la matriz identidad de orden n y es igual a la matriz elemental

( notar la posición de los índices ) .

Por ejemplo:

-- - ->

> #Pulsa return

Transformación elemental : multiplicar la columna i de A por un escalar


no nulo.

Matriz elemental de orden n : es la matriz que se obtiene aplicando la transformación

elemental anterior a la matriz identidad de orden n y es igual a la matriz elemental

Por ejemplo:
-- -->

> #Pulsa return

Transformación elemental <--> : intercambiar la columna i de A con la columna


j.

Matriz elemental de orden n : es la matriz que se obtiene aplicando la transformación

elemental anterior a la matriz identidad de orden n y es igual a la matriz elemental

Por ejemplo:

-- -->

> #Pulsa return

Lo fundamental es tener presente que, según vimos,

cada transformación elemental se corresponde con la operación de multiplicar por


una cierta matriz invertible (por la izquierda si es una transformación por filas y
por la derecha si es una transformación por columnas) :

dada una matriz A de orden , si realizando una transformación elemental por


filas sobre A obtenemos una matriz B , se verifica que existe una matriz P invertible de
orden m tal que

(Obsérvese que en este caso la matriz P multiplica a la matriz A por la izquierda).


Análogamente, si realizando una transformación elemental por columnas sobre A
obtenemos una matriz C , se verifica que existe una matriz invertible Q de orden n tal
que

(Obsérvese que en este caso la matriz Q multiplica a la matriz A por la derecha).

Veamos algunos ejemplos (recuérdese que para multiplicar una matriz A por una matriz
B se utiliza el comando A&*B):

> A := matrix(2,3,(i,j)->a(i,j));

> P[1](lambda) := matrix(2,2,[lambda, 0,0,1]);

Notar que es 2x2 y que

> Af := evalm(P[1](lambda)&*A);

Ahora, si definimos de dimensión 3,

> P[1](lambda) := matrix(3,3,[lambda, 0,0,0,1,0,0,0,1]);

> Ac := evalm(A&*P[1](lambda));

> #Pulsa return


Como se puede observar, según multipliquemos por la izquierda o por la derecha a la

matriz A por la matriz (de dimensión adecuada) realizamos una transformación


por filas o por columnas sobre A (respectivamente).

Ejercicio : Definir las matrices y , y realizar los productos

, , y , y observar cual es el
resultado.

>

>

>

Vamos a ver que es la matriz por la que hay que multiplicar a una matriz dada
por la izquierda para tener una acción del tipo "sumar a la fila i la fila j multiplicada por

":

> S[12](lambda) := matrix(2,2,[1, lambda, 0, 1]);

Notar que es de dimensión 2:

> Af := evalm(S[12](lambda)&*A);

Ahora, si definimos de dimensión 3

> S[21](lambda) := matrix(3,3,[1, 0,0,lambda,1, 0,0,0, 1]);

y multiplicamos por la derecha, se obtiene que

> Ac:=evalm(A&*S[21](lambda));
Como puede observarse, el resultado de multiplicar a la matriz A por la matriz

(de dimensión 2) por la izquierda coincide con la matriz que resulta al sumar a

la primera fila de A la segunda multiplicada por .

El resultado de multiplicar a la matriz A por la matriz (de dimensión 3) por la


derecha coincide con la matriz que resulta al sumar a la primera columna de A la

segunda multiplicada por .

Ejercicio : Definir las matrices (de dimensión adecuada) y ,y

realizar los productos , , y

, y observar cual es el resultado.

>

>

>

Finalmente, vamos a verificar que es la matriz por la que hay que multiplicar a una
matriz dada por la izquierda para tener una acción del tipo "intercambiar la fila i con la
fila j ":

> E[12]:= matrix(2,2,[0, 1, 1, 0]);

> Af:= evalm(E[12]&*A);

Ahora, si definimos de dimensión 3

> E[12]:= matrix(3,3,[0, 1,0,1,0,0,0,0, 1]);


y multiplicamos por la derecha, se obtiene que

> Ac:=evalm(A&*E[12]);

En resumen, dada una matriz A, si multiplicamos dicha matriz por la izquierda por una

matriz de la forma , o , el resultado de dicha multiplicación es


una transformación por filas sobre la matriz A.

Del mismo modo, si multiplicamos dicha matriz por la derecha por una matriz de la

forma , o , el resultado de dicha multiplicación es la


correspondiente transformación por columnas sobre la matriz A.

> #Pulsa return

Tabla resumen

> #Pulsa return

Transformación elemental Producto de matrices

Sumar a la fila i la j multiplicada por

Multiplicar la fila i por

Intercambiar la fila i con la fila j A

Sumar a la columna i la j multiplicada por

Multiplicar la columna i por

Intercambiar la columna i con la columna j A

Inversas de las transformaciones elementales


> #Pulsa return

Las matrices que corresponden a las transformaciones elementales son invertibles.

En el caso de las matrices de la forma , cuya acción consiste en multiplicar la

fila o columna i-ésima por , es fácil deducir que su inversa es la matriz .

Por ejemplo:

> P[1](lambda) := matrix(3,3,[lambda, 0, 0, 0, 1, 0, 0, 0, 1]);

> P[1](1/lambda):= matrix(3,3,[1/lambda, 0, 0, 0, 1, 0, 0, 0, 1]);

> evalm(P[1](lambda)&*P[1](1/lambda));

Veamos además qué sucede al hacer actuar estas transformaciones sobre la siguiente
matriz:

> A := matrix(3,3,(i,j)->a(i,j));

> Ac:=evalm(A&*P[1](lambda));
> evalm(Ac&*P[1](1/lambda));

Por otra parte la inversa de la matriz es la matriz .

Por ejemplo:

> S[13](lambda) := matrix(3,3,[1, 0, lambda, 0, 1, 0, 0, 0, 1]);

> S[13](-lambda) := matrix(3,3,[1, 0, -lambda, 0, 1, 0, 0, 0, 1]);

> evalm(S[13](-lambda)&*S[13](lambda));

Si ahora queremos verlo a partir de la actuación de estas matrices sobre la matriz


genérica A dada:

> Ac := evalm(A&*S[13](lambda));
> evalm(Ac&*S[13](-lambda));

Ejercicio: Determinar la matriz inversa de la matriz elemental .

>

>

> #Pulsa return

Rango y transformaciones elementales

Comenzaremos recordando algunas definiciones y resultados:

Definición: Si A es una matriz de orden mxn , se denomina rango de la matriz A a la

dimensión del subespacio de generado por el sistema formado por los " n "
vectores columna de la matriz A .

Al subespacio generado por los vectores columna de la matriz A se le denomina


subespacio columna de A.

El rango de una matriz es un mecanismo útil para determinar la dimensión de aquellos


subespacios vectoriales de los que conocemos un sistema generador y, entonces, para
verificar si este sistema es libre o ligado.

> #Pulsa return

Así por ejemplo, considerando el espacio vectorial (R) de los polinomios reales en
la variable x de grado menor o igual que 3, para determinar la dimensión del subespacio

escribimos las matrices de las coordenadas de

dichos vectores respecto de la base usual . Se obtiene el sistema


, con lo que la dimensión de H coincidirá con el rango de la

matriz .

> #Pulsa return

Veamos, pues, un método para obtener de una manera sencilla el rango de una matriz.

Definición: Se dice que una matriz de filas y columnas es gaussiana si sus

columnas , donde j varía en el conjunto {1,...,n}, satisfacen una de las condiciones


siguientes:

Existe perteneciente al conjunto {1,...,n} tal que (1, ) es distinto de cero, y

para todo k perteneciente al conjunto {j+1,...,n}, (1, ) =0.

En otras palabras, la segunda condición supone localizar un elemento (1, )


distinto de cero en la columna considerada y asegurarse de que todos los coeficientes
de la matriz situados en su misma fila y a su derecha son cero.

> #Pulsa return

Así por ejemplo, son matrices gaussianas


, , , .

> #Pulsa return

El interés de este tipo de matrices radica en que si una matriz es gaussiana, su rango
coincide con el número de columnas no nulas que posee.

Así por ejemplo,

rg( )=2 y rg( )=3.

> #Pulsa return

El método de Gauss para determinar el rango de una matriz consiste en lo


siguiente:

partiendo del hecho de que al realizar transformaciones elementales por columnas sobre
una matriz, el rango de la nueva matriz obtenida coincide con el rango de la matriz
original, el método consiste en realizar transformaciones elementales por columnas
sobre la matriz dada hasta obtener una matriz gaussiana , cuyo rango se determina de
manera inmediata.

El método de Gauss para determinar el rango de una matriz es especialmente útil para
calcular el rango de una matriz cuando no se dispone de la ayuda de un ordenador.

Si se quiere determinar, junto con el rango de una matriz, una base del subespacio
vectorial generado por las columnas de la matriz dada y sólo se dispone de lapiz y
papel, lo más sensato es utilizar el método de Gauss para determinar los rangos de las
matrices objeto de estudio. Maple lleva incorporada un comando que determina
automáticamente el rango de una matriz:

> A:=matrix(3,3,[1,1,1,1,1,1,1,1,1]);
> rank(A);

En todo caso, el comando "rank" no nos permite obtener una base del subespacio
columna de A.

NOTA IMPORTANTE: Si queremos obtener una base de H formada por vectores del
sistema generador dado, tenemos que aplicar el método de Gauss sin utilizar

transformaciones elementaless del tipo ( sin intercambiar columnas ) y elegir los


vectores columnas de la matriz inicial A que corresponden a las columnas distintas de
cero de la forma gaussiana de A.

Veamos cómo calcular el rango de la matriz anterior por el método de Gauss paso a
paso y obtener una base del subespacio columna de A,

> A:=matrix(3,3,[1,1,1,1,1,1,1,1,1]);

> A1:=addcol(A,1,2,-1);

> A2:=addcol(A1,1,3,-1);
La matriz A2 obtenida es gaussiana, por lo que su rango es 1, y obviamente el sistema

formado por el único vector columna es una base del subespacio columna de
la matriz original A considerada.

> #Pulsa return

Si ahora volvemos a considerar el subespacio

del espacio vectorial (R) de los polinomios de grado menor o igual que 3, y
además de obtener la dimensión de H queremos determinar una base de dicho
subespacio, obraremos como sigue:

en primer lugar consideraremos las coordenadas del sistema generador de H respecto de

la base usual obteniendo el sistema ,y

ahora aplicamos el método de Gauss a la matriz :

> A:=matrix(4,3,[2,1,5,1,-2,0,0,1,1,0,0,0]);

> A1:=addcol(A,1,2,2);
> A2:=addcol(A1,2,3,-1);

Esta matriz es gaussiana, por lo que el rango de la matriz A es 2. En consecuencia la

dimensión de H es también 2, y el sistema formado por los vectores


correspondientes a las columnas no nulas de A2 constituyen una base de H .

> #Pulsa return

Para finalizar este apartado, vamos a ver un método directo para determinar si un
cierto vector pertenece al subespacio vectorial generado por un sistema de vectores
dado, utilizando el comando rank.

Para ello, recordemos que si un vector pertenece al subespacio vectorial generado por
un sistema de vectores dado, dicho vector se puede obtener como combinación lineal de
los vectores de dicho sistema. Por tanto si consideramos la matriz de coordenadas del
sistema generador considerado respecto de una base fija del espacio en el que estemos
trabajando, el rango de dicha matriz no varía al añadir a la matriz anterior la columna
correspondiente a las coordenadas de dicho vector.

Así por ejemplo, fijada la base canónica de , para determinar si el vector (


) pertenece al subespacio vectorial generado por el sistema de vectores {(1,0,3),(4,3,2)}

hallaríamos el rango de la matriz , y veríamos si coincide con el rango de la

matriz .
Si coinciden ambos rangos, el vector pertenece al subespacio generado y en caso
contrario no.

> A:=matrix(3,2,[1,4,0,3,3,2]);

> rank(A);

> Am:=matrix(3,3,[1,4,3,0,3,4,3,2,2]);

> rank(Am);

Como puede verse, el vector ( ) no pertenece al subespacio generado por el


sistema de vectores {(1,0,3),(4,3,2)}.

Determinante

El concepto de determinante aparece de manera natural en varios contextos


matemáticos. Algunos ejemplos son el cálculo del jacobiano para integración en varias
variables, el cálculo vectorial, el cálculo de áreas y volúmenes, etc....

Vamos a ver como se pueden usar las propiedades del determinante para

calcular áreas de paralelogramos en y de paralelepípedos en ,

relacionar el método de Gauss-Jordan para una matriz cuadrada con el cálculo de su


determinante,

desarrollar técnicas para resolver sistemas de ecuaciones lineales con el mismo número
de ecuaciones que de incógnitas, es decir, cuya matriz asociada sea cuadrada.

> #Pulsa return


En esta primera sección vamos a introducir (o recordar) el concepto de determinante de
una matriz cuadrada.

El grupo simétrico S(n)

Antes de poder definir el determinante de una matriz cuadrada y estudiar sus


aplicaciones necesitamos los conceptos de permutación y signo de una permutación que
vamos a ilustrar a continuación.

S(n) es el conjunto de las permutaciones (o simetrías) de un conjunto con n


elementos , que podemos representar como el conjunto de los primeros n números

naturales, = {1,2,3,...,n}.

> #Pulsa return

Recordamos que S(n) consiste de todas las funciones biyectivas de en y


que

- la composición de dos permutaciones es una permutación

- la composición de permutaciones es asociativa

- la función identidad, Id(n)=n para todo n, es el elemento neutro respecto de la


composición de permutaciones

- toda permutación tiene una permutación inversa

Por tanto, S(n) tiene estructura de grupo no conmutativo .

> #Pulsa return

Es usual representar una permutación en S(n) por medio de una matriz de dos filas y
n columnas, así que, por ejemplo,

es la permutación definida en por

(1) =6, (2) =2, (3) =4, (4) =3, (5) =5, (6) =1.

Para trabajar con el grupo S(n) en Maple necesitamos llamar a la librería combinat

> restart;with(linalg):with(combinat):matrix(1,6,[6,2,4,3,5,1]);
Warning, new definition for norm

Warning, new definition for trace

Warning, new definition for Chi

Warning, new definition for fibonacci

El comando permute(n) devuelve todas las permutaciones en S(n), escritas utilizando


sólo las segundas filas de las matrices anteriores como listas ordenadas.

Ejemplo: Sea S(3) el grupo de las permutaciones de un conjunto de 3 elementos:

> permute(3);

Los elementos de S(3) se pueden interpretar como simetrías de un triángulo equilátero


cuyo vértices estén marcados con 1, 2 y 3:

>
with(plottools):with(plots):t1:=textplot([0.1,0.05,`1`],align={ABOVE,RIGHT}):t2:
=textplot([1/2,sqrt(3/4)-0.1,`2`],align={BELOW}):t3:=textplot([1-
0.1,0.05,`3`],align={ABOVE,LEFT}):display({t1,t2,t3,polygon([[0,0], [1,0],
[1/2,sqrt(3/4)]], color=red)},scaling=constrained);

Por ejemplo,

- (1 2 3) es la identidad,

- (1 3 2) es la simetría respecto de la bisectriz del ángulo en 1:


> t1:=textplot([0.1,0.05,`1`],align={ABOVE,RIGHT}):t2:=textplot([1/2,sqrt(3/4)-
0.1,`3`],align={BELOW}):t3:=textplot([1-
0.1,0.05,`2`],align={ABOVE,LEFT}):r:=plot((sqrt(3)/3)*x,x=0..1.2):display({r,t1,t2,
t3,polygon([[0,0], [1,0], [1/2,sqrt(3/4)]], color=green)},scaling=constrained);

- (2 3 1) es la rotación que lleva 1 en 2, 2 en 3 y 3 en 1:

> t1:=textplot([0.1,0.05,`3`],align={ABOVE,RIGHT}):t2:=textplot([1/2,sqrt(3/4)-
0.1,`1`],align={BELOW}):t3:=textplot([1-
0.1,0.05,`2`],align={ABOVE,LEFT}):display({t1,t2,t3,polygon([[0,0], [1,0],
[1/2,sqrt(3/4)]], color=yellow)},scaling=constrained);

Ejercicio: determina el efecto geométrico de aplicar las permutaciones (2 1 3), (3 1 2) y


(3 2 1) al triángulo equilátero rojo.

> #Pulsa return


Por definición, el resultado de aplicar una permutación al conjunto ordenado (1,2,3,

..., n) es lo de obtener la nueva ordenación ( (1), (2), (3), (4), (5), (6))
de estos n elementos.

Una transposición es una permutación que intercambia el orden de sólo dos elementos
de la lista (1,2,3, ..., n).

Por ejemplo

es la trasposición que intercambia el 1 con el 6, que se indicará como (1 6), omitiendo


los elementos cuya posición no ha cambiato.

Una inversión es una transposición que intercambia dos elementos consecutivos de la


lista (1,2,3, ..., n).

Por ejemplo

es una inversión que se indicará como (4 5).

> #Pulsa return

Dada una permutación f de n elementos, si queremos volver a la ordenación original


(1,2,3, ..., n) podemos realizar un número adecuado de inversiones entre los elementos

de la lista ( (1), (2), (3), (4), (5), (6)), como se hace en un algoritmo
de ordenación burbuja.

Ejemplo: para reordenar los términos de la lista

( (1) =6, (2) =2, (3) =4, (4) =3, (5) =5, (6) =1) =(6,2,4,3,5,1)

se pueden aplicar, sucesivamente, las siguientes inversiones:

(1,2) que produce la lista (2,6,4,3,5,1), (2 3) que produce la lista (2,4,6,3,5,1), (3 4) que
produce la lista (2,4,3,6,5,1), (4 5) que produce la lista (2,4,3,5,6,1), (5 6) que produce
la lista (2,4,3,5,1,6), (2 3) que produce la lista (2,3,4,5,1,6), (4 5) que produce la lista
(2,3,4,1,5,6), (3 4) que produce la lista (2,3,1,4,5,6), (2 3) que produce la lista
(2,1,3,4,5,6) y, finalmente, (1 2) que produce la lista (1,2,3,4,5,6).
> #Pulsa return

Si i es el número de inversiones necesarias para volver al orden (1,2,3, ..., n), es


el signo (o signatura) de la permutación f, sign( f ). Si i es par (es decir, el signo de f
es1) la permutación se dice par y si i es impar (es decir, el signo de f es -1) la
permutación se dice impar. (Se puede demostar que la paridad de i no depende de las

particulares inversiones empleadas para reordenar los elementos de la lista ( (1),

(2), (3), (4), (5), (6)).)

En el último ejemplo hemos utilizado 10 inversiones y, por tanto, el signo de f es 1 y f


es par.

La definición de signo de una permutación se utilizará en el próximo párrafo para


definir el determinante de una matriz cuadrada de dimensión n arbitraria.

> #Pulsa return

Definición y primeros métodos para calcular el determinante de una matriz

Definición: El determinante de una matriz cuadrada A=( ) de orden n es el escalar

det(A)= ... ,

donde el sumatorio contiene n! sumandos, uno para cada permutación de n


elementos.

Cada sumando es el producto de n factores y el signo de esto producto está determinado


por el signo de la permutación que lo define.

> #Pulsa return

Ejemplos:

El determinate de la matriz 2x2

> A:=matrix(2,2,[[1,2],[-4,1]]);

se calcula utilizando la 2 (=2!) permutaciones


> permute(2);

y la formula anterior

> determinante(A):=1*A[1,1]*A[2,2]-1*A[1,2]*A[2,1];

> det(A);

El determinante de la matriz 3x3

> B:=matrix(3,3,[[1,2,3],[4,3,6],[0,1,2]]);

se calcula utilizando la 6 (=3!) permutaciones

> permute(3);

> determinante(B):=1*B[1,1]*B[2,2]*B[3,3]-1*B[1,1]*B[2,3]*B[3,2]-
1*B[1,2]*B[2,1]*B[3,3]+1*B[1,2]*B[2,3]*B[3,1]+1*B[1,3]*B[2,1]*B[3,2]-
1*B[1,3]*B[2,2]*B[3,1];

> det(B);

Dada una matriz cuadrada A= ( ) de dimensión n, existe una fómula para hallar su

determinante que utiliza los determinantes de las submatrices de A que se


obtienen eliminando la fila i y la columna j de la matriz A.
Al determinante de , det( ), se le llama menor del elemento y el

escalar det( ) es el adjunto del elemento . Con estas


notaciones, la fórmula de Laplace para el cálculo del determinante de A

a partir de la fila i de A es

y a partir de la columna j de A es

> #Pulsa return

Es posible demostrar que los valores de las dos expressiones anteriores no dependen de
la particular fila o columna elegida y que son iguales al valor del determinante de la
matriz A.

Estas últimas fórmulas nos dan una definición recursiva del determinante: si somos
capaces de calcular el determinante de matrices 2x2, podemos calcular el determinante
de una matriz cuadrada de orden n simplemente aplicando la fórmula de Laplace
iterativamente hasta que las submatrices de las cuales tenemos que calcular el
determinante tengan dimensión 2.

Ejemplos:

Apliquemos la fórmula de Laplace a la matriz 2x2 definida en los ejemplos anteriores

> restart:with(linalg):
A:=matrix(2,2,[[1,2],[-4,1]]);

Warning, new definition for norm

Warning, new definition for trace

utilizando la primera fila


> dim(A):=2;i:=1;for k from 1 to dim(A) do
M[i,k]:=delcols(delrows(A,i..i),k..k);od;
determinante(A):=add((-1)^(i+j)*A[i,j]*det(M[i,j]),j = 1 .. dim(A));

o la segunda columna

> dim(A):=2;j:=2;for k from 1 to dim(A) do


M[k,j]:=delcols(delrows(A,k..k),j..j);od;
determinante(A):=add((-1)^(i+j)*A[i,j]*det(M[i,j]),i = 1 .. dim(A));

Para la matriz 3x3 de los ejemplos anteriores

> B:=matrix(3,3,[[1,2,3],[4,3,6],[0,1,2]]);

la fórmula de Laplace para la primera fila es

> dim(B):=3; i:=1;for k from 1 to dim(B) do


M[i,k]:=delcols(delrows(B,i..i),k..k);od;
determinante(B):=add((-1)^(i+j)*B[i,j]*det(M[i,j]),j = 1 .. dim(B));
y para la tercera columna

> dim(B):=3;j:=3;for k from 1 to dim(B) do


M[k,j]:=delcols(delrows(B,k..k),j..j);od;
determinante(B):=add((-1)^(i+j)*B[i,j]*det(M[i,j]),i = 1 .. dim(B));

> #Pulsa return

El determinante tiene las siguientes propiedades que utilizaremos a continuación y en


los ejercicios:

Si A y B son matrices invertible, det(AB)=det(A)det(B). Por tanto el determinante de

una matriz invertible es distinto de cero y det( )= , siendo siempre

det( )=1.
El determinante de una matriz triangular superior es igual al producto de los elementos
de la diagonal.

El determinante de una matriz es igual al determinante de su traspuesta .

> #Pulsa return

Si A es una matriz invertible, su matriz inversa es

= ,

donde es la matriz cuadrada de la misma dimensión que A


cuyos coeficientes son los elementos adjuntos de los elementos de A.

Vale la Regla de Cramer para resolver un sistema de ecuaciones lineales AX=B con
matriz asociada A nxn invertible, que, por tanto, es compatible determinado. La única
solución del sistema es el vector de coordenadas

= ,

donde es la matriz que se obtiene al sustituir la columna i de A por la matriz


columna B, para todo i de 1 hasta n.

> #Pulsa return

Determinantes, trasformaciones elementales, sistemas libres y volúmenes

En este apartado vamos a estudiar un método para calcular el determinante de una


matriz cuadrada por medio de transformaciones elementales, sin tener que recurrir a su
definición o a la fórmula de Laplace.

Además veremos que el concepto de determinante se puede pensar como una


generalización del concepto de volumen.

> #Pulsa return

Dada una matriz cuadrada nxn A, el siguiente teorema nos dice como obtener el
determinante de la matriz A' obtenida como resultado de aplicar una transformación
elemental por filas (por columnas) sobre la matriz A:
Teorema

Sea A una matriz nxn. Entonces

1) Si A' es la matriz que se obtiene al multiplicar una fila de A por un escalar ,

det(A')= det(A),

2) Si A' es la matriz que se obtiene al añadir a una fila de A un multiplo escalar de otra
fila, det(A')=det(A),

3) Si A' es la matriz que se obtiene al intercambiar dos filas de A, det(A')= -det(A).

4) Si A' es la matriz que se obtiene al multiplicar una columna de A por un escalar ,

det(A')= det(A),

5) Si A' es la matriz que se obtiene al añadir a una columna de A un multiplo escalar de


otra columna, det(A')=det(A),

6) Si A' es la matriz que se obtiene al intercambiar dos columnas de A, det(A')= -det(A).

Siendo A' = EA y det(A') =det(E)det(A) en los primeros tres casos y siendo A' = AE y
det(A') =det(A)det(E) en los últimos tres casos (con E una matriz elemental), basta con
verificar el teorema para matrices elementales.

Sea Id la matriz identidad de dimensión n:

> Id:=n->matrix(n,n,(k,r)->if k=r then 1 else 0; fi);

La matriz elemental tiene determinante igual a = det( Id ):

> n:=6;i:=4;lambda:=-2;P(i,lambda):=mulrow(Id(n),i,lambda);
> det(%);

tiene determinante igual a 1 = det( Id ):

> n:=6;i:=4;j:=6;lambda:=-2;S(i,j,lambda):=addrow(Id(n),i,j,lambda);

> det(%);

tiene determinante igual a -1=-det( Id ):

> n:=6;i:=4;j:=6;E(i,j):=swaprow(Id(n),i,j);
> det(%);

Cálculo del valor del determinante por medio de transformaciones elementales:

A partir del hecho de que el determinante de cualquier matriz triangular es igual al


producto de los elementos de su diagonal principal y de los resultados del teorema
anterior, podemos desarrollar un método que nos permite calcular el valor del
determinante de cualquier matriz A cuadrada de orden n utilizando transformaciones
elementales.

> #Pulsa return

La idea es realizar transformaciones elementales por filas sobre A para obtener una
matriz triangular cuyo determinante sabemos calcular. Así por ejemplo, si B es la matriz
triangular obtenida al realizar sobre la matriz A en primer lugar la transformación

consistente en sumar a la fila i la j multiplicada por y en segundo lugar

multiplicando la fila k por , resulta que:

B=

det( B )=det( ( ))=det( )det( )= det(

)det( A )= *1*det(A)= det(A),

de donde det(A) = det(B).

Nota : El método anterior también funcionaría realizando transformaciones sólo por


columnas o también por filas y por columnas pero teniendo cuidado con el lado
(izquierda o derecha) por el que hay que multiplicar por la correspondiente matriz
elemental.

Observación importante: Teniendo en cuenta que det( )=1, si la matriz


triangular B se obtiene a partir de la matriz A realizando únicamente transformaciones

del tipo "sumar a la fila i la fila j multiplicada por ", de las propiedades vistas resulta
que det( A )=det( B ).

Ejemplos:

> T:=matrix(5,5,[1,3,3,3,6,0,1,2,3,4,0,0,-1,-8,-3,0,0,0,1,2,0,0,0,0,4]);

> det(T);

Como se puede observar, el valor del determinante la matriz anterior (que es triangular)
es igual al producto de los elementos de su diagonal principal.

> A:=matrix(4,4,[1,2,3,1,0,4,1,1,2,1,0,1,1,2,1,0]);

> A1:=addrow(A,1,3,-2);

> A2:=addrow(A1,1,4,-1);
> A3:=addrow(A2,2,3,3/4);

> A4:=addrow(A3,3,4,2*(-4/21));

Como puede verse, el producto de los elementos de la diagonal principal la matriz A4 es


19 (y por consiguiente el valor del determinante de A4 es 19). Teniendo en cuenta que
todas las transformaciones elementales por filas realizadas han sido del tipo "sumar a la

fila i la j multiplicada por ", resulta que det(A) debe coincidir con det(A4).
Comprobémoslo:

> det(A);

Determinantes, sistemas libres y volúmenes

Comenzaremos dibujando algunos paralelogramos en y observando cómo varía


dicho "volumen bidimensional" al modificar el sistema de vectores que determinan
dicho paralelogramo.

Comenzaremos con el sistema de vectores {(1,0),(0,1)}:


> with(plottools):
plots[display](polygon([[0,0], [1,0], [1,1], [0,1]]), color=red,scaling=constrained);

> #Pulsa return

Es obvio que el área del paralelogramo anterior es igual a 1= det( ).

Si ahora multiplicamos uno de sus lados por 2, o por cualquier otro número, el valor del
área aparece multiplicada por dicha cantidad:

> with(plottools):
plots[display](polygon([[0,0], [2,0], [2,1], [0,1]]), color=green,scaling=constrained);
Como se puede obtener (y observar), el área encerrada en este caso por los vectores
{(2,0),(0,1)}es

det( )=2.

> #Pulsa return

Por otra parte, recordando la "regla del paralelogramo" que utilizábamos para sumar
vectores, se puede demostrar, utilizando argumentos de geometría elemental que, siendo

vectores de u y v , el área del paralelogramo definido por los vectores yv


es igual al área del paralelogramo de finido por los vectores u y v .

Veámoslo de modo gráfico en el siguiente dibujo, en el que u =(1,0), v =(0,1).

La idea es comprobar gráficamente que el área del rectángulo de borde rojo coincide
con el área del paralelogramo de borde azul:

> with(plottools):
l := line([0,0], [1,1], color=blue, linestyle=1):l3 := line([0,0], [0,1], color=red,
linestyle=1):
l4 := line([1,0], [1,1], color=red, linestyle=1):
l5 := line([1,1], [0,1], color=red, linestyle=1):
l1 := line([1,0], [2,1], color=blue,linestyle=1):l2:= line([1,1], [2,1],
color=blue,linestyle=1):plots[display](l,l1,l2,l3,l4,l5,scaling=constrained);

Hay que observar que el orden en el que consideramos los vectores determina un
"sentido de recorrido" del borde del paralelogramo considerado. Por ejemplo,
consideremos el sistema {(1,0),(0,1)} y hallemos el área del rectángulo determinado por
este sistema calculando el siguiente determinante:
> with(linalg):

> A:=array(1..2,1..2,[[1,0],[0,1]]);

> det(A);

Si ahora cambiamos el sentido de recorrido del perímetro del paralelogramo anterior,


i.e., si consideramos el paralelogramo determinado por el sistema {(0,1),(1,0)} y

hallamos el área correspondiente calculando el valor del determinante det(


), vamos a obtener un cambio de signo en el valor obtenido:

> with(linalg):A:=array(1..2,1..2,[[0,1],[1,0]]);

> det(A);

Si lo que pretendemos es hallar el valor del área, deberemos tomar el valor absoluto del

determinante, pues el determinante en el caso de dos vectores es un "área con


signo", en el que el signo depende del orden considerado de los vectores que determinan
el área. Si ahora queremos determinar el área encerrada por el sistema {(1,1),(-1,2)},
será suficiente con calcular el valor del siguiente determinante:

> A:=matrix(2,2,[1,-1,1,2]);

> det(A);
Obviamente, el área encerrada por un sistema de dos vectores de es cero si y solo
si dichos vectores son proporcionales, o lo que es lo mismo, el sistema que forman es
ligado.

En las clases teóricas vimos que en se pueden definir el producto vectorial de dos
vectores, crossprod en Maple,

> restart:with(linalg):

Warning, new definition for norm

Warning, new definition for trace

> u := vector([u1,u2,u3]);

> v:= vector([v1,v2,v3]);

> crossprod(u,v);

donde las coordenadas del vector resultante son los adjuntos ,- y

de los elementos e1 , e2 y e3 de la matriz simbólica

> PV:=matrix(3,3,[[e1,e2,e3],[u1,u2,u3],[v1,v2,v3]]);

> M[1,1]:=det(delcols(delrows(PV,1..1),1..1));

> M[1,2]:=det(delcols(delrows(PV,1..1),2..2));
> M[1,3]:=det(delcols(delrows(PV,1..1),3..3));

y también definimos el producto mixto de tres vectores (el comando innerprod


devuelve el producto escalar)

> w:=vector([w1,w2,w3]);

> innerprod(u,crossprod(v,w));

donde el escalar resultante es el determinante de la matriz cuyas filas son las


coordenadas de los tres vectores:

> PM:=matrix(3,3,[[u1,v1,w1],[u2,v2,w2],[u3,v3,w3]]);

> det(PM);

> det(PM)-innerprod(u,crossprod(v,w));

La norma del producto vectorial de dos vectores coincide con el área del paralelogramo

en determinado por ellos y el valor absoluto del producto mixto es el volumen del
paralelepípedo individuado por los tres vectores.

Ejemplo: Dados los vectores

> u:=vector([1,2,1]);v:=vector([-1,1,0]);w:=vector([-2,1,7]);
el paralelepípedo determinado por u , v y w es

> with(plottools):
with(plots):
t:=textplot3d([[1,2,1,`u`],[-1,1,0,`v`],[-2,1,7,`w`]],color=black,font=[TIMES, BOLD,
20],align=LEFT):
p1:=polygon([[0,0,0],[-1,1,0],[0, 3, 1], [1,2,1]],color=green,scaling=constrained):
p2:=polygon([[-2,1,7],[-3,2,7],[-2, 4, 8], [-1,3,8]],color=green,scaling=constrained):
p3:=polygon([[0,0,0],[-1,1,0],[-3, 2, 7],[-2,1,7] ],color=blue,scaling=constrained):
p4:=polygon([[1,2,1],[0,3,1],[-2, 4, 8],[-1,3,8] ],color=blue,scaling=constrained):
p5:=polygon([[0,0,0],[1,2,1],[-1, 3, 8],[-2,1,7] ],color=red,scaling=constrained):
p6:=polygon([[-1,1,0],[0,3,1],[-2, 4, 8],[-3,2,7] ],color=red,scaling=constrained):
plots[display](p1,p2,p3,p4,p5,p6,t,axes=normal);

El área del paralelogramo azul es la norma del producto vectorial de v con w :

> norm(crossprod(v,w));

El volumen del paralelepípedo es el valor absoluto del producto mixto de u , v y w :

> abs(innerprod(u,crossprod(v,w)));

Todo lo anterior se puede generalizar a conjuntos de vectores en , 5 vectores en

, etc.: dados vectores en , y aunque no podemos dibujarlo, definimos el


paralelepípedo generalizado generado por dichos vectores como el conjunto de
combinaciones lineales de dichos vectores con coeficientes entre 0 y 1 (es decir, lo

definimos de la misma forma que en y ). Para no disponemos de un


concepto intuitivo de volumen, pero sí conocemos las propiedades que queremos que

dicho concepto verifique (las extrapolamos del concepto de area en y de volumen

en , teniendo en mente que el "volumen" debe ser una medida del tamaño de un
paralelepípedo):

1.- .

2.- .

3.- para cualquier permutación .

4.- , donde son los vectores de la base canónica.

Estas propiedades son verificadas por el valor absoluto del determinante, como se
deduce de nuestra discusión sobre el comportamiento de éste con respecto a

transformaciones elementales, cualquiera que sea . Además para , el valor


absoluto del determinante de una matriz coincide con el volumen del paralelepípedo (o

área del paralelogramo, en el caso ) formado por los vectores columna de dicha
matriz. Por tanto es razonable dar la siguiente definición:

Se define el volumen de un paralelepípedo generado por vectores , ...,

en , como el valor absoluto del determinante de la matriz cuyas columnas

son las coordenadas de las vectores , ..., respecto de la base canónica.

Por tanto, en el caso de 3 vectores de el determinante representa un "volumen


orientado" (si se quiere obtener el volumen, basta con considerar el valor absoluto del

determinante), y en el caso de 4 vectores de , 5 vectores de , etc., un


"volumen orientado generalizado".
> #Pulsa return

Así pues, el sistema {u,v,w}de vectores de es libre si el determinante de la matriz

que tiene por columnas sus coordenadas respecto de la base canónica de de es


distinto de cero y es ligado si el volumen es cero, es decir, si el determinante anterior es
0. Por ejemplo, si queremos determinar si el sistema {(1,-1,-2), (2,1,1),(1,0,7)} es libre o
ligado, bastará con calcular el determinante de la siguiente matriz:

> A:=matrix(3,3,[1,2,1,-1,1,0,-2,1,7]);

> det(A);

Esto mismo es obviamente válido para sistemas de 4 vectores de , sistemas de 5

vectores de , etc., ya que

dada una matriz cuadrada A de dimensión arbitraria, los vectores fila (columna) forman
un sistema libre (es decir, el rango de A es igual a su dimensión) si, aplicando el método
de eliminación gaussiana, la matriz escalonada reducida A' que se obtiene no contiene
filas de ceros.

Siendo det(A) un multiplo de det(A'), det(A)=0 sólo si det(A')=0. Pero det(A')=1.

Se sigue que

A es invertible si y sólo si det(A) es distinto de 0.

> #fin

También podría gustarte