Algebra Python
Algebra Python
30 de julio de 2014
A Gabriel, mi hijo amado. El
ángel que envió Dios del cielo
para salvarme de la oscuridad.
4
Prefacio
El Álgebra Lineal es una de los espacios académicos que más relevancia tiene en las
matemáticas actuales. Muchos de los problemas que se presentan en áreas aplicadas
y teóricos, conllevan algún tipo de proceso, en que el Álgebra Lineal tiene un papel
preponderante. La solución de Sistemas de ecuaciones lineas, los valores y vectores propios,
y las transformaciones lineales, parecen temas muy ajenos a nuestra realidad; pero hoy en
día, subyacen ocultos en una gran cantidad de aplicaciones, desde las redes de celulares,
hasta los vídeo juegos. En verdad, le debemos muchísimo al Álgebra lineal, gracias a ella
tenemos muchas de las bondades tecnológicas actuales.
Nunca pensamos en las matemáticas que aparecen bajo los productos básicos que usamos
a diario. En nuestros hogares, encendemos la televisión y no tenemos en cuenta que la
pantalla del televisor, es en realidad una matriz de puntos; que a su vez, es controlada por
un software, que alguien, en alguna parte implemento, después de incontables horas de
depuración progresiva, hasta obtener el software que usted usa, cuando cambia el canal
con el control remoto. Tampoco nos detenemos a pensar, ¿cómo saber que tipo de onda
usar para que el control remoto manipule el televisor? La verdad, pocas personas saben
la cantidad de matemáticas bajo su teléfono celular, de su computador y de muchos otros
artefactos presentes en su hogar.
Este texto tiene la intensión, de reunir estas dos ideas; por una parte, recoge los primeros
conceptos en el estudio del Álgebra lineal, desde el concepto de matriz y vector, hasta los
valores y vectores propios. De otro lado, utiliza la metodología de la manipulación de un
lenguaje de programación, para establecer un vínculo entre los conceptos abstractos de
Álgebra lineal y el aprendizaje de los mismos.
Es multi plataforma, Python esta diseñado para correr en: Unix, Solaris, Linux,
OS/2, MacOS y Windows.
Tiene una sintaxis muy simple y clara: algunos usuarios manifiestan que programar
en Python es como programar en pseudocódigo; con pocas palabras reservadas y en
algunos casos, apegadas a los conceptos matemáticos que se implementen en él.
Como hemos visto, Python es el lenguaje ideal para que un estudiante aprenda a
programar. Pero, para implementar rutinas que tengan que ver con Álgebra lineal
7
necesitamos una librería especial llamada SciPy, que en realidad se compone de las
librerías SciPy, Numpy y Mathplolib2 .
SciPy: Librería con rutinas para ciencias en general, entre ellas: Optimización,
integración, interpolación, procesamiento de señales, Ecuaciones diferenciales
ordinarias, entre otras.
El paquete Scipy, es ideal para el manejo rápido de rutinas en álgebra lineal; razón por
la cual, lo escogí como el paquete principal para elaborar las rutinas que presento en este
texto.
Con este libro, pretendo hacer una introducción al Álgebra lineal, abordando los temas
que están presenten en el microcurrículo del programa de Licenciatura en Matemáticas
y de otras carreras como Ingeniería de sistemas, Ingeniería Civil, Electrónica, etc
de la Universidad del Quindío. Entre los temas a tratar están: Matrices y vectores,
Factorización de matrices, Solución de sistemas de ecuaciones lineales, Determinantes,
Espacios vectoriales, vectores, transformaciones lineales y Valores y vectores propios.
Este texto, fue concebido desde un punto de vista práctico, como complemento del libro
“Introducción al Álgebra Lineal ”[11] , que escribí en colaboración con los docentes Liliana
Ospina y Adrian Alonso, docentes de la Universidad del Quindío. Razón por la cual, no
incluyo las demostraciones de los teoremas, sin embargo, estos se pueden encontrar en
[11, 18, 19, 13, 24, 20, 15]; en algunas ocasiones, propongo dichas demostraciones como
ejercicios.
Por otra parte, el libro trae diferentes ejemplos de los temas tratados; así como los
algoritmos4, tanto en su implementación como en su ejecución; es por eso que obtenemos
un cuadro donde aparece el código fuente del scrip y otro donde aparece el programa
cuando se ejecuta. Aunque Python y ScyPy traen algunas rutinas pre programadas,
(como por ejemplo la inversa de una matriz), por lo general, muestro como se podrían
implementar dichas subrutinas.
Como docente de Matemáticas, siempre espero que este trabajo sirva a todos aquellos que
están interesados en el Álgebra lineal y en la programación de computadores. Si usted
como usuario de este texto, encuentra algún error o tiene alguna sugerencia, no dude
en comunicármela; siempre tendré en cuenta todas las inquietudes y las incluiré en las
futuras actualizaciones del libro, el cual, estará disponible en la web con una licencia CC
(creative commons)5 .
Siempre he estado de acuerdo con las políticas de software libre, razón por la cual,
aprovecho para promover y recomendar esta práctica, en estudiantes y docentes de
matemáticas. Este texto fue diseñado enteramente en LATEX versión Texlive6 , usando
como editor LYX 2.17 , con la ayuda de los paquetes gráficos PSTricks8 , Pgfplots9 y el
software LaTexDraw10. Para los Algoritmos uso Python versión 2.7.711 y las librerías
NumPy versión 1.6.1, SciPy versión 0.9.0 y Matplotlib versión 1.1.1rc, además del editor
Spyder12 2.1.9 para la implementación del código. En cuanto a software externo y de
apoyo, utilicé Scilab13 versión 5.3 y Geogebra 4.41214 . Todo compilado en Linux Ubuntu15
12.04.3 LTS (Precise Pangolin).
4 Todos los programas hechos en Python son llamados Algoritmos, debido a que en lo posible, se hacen
de la forma más general, sin usar “trucos” raros de programación. Siempre procuro que el estudiante tenga
una explicación de dichos algoritmos al final de cada uno de ellos.
5 Para más información ver [Link]
6 [Link]
7 [Link]
8 [Link]
9 [Link]
10 [Link]
11 [Link]
12 [Link]
13 [Link]
14 [Link]
15 [Link]
Índice general
1. Matrices y vectores 15
1.1. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.1.1. Vectores fila y columna . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1.2. Manipulación de arreglos y matrices . . . . . . . . . . . . . . . . . 25
1.2. Solución de sistemas de ecuaciones lineales . . . . . . . . . . . . . . . . . . 28
1.2.1. Operaciones elementales por filas o renglones . . . . . . . . . . . . 29
1.2.2. Solución de un sistema de ecuaciones lineales . . . . . . . . . . . . 34
1.3. Operaciones entre matrices . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.3.1. Suma de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.3.2. Multiplicación por escalar . . . . . . . . . . . . . . . . . . . . . . 44
1.3.3. Diferencia entre matrices . . . . . . . . . . . . . . . . . . . . . . . 46
1.3.4. Multiplicación de matrices y vectores . . . . . . . . . . . . . . . . . 50
1.3.5. Producto escalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
1.3.6. Multiplicación de matrices . . . . . . . . . . . . . . . . . . . . . . 53
[Link]. Ley Asociativa en el producto de matrices . . . . . . . . . 55
[Link]. Ley distributiva de la multiplicación de matrices . . . . . 55
1.4. La transpuesta de una matriz . . . . . . . . . . . . . . . . . . . . . . . . . 59
1.4.1. Propiedades de la matriz transpuesta . . . . . . . . . . . . . . . . 60
1.5. La inversa de una matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
1.5.1. ¿Cómo hallar la inversa de una matriz? . . . . . . . . . . . . . . . 67
1.6. Sistemas de ecuaciones lineales y la inversa de una matriz . . . . . . . . . 74
2. Factorización de matrices 79
2.1. Matrices elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
2.2. Factorización A = LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
2.3. Factorización P A = LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
2.4. Factorización QR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
2.5. Factorización de Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
9
10 ÍNDICE GENERAL
4. Determinantes 169
4.1. Definición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
4.2. Determinante de matrices 2 × 2 . . . . . . . . . . . . . . . . . . . . . . . . 169
4.3. Determinante de matrices 3 × 3 . . . . . . . . . . . . . . . . . . . . . . . . 170
4.4. Determinantes de matrices de tamaño n × n . . . . . . . . . . . . . . . . 171
4.5. Propiedades de los determinantes . . . . . . . . . . . . . . . . . . . . . . 178
4.6. Determinante de matrices especiales . . . . . . . . . . . . . . . . . . . . . 182
4.6.1. Determinante de matrices elementales . . . . . . . . . . . . . . . . 186
4.7. La Inversa, el Determinante y la Adjunta de una matriz . . . . . . . . . . 189
4.8. La factorización de matrices en el cálculo del determinante . . . . . . . . . 194
4.9. Regla de Cramer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
13
14 ÍNDICE DE FIGURAS
6.5. El triángulo ABC y las reflexiones sobre y a lo largo de la recta y=x . . 313
6.6. Rotación en el plano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
π
6.7. El triángulo ABC rotado . . . . . . . . . . . . . . . . . . . . . . . . . 317
3
6.8. Traslación de un punto en el plano . . . . . . . . . . . . . . . . . . . . . . 320
6.9. Traslación del triángulo ABC con h = 2 y k = −3 . . . . . . . . . . . . . 321
6.10. Escalado de un punto en el plano . . . . . . . . . . . . . . . . . . . . . . . 323
6.11. Triángulo ABC escalado con con Dx = 2 y Dy = 2 . . . . . . . . . . . . . 324
7.1. Ax = λx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
“Comienza haciendo lo que es necesario, después lo que es
posible y de repente estarás haciendo lo imposible”
San Francisco de Asís
Matrices y vectores
1
1.1. Matrices
Para comenzar, nos enfocaremos en el concepto principal del Álgebra Lineal, el concepto
de matriz.
En la matriz A, la posición A32 o A3,2 hace referencia de la fila tres y la columna dos,
que en este caso es un 6. La posición A22 o A2,2 hace referencia a la fila dos y la columna
2, en cuyo caso es el 1.
15
16 1.1. Matrices
a = (a1 , a2 . . . an )
Un vector Columna de n componentes es un arreglo ordenado de la siguiente forma:
b1
b2
b= .
..
bn
.:Ejemplo 1.1
a = (5, 9, 6, 4, 7)
Es un vector fila de cinco componentes, donde, por ejemplo, la tercera componente a3 = 6.
Ahora bien,
1
6
b= 0
4
Es un vector columna, donde b3 = 0.
Las matrices se denotan con letras mayúsculas, así por ejemplo, tendremos la matriz
A. los componentes internos de la matriz, se harán con la misma letra pero minúscula
A = (aij ) que se lee “La matriz A de componentes aij ”.
.:Ejemplo 1.2
2 3 4 5
2 2 3 0 2 −8 4 5
A=
9
, B=
3 4 1 3 0 1 2
6 4 −1 0
A es una matriz de 4 × 4, es decir, tiene 16 componentes en 4 filas y 4 columnas, de los
cuales a34 = 1 y a13 = 4. La matriz B tiene dos filas y cuatro columnas, donde b22 =0.
Primero debemos hacer un llamado de la librería Numpy. En este caso, la librería, queda
“cargada” en la variable np, y es por medio de esta variable que podemos utilizar los
nuevos tipos de matrices. Los siguientes ejemplos muestran cómo podemos crear tipos
básicos como numéricos, vectores y matrices.
.:Algoritmo 1.1
1 i m p o rt numpy a s np
2
3 p r i n t "Dato numerico "
4 num = np . f l o a t 3 2 ( 5 . 2 1 4 7 5 6 )
5 p r i n t num
6
7
8 p r i n t "Dato t i p o v e c t o r "
9 v e c = np . a r r a y ( [ 1 , 2 , 3 ] )
10 p r i n t vec
11
12 p r i n t "Dato t i p o M a tri z "
13 A = np . a r r a y ( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] )
14 print A
18 1.1. Matrices
1 >>>
2 Dato numerico
3 5.21476
4 Dato t i p o v e c t o r
5 [1 2 3]
6 Dato t i p o M a tri z
7 [ [1 2 3]
8 [4 5 6]
9 [7 8 9]]
10 >>>
En este caso, hemos creado tres tipos de datos diferentes, el primero es una variable de
tipo numérica llamada num, se le ha asignado el valor de 5.214756, pero al imprimirlo
en pantalla muestra el valor de 5.21476. Posteriormente tenemos un vector de tres
componentes enteros, en este caso el vector [1 2 3] asociado a la variable vec, los valores
separados por espacios en blanco representan el vector fila vec = (1, 2, 3), y finalmente,
una matriz de enteros asociado a la variable A, la cual representa la matriz de enteros:
1 2 3
A= 4 5 6
7 8 9
Los vectores y las matrices fueron creados con la función array de Numpy, las matrices
son básicamente arreglos de arreglos. Existen muchas formas de crear matrices y vectores,
y sobre todo de implementarlas con diferentes tipos numéricos, como real, entero largo
o complejo. El siguiente algoritmo muestra diversas formas de declarar un vector o una
matriz de diferentes tipos:
.:Algoritmo 1.2
1 i m p o rt numpy a s np
2
3 z1=np . a r r a y ( [ 1 , 2 , 3 ] , dtype= ’ f ’ )
4 p r i n t z1
5
6
7 z2=np . int_ ( [ 1 , 2 , 4 ] )
8 p r i n t z2
9
10
11 z3=np . bool_ ( [ 0 , 1 , 4 ] )
1. Matrices y vectores 19
12 p r i n t z3
13
14 z4=np . a r r a y ( [ 4 . j , 1 . + 3 . j , 9. −8. j , 1.+0. j ] )
15 p r i n t z4
1 >>>
2 [ 1. 2. 3.]
3 [1 2 4]
4 [ F a l s e True True ]
5 [ 0.+4. j 1.+3. j 9. −8. j 1.+0. j ]
6 >>>
El Algoritmo 1.2 muestra cuatro arreglos distintos, el primero de ellos genera un vector de
tres componentes de tipo real, sin necesidad de ponerles el punto decimal para determinar
que son enteros, sólo se debe poner la opción dtype=’f ’ para que Python le asigne los
valores reales. El segundo arreglo (z2 ) genera un vector de enteros, en este caso usando el
comando int_(), el cual convierte los componentes del vector en enteros. Luego tenemos
un vector de valores booleanos, (usando el comando bool_) para convertir los enteros del
vector en valores de Falso o Verdadero; Observemos que en la salida del algoritmo sólo
el cero se convirtió en un valor de Falso, los demás valores toman valores de Verdadero.
Finalmente, creamos un vector de números complejos.
Según [12] para construir un arreglo con Numpy, se puede hacer de cinco formas diferentes:
Ya hemos visto que para crear un arreglo o una matriz con Numpy podemos usar la
función array, la cual nos permite generar la estructura que se comporta como un vector
o como una matriz, recordemos que una matriz se puede ver como un arreglo de arreglos.
20 1.1. Matrices
Estos vectores generalmente se denotan con un cero, es decir, podemos denotarlos usando
el símbolo 0, pero este no se debe confundir con la magnitud escalar cero, que es un
número real. En Numpy es fácil crear una matriz o un vector nulo, sólo basta usar la
instrucción zeros, con un tamaño específico.
.:Algoritmo 1.3
1 i m p o rt numpy a s np
2
3 x=np . z e r o s ( ( 3 , 3 ) , dtype=np . f l o a t )
4 print x
5
6 y=np . o n e s ( ( 3 , 3 ) , dtype=np . f l o a t )
7 print y
8
9 z=np . a r r a y ( [ [ 0. , 0. , 0.] , [ 0. , 0. , 0.]])
10 print z
11
12 w1=np . a ra n g e ( 1 0 )
13 p r i n t w1
14
15 w2=np . a ra n g e ( −4 , 4 , dtype=np . f l o a t )
16 p r i n t w2
17
18 w3=np . a ra n g e ( 0 , 1 , 0 . 1 )
19 p r i n t w3
1. Matrices y vectores 21
1 >>>
2 [ [ 0. 0. 0.]
3 [ 0. 0. 0.]
4 [ 0. 0. 0.]]
5
6 [ [ 1. 1. 1.]
7 [ 1. 1. 1.]
8 [ 1. 1. 1.]]
9
10 [ [ 0. 0. 0.]
11 [ 0. 0. 0.]]
12
13 [0 1 2 3 4 5 6 7 8 9]
14
15 [ − 4 . −3. −2. −1. 0. 1. 2. 3.]
16
17 [ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
18 >>>
El Algoritmo 1.3 muestra el uso de la función zeros, el cual genera en este caso una matriz
nula cuadrada de tamaño tres, posteriormente tenemos la función ones, la cual genera
una matriz o un vector con unos. Luego tenemos un array creado de forma normal y por
último tenemos la función arange, la cual genera vectores con un valor que se incrementa
dependiendo de un valor específico. En este caso, w1 representa un vector de cero a nueve,
w2 un vector de -4 a 3 y w3 un vector de cero a uno con un incremento de 0.1.
Además, con la función arange, podemos determinar la forma del vector, inclusive
podemos convertirlo en una matriz con la función reshape, la cual recibe los parámetros
de filas y columnas.
.:Algoritmo 1.4
1 i m p o rt numpy a s np
2 a = np . a ra n g e ( 1 5 ) . r e s h a p e ( 3 , 5 ) p r i n t a
1 >>>
2 [ [ 0 1 2 3 4]
3 [ 5 6 7 8 9]
4 [ 1 0 11 12 13 1 4 ] ]
5 >>>
Como podemos ver, la función convierte el vector de salida en una matriz de tamaño
3 × 5.
.:Algoritmo 1.5
1 i m p o rt numpy a s np
2
3 x=np . l i n s p a c e ( 0 . , 1 0 . , 5 )
4 print x
5
6 y=np . i n d i c e s ( ( 3 , 4 ) )
7 print y
1 >>>
2 [ 0. 2.5 5. 7.5 10. ]
3
4 [ [ [ 0 0 0 0]
5 [1 1 1 1]
6 [2 2 2 2]]
7
8 [ [ 0 1 2 3]
9 [0 1 2 3]
10 [0 1 2 3 ] ] ]
11
12 >>>
De igual forma podemos crear una matriz o un vector a partir de un archivo de texto. En
muchas de las aplicaciones científicas, se requiere almacenar gran cantidad de información
1. Matrices y vectores 23
Para la manipulación de matrices cargadas bien sea por archivos o por variables tipo
string, se usa el comando StringIO, el cual permite crear matrices y arreglos con el
formato CSV, el cual usa comas o puntos y comas para separar los valores. El Algoritmo
1.6 muestra dos ejemplos de uso de esta función y de la función genfromtxt, la cual permite
cargar una cadena como una variable de tipo arreglo o matriz. En la primera parte del
ejemplo se puede ver como una cadena se convierte en una matriz de tamaño 4 × 2 y en
la segunda se crea una matriz de tamaño 2 × 2, pero usando el parámetro comments, el
cual permite agregar un carácter especial para los comentarios.
.:Algoritmo 1.6
1 i m p o rt numpy a s np
2 from S t r i n g I O i m p o rt S t r i n g I O
3
4
5 l i n e a = " 4 . 0 , 6 . 2 \n 8 . 7 , 3 . 9 \ n 1 . 0 , 5 . 2 \ n 4 . 0 , 6.9 "
6 x=np . g e n f ro m tx t ( S t r i n g I O ( l i n e a ) , d e l i m i t e r=" , " )
7 print x
8
9 print
10 p r i n t " ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ \ n"
11 print
12
13 d a t o s M a t r i z = """
14 % e s t o e s un c o m e n ta ri o
15 1.2 , 5.9
16 % esto es otro cometario
17 4.65 ,5.75
18 """
19
20 y = np . g e n f ro m tx t ( S t r i n g I O ( d a t o s M a t r i z ) , comments=" %" ,
21 d e l i m i t e r=" , " )
22
23 print y
1 >>>
2 [ [ 4. 6.2]
3 [ 8.7 3.9]
24 1.1. Matrices
4 [ 1. 5.2]
5 [ 4. 6.9]]
6
7 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
8
9 [ [ 1.2 5.9 ]
10 [ 4.65 5.75]]
11 >>>
Otra forma de introducir matrices y arreglos es usando el comando matrix, el cual permite
convertir una cadena en un arreglo o matriz:
.:Algoritmo 1.7
1 i m p o rt numpy a s np
2
3 A = np . m a tri x ( ’ 3 9 8 ; 8 5 1 ; 9 8 7 ’ )
4 print A
5 print
6
7 B = np . m a tri x ( ’ 3 , 9 , 8 ; 8 , 5 , 1 ; 9 , 8 , 7 ’ )
8 print B
9 print
10
11
12 C = np . m a tri x ( ’ [ 3 , 9 , 8 ; 8 , 5 , 1 ; 9 , 8 , 7 ] ’ )
13 print C
1 >>>
2 [ [3 9 8]
3 [8 5 1]
4 [9 8 7]]
5
6 [ [3 9 8]
7 [8 5 1]
1. Matrices y vectores 25
8 [9 8 7]]
9
10 [ [3 9 8]
11 [8 5 1]
12 [9 8 7]]
13 >>>
Como vemos, se puede hacer de varias formas, usando como separadores espacios en
blanco o comas, al final se obtiene el mismo resultado.
.:Algoritmo 1.8
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 2 , 3 ] ,
4 [4 ,5 ,6] ,
5 [7 ,8 ,9]])
6
7 B = np . a r r a y ( [ 0 . 2 1 , 0 . 5 4 , 0 . 9 8 , 0 . 1 4 , 0 . 1 4 7 , 0 . 9 ] )
8
9 p r i n t A[ 0 , 0 ]
10 print B[ 4 ]
11
12 p r i n t A. shape
13 p r i n t B . shape
1 >>>
2 0.147
3 1
4 (3 , 3)
5 (6 ,)
6 >>>
26 1.1. Matrices
En el Algoritmo 1.8, vemos como se puede llamar el valor de la matriz A que se encuentra
en la posición 0,0 y en el vector B el valor de la posición 4, que en este caso es 0.147.
Además, usamos la opción shape, tanto para la matriz como para el vector; en la matriz
aparece la tupla (3,3) y en el vector (6,) indicando que es un vector fila.
De igual manera podemos acceder a filas y columnas de una matriz. El siguiente algoritmo
permite construir vectores fila o columna a partir de las filas o las columnas de una matriz.
.:Algoritmo 1.9
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 2 , 3 ] ,
4 [4 ,5 ,6] ,
5 [7 ,8 ,9]])
6
7 print A
8 p r i n t " ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ "
9 b=A [ 1 , : ]
10 print b
11 p r i n t " ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ "
12 c=A [ : , 1 ]
13 print c
1 >>>
2 [ [1 2 3]
3 [4 5 6]
4 [7 8 9]]
5 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
6 [4 5 6]
7 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
8 [2 5 8]
9 >>>
La salida del Algoritmo 1.9 muestra la matriz A y los vectores b y c. El vector b fue creado
con la instrucción b=A[1,:], es decir, tomando la segunda fila de A (o fila 1, recuerde que
se inicia desde cero). El vector b se creó con la columna de uno de A. En este caso el
vector c sigue siendo un vector fila.
1. Matrices y vectores 27
.:Ejercicios 1.1
a) A[2][1]
b) 2*A[3][2]
c) 7.0214*A[2][:]
d ) A[1][:]=(0.5)*A[1][:]
e) A[4][:]=A[2][:]
2. Haga un programa en Python que permita, dada una matriz, obtener un vector con
la diagonal de dicha matriz.
3. Haga un programa en Python que permita obtener la traza de una matriz de tamaño
n. Recuerde que la traza de una matriz es la suma de los elementos de la Diagonal
principal.
2x + 3y − 9z = 1
x − 4y + 3z = 2
7x − 2y + 4z = −7
2 3 −9
1 −4 3
7 −2 4
Ahora bien, en este punto no se representan los valores constantes. Para ello usamos la
matriz de coeficientes aumentada.
x1 + x2 + 2x3 = 1
x1 − 4x2 + 6x3 = 2
−2x1 + x2 − 3x3 = 2
Recuerde que la matriz de coeficientes aumentada es la siguiente:
1 1 2 1
1 −4 6 2
−2 1 −3 2
Por eliminación Gaussiana
1 1 2 1 1 1 2 1
0 −5 4 1 f3 → f3 + (2)f1 0 −5 4 1
−2 1 −3 2 −−−−−−−−−−−→ 0 3 1 4
Ahora multiplicamos la segunda fila por − 51 , esto es f2 → − 51 f2
1 1 2 1
1 1 2 1
1
0 −5 4 1 f2 → − 0 1
f2 − 54 − 51
5
0 3 1 4 −−−−−−−−−−−→
0 3 1 4
5 5
Finalmente multiplicamos la última fila por 17 , es decir f3 → 17 f3
1 1 2 1 1 1 2 1
f3 → 5 f3 0
0 1 − 45 − 15 1 − 54 − 51
17
−−−−−−−
−−−→
17 23 23
0 0 5 5 0 0 1 17
Por Gauss-Jordan
4
Procedemos de la misma manera dejando sólo los elementos de diagonal : f2 → f2 + 5 f3
1. Matrices y vectores 31
1 1 2 1 1 1 2 1
f2 → f2 + 4 f3 0
0 1 − 54 − 51 1 0 15
17
5
−−−−−−−−−−−−−→
23 23
0 0 1 17 0 0 1 17
Ahora f1 → f1 + (−2) f3
1 1 2 1 1 1 0 − 29
17
15
15
0 1 0 f1 → f1 + (−2) f3 0 1 0
17 −−−−−−−−−−−−−→ 17
23 23
0 0 1 17 0 0 1 17
Para implementar las operaciones elementales por fila, tendremos en cuenta las
operaciones entre vectores de Python.
.:Algoritmo 1.10
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 1 , 2 ] ,
4 [1 , −4 ,6] ,
5 [ −2 ,1 , −3]])
6 print A
7
8 A[ 1 , : ] = 2 ∗A [ 1 , : ]
9 p r i n t " ∗∗∗∗∗∗∗∗∗∗∗∗∗"
10 p r i n t "A con l a segunda f i l a m u l t i p l i c a d a por 2 "
11 print A
32 1.2. Solución de sistemas de ecuaciones lineales
1 >>>
2 [ [ 1 1 2]
3 [ 1 −4 6 ]
4 [ −2 1 − 3 ] ]
5 ∗∗∗∗∗∗∗∗∗∗∗∗∗
6 A con l a segunda f i l a m u l t i p l i c a d a por 2
7 [ [ 1 1 2]
8 [ 2 −8 1 2 ]
9 [ −2 1 − 3 ] ]
10 >>>
El Algoritmo 1.10, muestra como implementar la operación elemental de cambiar una fila,
por otra fila que es múltiplo de la primera. En este caso, la segunda fila fue cambiada por
la segunda fila de la matriz multiplicada por 2.
.:Algoritmo 1.11
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 1 , 2 ] ,
4 [1 , −4 ,6] ,
5 [ −2 ,1 , −3]])
6 print A
7
8 A[ 1 , : ] =A [ 1 , : ] + ( −1) ∗A [ 0 , : ]
9 p r i n t " ∗∗∗∗∗∗∗∗∗∗∗∗∗"
10 p r i n t "La nueva m a t r i z A"
11 print A
1 >>>
2 [ [ 1 1 2]
3 [ 1 −4 6 ]
4 [ −2 1 − 3 ] ]
5 ∗∗∗∗∗∗∗∗∗∗∗∗∗
1. Matrices y vectores 33
6 La nueva m a t r i z A
7 [ [ 1 1 2]
8 [ 0 −5 4 ]
9 [ −2 1 − 3 ] ]
10 >>>
El Algoritmo 1.11 cambia una fila por la misma fila, más el múltiplo escalar de otra. En
este caso, tomamos la segunda fila y la cambiamos por la segunda fila más la primera fila
multiplicada por (−1) ; lo anterior, con el fin de convertir la posición 2,1 en un cero.
.:Algoritmo 1.12
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 1 , 2 ] ,
4 [1 , −4 ,6] ,
5 [ −2 ,1 , −3]])
6
7 print A
8 a=np . a r r a y ( [ 0 , 0 , 0 ] )
9 b=A [ 0 , : ]
10 c=A [ 1 , : ]
11
12 A = np . a r r a y ( [ c ,
13 b,
14 [ −2 ,1 , −3]])
15
16 print A
1 >>>
2 [ [ 1 1 2]
3 [ 1 −4 6 ]
4 [ −2 1 − 3 ] ]
5
6 [ [ 1 −4 6 ]
7 [ 1 1 2]
8 [ −2 1 − 3 ] ]
9 >>>
34 1.2. Solución de sistemas de ecuaciones lineales
En este caso, se intercambiaron las filas primera y segunda, pero hemos vuelto a crear la
matriz A, para no recurrir a los paquetes de copiado de objetos en Python. Es importante
resaltar que en la salida del Algoritmo 1.12, se muestra la matriz A antes del intercambio
y después de él.
Con las operaciones elementales por fila, tenemos la posibilidad de encontrara la solución
a un sistema de ecuaciones lineales, sin recurrir a las funciones de Python para hallar la
solución.
Métodos directos: Estos métodos van desde los más simples hasta los mas complejos,
entre ellos tenemos:
1. Sustitución.
2. Igualación.
4. Usando Determinantes.
Métodos Indirectos: Estos métodos, también llamados métodos iterativos, utilizan una
descomposición especial de la matriz de coeficientes; este proceso termina con un ciclo
que hace referencia a un proceso iterativo de suma y multiplicación de la matriz y otros
vectores. Entre los más reconocidos tenemos el método de Jacobi y el método de Gauss
1. Matrices y vectores 35
- Seidel. Estos métodos, por su naturaleza iterativa no entregan una solución exacta del
problema, en su lugar, entregan una solución aproximada, la ventaja radica en su relativa
baja complejidad.
Para esta sección, implementaremos el método de Gauss - Jordan y más adelante, los
métodos iterativos de Jacobi y Gauss - Seidel. Antes que nada, Numpy ya trae una
herramienta eficiente para resolver sistemas de ecuaciones lineales.
x + y + 2z = −4
x − 4y + 6z = 2
−2x + y − 3z = −1
.:Algoritmo 1.13
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 1 , 2 ] ,
4 [1 , −4 ,6] ,
5 [ −2 ,1 , −3]])
6
7 b = np . a r r a y ( [ [ − 4 ] ,
8 [2] ,
9 [ −1]])
10
11 x = np . l i n a l g . s o l v e (A, b )
12
13 print x
1 >>>
2 [ [ 1.64705882]
3 [ −2.47058824]
4 [ −1.58823529]]
5 >>>
La solución está dada por la rutina solve, que está en la librería linalg, la solución al
sistema está dado por el vector x:
1.64705882
x = −2.47058824
−1.58823529
La instrucción solve, sólo necesita dos parámetros, el primero es la matriz de coeficientes
y el segundo es el vector de constantes. Sin embargo, en esta sección implementaremos el
algoritmo de eliminación Gauss - Jordan, Los demás métodos los implementaremos más
adelante.
3x + 5y − 9z = −1
6x − 2y + 4z = 1
−7x + 2y − 3z = −5
.:Algoritmo 1.14
1 Como los valores obtenidos son de tipo real, hemos creado la matriz de A y A′ de tipo real (float)
1. Matrices y vectores 37
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 3 , 5 , − 9 , − 1 ] ,
4 [6 , −2 ,4 ,1] ,
5 [ − 7 , 2 , − 3 , − 5 ] ] , dtype=f l o a t )
6
7
8 p r i n t "La m a t r i z aumentada A="
9 print A
10
11
12 # R e a l i z a m o s l o s Cambios
13 #h a c i e n d o o p e r a c i o n e s e l e m e n t a l e s
14 #por f i l a a l a m a t r i z aumentada
15
16 # c o n v e r t i m o s e l p ri m e r p i v o t e en 1
17 A[ 0 , : ] = ( 1 . 0 / A[ 0 , 0 ] ) ∗A [ 0 , : ]
18 p r i n t "La nueva m a t r i z A: "
19 print A
20
21
22 #Hacemos l o s e l e m n t o s b a j o e s t e p i v o t e cero
23 A[ 1 , : ] =A [ 1 , : ] + (−1∗A [ 1 , 0 ] ) ∗A [ 0 , : ]
24 A[ 2 , : ] =A [ 2 , : ] + (−1∗A [ 2 , 0 ] ) ∗A [ 0 , : ]
25 p r i n t "La nueva m a t r i z A: "
26 print A
27
28
29 # c o n v e r t i m o s e l segundo p i v o t e en 1
30 A[ 1 , : ] = ( 1 . 0 / A[ 1 , 1 ] ) ∗A [ 1 , : ]
31 p r i n t "La nueva m a t r i z A: "
32 print A
33
34 #Hacemos l o s e l e m n t o s b a j o y s o b r e este pivote cero
35 A[ 0 , : ] =A [ 0 , : ] + (−1∗A [ 0 , 1 ] ) ∗A [ 1 , : ]
36 A[ 2 , : ] =A [ 2 , : ] + (−1∗A [ 2 , 1 ] ) ∗A [ 1 , : ]
37 p r i n t "La nueva m a t r i z A: "
38 print A
39
40 # c o n v e r t i m o s e l t e r c e r p i v o t e en 1
41 A[ 2 , : ] = ( 1 . 0 / A[ 2 , 2 ] ) ∗A [ 2 , : ]
42 p r i n t "La nueva m a t r i z A: "
43 print A
44
45
46 #Hacemos l o s e l e m n t o s s o b r e este pivote cero
47 A[ 1 , : ] =A [ 1 , : ] + (−1∗A [ 1 , 2 ] ) ∗A [ 2 , : ]
48 A[ 0 , : ] =A [ 0 , : ] + (−1∗A [ 0 , 2 ] ) ∗A [ 2 , : ]
49 p r i n t "La nueva m a t r i z A: "
50 print A
38 1.2. Solución de sistemas de ecuaciones lineales
1 >>>
2 La m a t r i z aumentada A=
3 [ [ 3. 5 . −9. − 1 . ]
4 [ 6 . −2. 4 . 1.]
5 [ −7. 2 . −3. − 5 . ] ]
6 La nueva m a t r i z A:
7 [ [ 1. 1 . 6 6 6 6 6 6 6 7 −3. −0.33333333]
8 [ 6. −2. 4. 1. ]
9 [ −7. 2. −3. −5. ]]
10 La nueva m a t r i z A:
11 [[ 1. 1.66666667 −3. −0.33333333]
12 [ 0. −12. 22. 3. ]
13 [ 0. 1 3 . 6 6 6 6 6 6 6 7 −24. −7.33333333]]
14 La nueva m a t r i z A:
15 [[ 1. 1.66666667 −3. −0.33333333]
16 [ −0. 1. −1.83333333 −0.25 ]
17 [ 0. 1 3 . 6 6 6 6 6 6 6 7 −24. −7.33333333]]
18 La nueva m a t r i z A:
19 [ [ 1. 0. 0.05555556 0.08333333]
20 [ −0. 1. −1.83333333 −0.25 ]
21 [ 0. 0. 1.05555556 −3.91666667]]
22 La nueva m a t r i z A:
23 [ [ 1. 0. 0.05555556 0.08333333]
24 [ −0. 1. −1.83333333 −0.25 ]
25 [ 0. 0. 1. −3.71052632]]
26 La nueva m a t r i z A:
27 [ [ 1. 0. 0. 0.28947368]
28 [ 0. 1. 0. −7.05263158]
29 [ 0. 0. 1. −3.71052632]]
30 >>>
En el Algoritmo 1.14, hemos implementado los pasos necesarios para encontrar la solución
al sistema, el cual como podemos ver, es la ultima columna de la matriz A′ .
−−−−−−−−−−−→
3 5 −9 −1 Operaciones 1 0 0 0.28947368
A′ = 6 −2 4 1 elementales 0 1 0 −7.05263158
−7 2 −3 −5 por fila 0 0 1 −3.71052632
El siguiente algoritmo, proporciona una versión más general para resolver sistemas de
ecuaciones lineales, ofreciendo como parámetro una matriz aumentada [A b], donde la
última columna es el vector b de términos independientes.
.:Algoritmo 1.15
1 i m p o rt numpy a s np
2
3 A=np . random . rand ( 3 , 4 )
4
5 p r i n t "La m a t r i z A aumentada : \ n A= " , A
6
7 f i l a s , columnas= np . shape (A)
8
9 f o r i i n ra n g e ( f i l a s ) :
10 A[ i , : ] =A[ i , : ] / A[ i , i ]
11 f o r j i n ra n g e ( i +1 , columnas −1) :
12 A[ j , : ] =A[ j , : ] −A[ i , : ] ∗ A[ j , i ]
13
14
15 f o r i i n r e v e r s e d ( ra n g e ( f i l a s ) ) :
16 f o r j i n r e v e r s e d ( ra n g e ( 0 , i ) ) :
17 A[ j , : ] =A[ j , : ] −A[ i , : ] ∗ A[ j , i ]
18
19 p r i n t " l a nueva m a t r i z : \n" , A
20 p r i n t " El v e c t o r s o l u c i o n e s : \n" , A [ : , f i l a s ]
1 >>>
2 La m a t r i z A aumentada :
3 A= [ [ 0 . 2 6 4 7 1 6 3 8 0.11290115 0.69901363 0.03481052]
4 [ 0.14554075 0.87124262 0.42543185 0.2109904 ]
5 [ 0.98181314 0.99841436 0.154905 0.41569269]]
6
7 l a nueva m a t r i z :
8 [ [ 1. 0. 0. 0.18870122]
9 [ 0. 1. 0. 0.24016856]
10 [ −0. −0. 1. −0.06045246]]
11
12 El v e c t o r s o l u c i o n e s :
13 [ 0.18870122 0.24016856 −0.06045246]
14
15 >>>
40 1.2. Solución de sistemas de ecuaciones lineales
.:Ejercicios 1.2
5 8 −9 3 0
A= 4 6 5 −1 y b = −1
−2 3 3 0 −2
2. Dada la matriz A:
9 −1 −3
A= 7 1 9
9 0 4
a) c)
3.021x + 4.3914y − 9.002z = 34
5x + 9y − 7z = 7
0.3258x + 0.258y − 9.0214z = 52.07
6x + y − 7z = 2
0.1478x − 0.0231y − 6.0298z = 4.011
3x − 10y − 15z = 0
b)
π π π π d)
x+ y+ z =
3 8 3 32
6π 7π 5π π
x− y− z = x + y − 4z + 2w = 2
5 8 8 5
π π 7π π x − y − 7z + w = 3
x− y+ z = −x + y − z − 4w = 3
3 8 12 11
1. Matrices y vectores 41
x − y + 2z = a
3x + 8y − z = b
7x + 9y − 4z = c
encuentre las condiciones sobre a, b y c para que el sistema tenga única solución.
¿cómo podría implementar este ejercicio en Python?
.:Ejemplo 1.5
1 −2
1 3 5 −1
A= , B= , C = 1 4
2 4 1 −6
9 −1
42 1.3. Operaciones entre matrices
La operación A + B
6 2
A+B =
3 −2
Pero, A + C y B + C no están definidas, debido a que tiene tamaños diferentes.
.:Algoritmo 1.16
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 6 , 5 ] ,
4 [1 , −2] ,
5 [4 , −1]])
6
7
8 B = np . a r r a y ( [ [ 7 , 1 ] ,
9 [0 , −8] ,
10 [4 ,1]])
11
12 C=A+B
13
14 p r i n t "La m a t r i z A="
15 print A
16
17 p r i n t "La m a t r i z B="
18 print B
19
20 p r i n t "La m a t r i z C=A+B"
21 print C
1 >>>
2 La m a t r i z A=
3 [ [ 6 5]
4 [ 1 −2]
5 [ 4 −1]]
6 La m a t r i z B=
7 [ [ 7 1]
8 [ 0 −8]
9 [ 4 1]]
1. Matrices y vectores 43
10 La m a t r i z C=A+B
11 [ [ 13 6]
12 [ 1 −10]
13 [ 8 0]]
14 >>>
.:Algoritmo 1.17
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 3 , − 2 ] ,
4 [5 ,1] ,
5 [ − 7 , 9 ] ] , dtype=f l o a t )
6
7
8 B = np . a r r a y ( [ [ 6 , 6 ] ,
9 [ −8 ,7] ,
10 [ − 1 , 4 ] ] , dtype=f l o a t )
11
12 C = np . z e r o s ( ( 3 , 2 ) )
13
14 f o r i i n ra n g e ( 3 ) :
15 f o r j i n ra n g e ( 2 ) :
16 C [ i , j ]=A[ i , j ]+B [ i , j ]
17
18
19 p r i n t "La m a t r i z A="
20 print A
21
22 p r i n t "La m a t r i z B="
23 print B
24
25 p r i n t "La m a t r i z C="
26 print C
1 >>>
2 La m a t r i z A=
44 1.3. Operaciones entre matrices
3 [ [ 3 . −2.]
4 [ 5. 1.]
5 [ −7. 9.]]
6 La m a t r i z B=
7 [ [ 6. 6.]
8 [ −8. 7.]
9 [ −1. 4.]]
10 La m a t r i z C=
11 [[ 9. 4.]
12 [ −3. 8.]
13 [ −8. 13.]]
14 >>>
En el Algoritmo 1.17 usamos dos ciclos for para recorrer las matrices, recuerde que estas
matrices no son cuadradas y por tanto los contadores i y j tienen límites diferentes.
.:Ejemplo 1.6
Sea α = 5, realice el producto αA sí:
1 4 −1
A = 6 2 −2
−1 1 4
Multiplicando aαA se tiene que:
5 20 −5
αA = 30 10 −10
−5 5 20
1. Matrices y vectores 45
.:Algoritmo 1.18
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 3 , − 2 , 7 ] ,
4 [5 ,1 ,6] ,
5 [ − 7 , 9 , 3 ] ] , dtype=f l o a t )
6
7 B = np . a r r a y ( [ [ 1 , 7 , − 4 ] ,
8 [ −3 ,2 ,7] ,
9 [ 2 , 0 , − 4 ] ] , dtype=f l o a t )
10
11 p r i n t "La m a t r i z A="
12 print A
13
14 A= 4∗A
15
16 p r i n t "La m a t r i z 4A="
17 print A
18
19 B = np . a r r a y ( [ [ 1 , 7 , − 4 ] ,
20 [ −3 ,2 ,7] ,
21 [ 2 , 0 , − 4 ] ] , dtype=f l o a t )
22
23 p r i n t "La m a t r i z B="
24 print B
25
26 f o r i i n ra n g e ( 3 ) :
27 f o r j i n ra n g e ( 3 ) :
28 B [ i , j ]=5∗B [ i , j ]
29
30 p r i n t "La m a t r i z 5B="
31 print B
1 >>>
2 La m a t r i z A=
3 [ [ 3 . −2. 7.]
4 [ 5. 1. 6.]
5 [ −7. 9. 3.]]
46 1.3. Operaciones entre matrices
6 La m a t r i z 4A=
7 [ [ 12. −8. 28.]
8 [ 20. 4. 24.]
9 [ −28. 36. 12.]]
10 La m a t r i z B=
11 [ [ 1. 7 . −4.]
12 [ −3. 2. 7.]
13 [ 2. 0. −4.]]
14 La m a t r i z 5B=
15 [[ 5. 35. −20.]
16 [ −15. 10. 35.]
17 [ 10. 0. −20.]]
18 >>>
El Algoritmo 1.18, muestra dos formas distintas de trabajar con la multiplicación por
escalar, la primera de ellas se hace normalmente, simplemente multiplicamos la matriz
por el escalar, en este caso 4A. La segunda forma, implementa la multiplicación de la
matriz B por el escalar 5, pero en esta ocasión, se hace término a término con la matriz
B.
A − B = A + (−1)B
.:Ejemplo 1.7
Sea
5 3
a= 6 y b= 2
−1 −1
Realice la operación: a − b:
1. Matrices y vectores 47
5 3
a−b = 6 + (−1) 2
−1 −1
5 −3 2
= 6 + −2 = 4
−1 1 0
El siguiente teorema recoge las principales propiedades de la suma, resta y multiplicación
por escalar en matrices.
.:Ejemplo 1.8
4 2 −9 3 1 4
A+B = 9 4 −1 + 9 8 −7
2 3 4 −4 2 1
7 3 −5
= 18 12 −8
−2 5 5
48 1.3. Operaciones entre matrices
De igual manera
3 1 4 4 2 −9
B+A = 9 8 −7 + 9 4 −1
−4 2 1 2 3 4
7 3 −5
= 18 12 −8
−2 5 5
.:Ejemplo 1.9
.:Algoritmo 1.19
1 i m p o rt numpy a s np
2
3 ## d e c l a ra m o s la s matrices y la s constantes
4 a=−3.0
5 b=0.8
6
7 A = np . a r r a y ( [ [ 4 , 2 , − 9 ] ,
8 [9 ,4 , −1] ,
9 [ 2 , 3 , 4 ] ] , dtype=f l o a t )
10
11 B = np . a r r a y ( [ [ 2 , 5 , − 1 ] ,
12 [1 ,0 , −7] ,
13 [ 7 , 1 , 2 ] ] , dtype=f l o a t )
14
15 C = np . a r r a y ( [ [ 2 , 9 , 0 ] ,
16 [1 ,2 ,8] ,
17 [ 0 , 3 , 2 ] ] , dtype=f l o a t )
18
19 p r i n t "La m a t r i z A="
1. Matrices y vectores 49
20 print A
21
22 p r i n t "La m a t r i z B="
23 print B
24
25 p r i n t "La m a t r i z C="
26 print C
27
28 ## Los c a l c u l o s
29
30 p r i n t "A+aB−bC="
31 p r i n t (A+a ∗B+(−1∗b ) ∗C)
32
33 p r i n t " 2abA+bB−C="
34 p r i n t ( ( 2 ∗ a ∗b ) ∗A+b∗B−C)
35
36 p r i n t " ( a /b )A+(b/ a )C−((2 a ) / (3 b ) )B="
37 p r i n t ( ( a /b ) ∗A+(b/ a ) ∗C−((2∗ a ) / (3 ∗ b ) ) ∗B)
1 >>>
2 La m a t r i z A=
3 [ [ 4. 2 . −9.]
4 [ 9. 4 . −1.]
5 [ 2. 3. 4.]]
6 La m a t r i z B=
7 [ [ 2. 5 . −1.]
8 [ 1. 0 . −7.]
9 [ 7. 1. 2.]]
10 La m a t r i z C=
11 [ [ 2. 9. 0.]
12 [ 1. 2. 8.]
13 [ 0. 3. 2.]]
14 A+aB−bC=
15 [ [ −3.6 −20.2 −6. ]
16 [ 5.2 2.4 13.6]
17 [ −19. −2.4 −3.6]]
18 2abA+bB−C=
19 [ [ − 1 9 . 6 −14.6 42.4]
20 [ − 4 3 . 4 −21.2 −8.8]
21 [ −4. −16.6 − 1 9 . 6 ] ]
22 ( a /b )A+(b/ a )C−((2 a ) / (3 b ) )B=
23 [[ −10.53333333 2.6 31.25 ]
24 [ − 3 1 . 5 1 6 6 6 6 6 7 −15.53333333 − 1 5 . 8 8 3 3 3 3 3 3 ]
25 [ 10. −9.55 −10.53333333]]
26 >>>
50 1.3. Operaciones entre matrices
Como vemos, es relativamente fácil hacer cálculos con matrices en Python, en el algoritmo
anterior, podemos apreciar, que una vez declaradas las matrices y las constantes, es posible
hacer las operaciones de forma muy similar a como se declaran las operaciones.
u·v = u1 v1 + u2 v2 + u3 v3 + · · · + un vn
n
X
= ui vi
i=0
La definición de producto escalar, nos pone de manifiesto que el producto escalar se puede
ver como una función Rn × Rn −→ R, es decir, se toman dos vectores en Rn y genera un
número real. De otro lado, la definición no distingue entre vector fila o columna, es decir,
se pueden multiplicar dos vectores fila o dos vectores columna o un vector fila y un vector
columna.
.:Ejemplo 1.10
1. Matrices y vectores 51
3
2
Sea u =
9 y v = (5, 1, 3, −3), entonces:
0
3
2
u·v = 9 · (5, 1, 3, −3)
= 3 · 5 + 2 · 1 + 9 · 3 + 0 · (−3)
= 15 + 2 + 27 + 0
= 44
.:Algoritmo 1.20
1 i m p o rt numpy a s np
2
3 p r i n t " El v e c t o r u="
4 u = np . a r r a y ( [ 5 , 7 , −2])
5 print u
6
7 p r i n t " El v e c t o r v="
8 v = np . a r r a y ([ − 3 , 6 , 4 ] )
9 print v
10
11 p r i n t " El p ro d u c to u . v="
12 uv=v . dot ( u )
13 p r i n t uv
14
15 p r i n t " El v e c t o r w="
16 w= np . a r r a y ( [ [ − 3 ] , [ 6 ] , [4]])
17 print w
18
19 p r i n t " El p ro d u c to u . w="
20 uw=u . dot (w)
21 p r i n t uw
52 1.3. Operaciones entre matrices
1 >>>
2 El v e c t o r u=
3 [ 5 7 −2]
4 El v e c t o r v=
5 [ −3 6 4 ]
6 El p ro d u c to u . v=
7 19
8 El v e c t o r w=
9 [[ −3]
10 [ 6]
11 [ 4]]
12 El p ro d u c to u .w=
13 [19]
14 >>>
El Algoritmo 1.20 muestra que los vectores en SciPy y Numpy poseen una función llamada
dot, la cual, multiplica vectores bien sea filas o vectores columna. Sin embargo, debemos
tener cuidado, pues si los dos vectores son fila (el producto de u y v), el resultado es un
número, en nuestro ejemplo es el 19; pero si multiplicamos un vector fila como u y un
vector columna como w, el resultado es el mismo 19, pero para Python es como un objeto
matriz, es decir ma matriz [19].
.:Algoritmo 1.21
1 i m p o rt numpy a s np
2
3 u = np . a r r a y ( [ 3 , − 2 , 5 , 1 , − 7 , 9 ] , dtype=f l o a t )
4
5 v = np . a r r a y ( [ 6 , 6 , − 8 , 7 , − 1 , 4 ] , dtype=f l o a t )
6 sum=0.0
7
8 f o r i i n ra n g e ( np . s i z e ( u ) ) :
9 sum= sum + u [ i ] ∗ v [ i ]
10
11 p r i n t sum
1. Matrices y vectores 53
1 >>>
2 16.0
3 >>>
Sólo es cuestión de guardar los productos individuales en una variable, en este caso sum.
Sin embargo, en este algoritmo usamos la función [Link](u), la cual devuelve el número
total de elementos de un vector o una matriz
n
X
= aik bkj
k=1
Recuerde que:
1. El número de columnas de la primera matriz debe coincidir con el número de
columnas de la segunda matriz.
2. La definición de multiplicación de matrices nos dice que la componente ij-esima de
C es el producto escalar entre la la fila i de A y la columna j de B.
.:Ejemplo 1.11
1 3 1 −7
Sea A = yB= ,
1 2 2 4
54 1.3. Operaciones entre matrices
C = AB
1 3 1 −7
= ·
1 2 2 4
7 5
=
5 1
.:Ejemplo 1.12
Multiplicación de matrices de tamaños diferentes:
8 9
5 6 9 8 5 4
sea A = yB= , el producto AB es:
5 2 2 3 2×4 7 3
2 1 4×2
8 9
5 6 9 8 5 4
AB =
5 2 2 3 7 3
2 1
149 104
=
70 62
Una de las dificultades que presenta la multiplicación de matrices, a diferencia de la
multiplicación de números reales, es que la multiplicación de matrices no es conmutativa,
es decir, si A y B son matrices cuyos tamaños permitan calcular el producto AB y el
producto BA, entonces AB 6= BA.
.:Ejemplo 1.13
8 9
5 6 9 8 5 4
Si tenemos A = yB= , como en el ejemplo anterior,
5 2 2 3 2×4
7 3
2 1
4×2
149 104
ya hemos visto que el producto, AB = . Sin embargo, el producto BA es
70 62
una matriz de tamaño 4 × 4:
85 66 90 91
45 38 53 52
BA = 50 48 69 65
15 14 20 19
Es fácil ver que ambos productos son completamente distintos.
1. Matrices y vectores 55
A(BC) = (AB)C
Teniendo en cuenta que el tamaño de la matriz resultante es de n × q.
.:Ejemplo 1.14
1 4 2 3 3 3
Sea A = ,B= yC= , comprobemos :
2 8 4 −1 5 −2
Veamos (AB) C
1 4 2 3 3 3
(AB) C =
2 8 4 −1 5 −2
=
49 56
=
98 112
Veamos A (BC)
1 4 2 3 3 3
A (BC) =
2 8 4 −1 5 −2
=
49 56
=
98 112
A(B + C) = AB + AC
(A + B)C = AC + BC
1 4 2 3 3 3
.:Ejemplo 1.15 Sea A = ,B= yC = , comprobemos
2 8 4 −1 5 −2
que A(B + C) = AB + AC
56 1.3. Operaciones entre matrices
1 4 2 3 3 3
A(B + C) = +
2 8 4 −1 5 −2
=
41 −6
=
82 −12
de otro lado,
1 4 2 3 1 4 3 3
AB + AC = +
2 8 4 −1 2 8 5 −2
=
41 −6
=
82 −12
En Python es muy fácil multiplicar matrices, la librería ScyPy, en especial Numpy tienen
la función dot, la cual ya hemos usado antes. Recordemos que los tamaños de las matrices
deben ser compatibles.
.:Algoritmo 1.22
1 i m p o rt numpy a s np
2
3
4 A=np . a r r a y ( [ [ 5 , − 6 , 9 ] ,
5 [ −7 ,2 ,2] ,
6 [2 ,7 , −1]])
7
8 B=np . a r r a y ( [ [ 4 , 5 , 8 , − 1 , 3 ] ,
9 [4 , 6 ,8 , 1 ,4] ,
10 [ 2 , 4 ,6 ,3 , −1]])
11
12 p r i n t " l a m a t r i z A=\n" , A
13 p r i n t " l a m a t r i z B=\n" , B
14
15 C=A. dot (B)
16 print " El p ro d u c to AxB=\n" , C
1 >>>
2 l a m a t r i z A=
3 [ [ 5 −6 9 ]
4 [ −7 2 2 ]
5 [ 2 7 −1]]
6 l a m a t r i z B=
7 [ [ 4 5 8 −1 3 ]
8 [ 4 6 8 1 4]
9 [ 2 4 6 3 −1]]
10 El p ro d u c to AxB=
11 [ [ 14 25 46 16 −18]
12 [ −16 −15 −28 15 −15]
13 [ 34 48 66 2 35]]
14 >>>
.:Algoritmo 1.23
1
2 i m p o rt numpy a s np
3
4
5 A=np . a r r a y ( [ [ 5 , − 6 , 9 ] ,
6 [ −7 ,2 ,2] ,
7 [ 2 , 7 , − 1 ] ] , dtype=f l o a t )
8
9 B=np . a r r a y ( [ [ 4 , 5 , 8 , − 1 , 3 ] ,
10 [4 , 6 ,8 , 1 ,4] ,
11 [ 2 , 4 , 6 , 3 , − 1 ] ] , dtype=f l o a t )
12
13
14
15 p r i n t " l a m a t r i z A=\n" , A
16 p r i n t " l a m a t r i z B=\n" , B
17
18 p r i n t "__________________________________"
19
20 d e f m u l t i p l i c a r M a t r i c e s (A, B) :
21
22 filasA = A. shape [0]
23 ColumnasA= A. shape [1]
24 filasB = B . shape [0]
25 ColumnasB= B . shape [1]
26
27
28
58 1.3. Operaciones entre matrices
29 C=np . z e r o s ( ( f i l a s A , ColumnasB ) )
30
31
32 i f ( ColumnasA==f i l a s B ) :
33 f o r i i n ra n g e ( f i l a s A ) :
34 f o r j i n ra n g e ( ColumnasB ) :
35 f o r k i n ra n g e ( f i l a s B ) :
36 C [ i ] [ j ]+=A[ i ] [ k ] ∗B [ k ] [ j ]
37
38 return C
39
40 p r i n t " l a m u l t i p l i c a c i o n AxB=\n " , m u l t i p l i c a r M a t r i c e s (A, B)
1 >>>
2 l a m a t r i z A=
3 [ [ 5 . −6. 9.]
4 [ −7. 2. 2.]
5 [ 2. 7. −1.]]
6 l a m a t r i z B=
7 [ [ 4. 5. 8 . −1. 3.]
8 [ 4. 6. 8. 1. 4.]
9 [ 2. 4. 6. 3. −1.]]
10
11 __________________________________
12 l a m u l t i p l i c a c i o n AxB=
13 [ [ 14. 25. 46. 16. −18.]
14 [ − 1 6 . −15. −28. 1 5 . − 1 5 . ]
15 [ 34. 48. 66. 2. 35.]]
16 >>>
.:Ejercicios 1.3
1. Dadas las siguientes matrices:
1 3 9 1 2 9 1 0 0
A = −8 5 0 , B = 8 −7 −2 y C = 2 0 3
1 4 −9 1 0 0 9 8 0
1. Matrices y vectores 59
a) 3A + 4B − 5C
b) A2 + B 2 + C 2
π π π
c) A − B + C 2
3 8 11
d ) A(B − C) − B(4AC − 3BC)
e) ABC − 3BCA − 5BBCABCA
a11 a12 ... a1n a11 a21 ... an1
a21 a22 ... a2n a12 a22 ... an2
At =
A= .. .. .. .. y .. .. .. ..
. . . . . . . .
am1 am2 . . . amn a1m a2m . . . anm
Es decir, es la matriz que se obtiene al intercambiar las filas por las columnas de
A. La matriz At tiene tamaño n × m.
3 0 −1
At = 2 −6 3
−1 3 7
60 1.4. La transpuesta de una matriz
Simplemente, calculamos At :
3 1 2
At = 1 5 2
2 2 7
.:Ejemplo 1.18
La matriz A es antisimétrica
0 3 4 0 −3 −4
A = −3 0 6 ⇒ −A = 3 0 −6
−4 −6 0 4 6 0
calculamos At :
1. Matrices y vectores 61
0 3 4
At = −3 0 6
−4 −6 0
Podemos ver que A = −At .
.:Algoritmo 1.24
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ − 4 , 2 , 5 , 4 ] ,
4 [ 1 , −2 , 0 , 5 ] ,
5 [ 6 , −9, 4 , − 9 ] ] , dtype=f l o a t )
6
7 p r i n t "La m a t r i z A: \ n" , A
8
9 p r i n t "La m a t r i z A t r a s p u e s t a de A= \n" , A.T
10
11 p r i n t " \n La t r a s p u e s t a de una m a t r i z usando l a f u n c i o n t r a n s p o s e : \ n"
12
13 p r i n t "La m a t r i z A t r a s p u e s t a : A= \n" , A. t r a n s p o s e ( )
1 >>>
2 La m a t r i z A:
3 [[ −4. 2. 5. 4.]
4 [ 1 . −2. 0. 5.]
5 [ 6 . −9. 4. −9.]]
6 La m a t r i z A t r a s p u e s t a de A=
7 [[ −4. 1. 6.]
8 [ 2 . −2. −9.]
9 [ 5. 0. 4.]
10 [ 4. 5. −9.]]
11
12 La t r a s p u e s t a de una m a t r i z usando l a f u n c i o n t r a n s p o s e :
13
14 La m a t r i z A t r a s p u e s t a : A=
15 [[ −4. 1. 6.]
16 [ 2 . −2. − 9 . ]
17 [ 5. 0. 4.]
18 [ 4. 5. −9.]]
62 1.4. La transpuesta de una matriz
19 >>>
.:Ejercicios 1.4
a) c)
3 5 4 7 8 1 α α−1
5 4 7 8 2 α−3 2 α−2
1 0 2 3 6
α−4 α−2 3
9 5 4 8 9
1 2 5 4 0 d)
3 3 8
0 5 2
b) 0 0 5
0 a b c e)
d 0 e f 1 0 0
g h 0 i 2 1 0
j k l 0 4 4 1
Ax = b (1.1)
En cuyo caso, la matriz A es una matriz cuadrada llamada matriz de coeficientes de
tamaño n × n, X es un vector de variables tamaño n × 1 que representa las incógnitas.
Finalmente el vector b de tamaño n × 1 que representa los términos independientes de un
sistema de ecuaciones lineales.
64 1.5. La inversa de una matriz
1 0 0 ... 0
0 1 0 ... 0
1 0 0
1 0 0 0 1 ... 0
I2 = , I3 = 0 1 0 , . . . , In =
0 1 .. .. .. .. .
. ..
0 0 1 . . .
0 0 0 ... 1
AIn = A
y
In A = A
Esto quiere decir que el producto de cualquier matriz por la matriz identidad (siempre
que esté definido el producto), es la misma matriz.
.:Algoritmo 1.25
1 i m p o rt numpy a s np
2
3 I = np . e y e ( 3 , 3 )
4
5 p r i n t "La m a t r i z I d e n t i c a I \n " , I
1 >>>
2 La m a t r i z I d e n t i c a I
3 [ [ 1. 0. 0.]
4 [ 0. 1. 0.]
5 [ 0. 0. 1.]]
6 >>>
AB = BA = In
Luego B es la inversa de A (también podemos decir que A es la inversa de B) y
la denotaremos como A−1 , tendríamos que
AA−1 = A−1 A = In
Diremos que si A tiene inversa entonces se dice que A es invertible o no singular.
Si A no tiene inversa se le llama singular.
Cuando hablamos de matrices invertibles, nos referimos a todas aquellas matrices a las
cuales podemos obtenerle su inversa.
i) AB es invertible
2 4 7
A = −2 3 1
−6 2 9
Para determinar si A y A−1 son inversas entre si, sólo debemos usar la propiedad principal
de las matrices invertible, es decir:
AA−1 = A−1 A = In
Entonces:
25
195 − 11
98
17
− 196
2 4 7
−1 −2 3 1 3 15 4
AA = 49 49 − 49
−6 2 9
1
14 − 71 1
− 14
1 0 0
= 0 1 0
0 0 1
Además:
1. Matrices y vectores 67
25 11 17
195 − 98 − 196
2 4 7
A−1 A =
3
49
15
49
4
− 49 −2 3 1
−6 2 9
1
14− 17 1
− 14
1 0 0
= 0 1 0
0 0 1
.:Ejemplo 1.21
tomemos
1 5
A=
7 9
Ubicamos ambas matrices
1 5 | 1 0
7 9 | 0 1
Aplicamos operaciones elementales por fila a la nueva matriz, cuando hallamos convertido
la matriz A en la identidad, la matriz identidad se convertirla en A−1 .
1 5 | 1 0
7 9 | 0 1
Al realizar una operación elemental, ésta se ejecuta en ambas matrices: f2 → (−7) f1 + f2
1 5 | 1 0
|
0 −26 | −7 1
1
Ahora aplicamos f2 → − 26 f2
68 1.5. La inversa de una matriz
1 5 | 1 0
|
7 1
0 1 | 26 − 26
aplicamos f1 → (−5) f2 + f1
9 5
1 0 | − 26 26
|
7 1
0 1 | 26 − 26
9 5
− 26 26
Entonces A−1 =
7 1
26 − 26
Y podemos ver que AA−1 = I = A−1 A
−1
.:Teorema 1.9 Si A es invertible, entonces A−1 es invertible y además A−1 =A
.:Ejemplo 1.22
Veamos, sí:
1 5
A=
7 9
y
9 5
− 26 26
A−1 =
7 1
26 − 26
Observemos que:
−1 −1 1 5
A =
7 9
.:Ejemplo 1.23
1. Matrices y vectores 69
Este ejemplo tomado de [11], muestra cómo la inversa y la transpuesta están relacionadas.
Sea:
1 3 11
62 − 62 62
2 3 −7
13
A= 2 1 5 y A−1 = 62
23
62 − 6
31
6 0 2
3 9 1
− 62 62 − 31
−1
2 2 6
(At )−1 = 3 1 0
−7 5 2
1 13 3
62 62 − 62
= −3 23 9
62 62 62
11 6 1
62 − 31 − 31
Ahora (A−1 )t :
1 3 11
t
62 − 62 62
−1 t
13 23 6
(A ) =
62 62 − 31
3 9 1
− 62 62 − 31
1 13 3
62 62 − 62
3 23 9
− 62
=
62 62
11 6 1
62 − 31 − 31
El siguiente algoritmo, muestra como obtener la inversa con la librería Numpy, además
muestra que AA−1 = I.
.:Algoritmo 1.26
70 1.5. La inversa de una matriz
1 i m p o rt numpy a s np
2
3
4 A = np . a r r a y ( [ [ 1 , − 2 , 4 ] ,
5 [0 ,1 ,2] ,
6 [2 ,0 , −1]])
7
8 B = np . l i n a l g . i n v (A)
9
10 p r i n t "La m a t r i z de A \n " , A
11 p r i n t " \n________________________\n"
12 p r i n t "La m a t r i z i n v e r s a de A ( l l a m a d a B) \n " , B
13 I=A. dot (B)
14 p r i n t " \n A m u l t i p l i c a d a por B e s l a m a t r i z i d e n t i d a d \n" , I
1 >>>
2 La m a t r i z de A
3 [ [ 1 −2 4 ]
4 [ 0 1 2]
5 [ 2 0 −1]]
6
7 ________________________
8
9 La m a t r i z i n v e r s a de A ( l l a m a d a B)
10 [ [ 0.05882353 0.11764706 0.47058824]
11 [ −0.23529412 0.52941176 0.11764706]
12 [ 0.11764706 0.23529412 −0.05882353]]
13
14 A m u l t i p l i c a d a por B e s l a m a t r i z i d e n t i d a d
15 [[ 1 . 0 0 0 0 0 0 0 0 e+00 −2.77555756 e −17 0 . 0 0 0 0 0 0 0 0 e +00]
16 [ 0 . 0 0 0 0 0 0 0 0 e+00 1 . 0 0 0 0 0 0 0 0 e+00 0 . 0 0 0 0 0 0 0 0 e +00]
17 [ 0 . 0 0 0 0 0 0 0 0 e+00 0 . 0 0 0 0 0 0 0 0 e+00 1.00000000 e +00]]
18 >>>
El siguiente algoritmo, se basa en la técnica más simple para hallar la inversa de una
matriz. El método esta expuesto en la sección 1.5.1, donde básicamente, tomamos la
matriz original de tamaño n× n, la ampliamos con la matriz identidad del mismo tamaño,
obteniendo una nueva matriz de tamaño n × 2n. A esta nueva matriz le aplicamos
la eliminación Gauss-Jordan de forma muy similar al Algoritmo 1.15, para finalmente
obtener una matriz de tamaño n × 2n, que tiene como submatriz la matriz inversa en
lugar de la identidad.
.:Algoritmo 1.27
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 7 , 2 ] ,
4 [6 , 2 , 2] ,
5 [ 7 , 5 , 2 ] ] , dtype=f l o a t )
6
7 p r i n t "La m a t r i z A= \n" , A
8 p r i n t "__________________________ \n"
9
10 n=np . shape (A) [ 0 ]
11
12 ## para c o n c a t e n a r l a m a t r i z A con l a m a t r i z i d e n t i d a d
13 A = np . c o n c a t e n a t e ( (A, np . e y e ( n ) ) , a x i s =1)
14
15 p r i n t "La m a t r i z A aumentada con l a i d e n t i d a d : A= \n" , A
16 p r i n t "__________________________ \n"
17
18 f i l a s , columnas= np . shape (A)
19
20 f o r i i n ra n g e ( f i l a s ) :
21 A[ i , : ] =A[ i , : ] / A[ i , i ]
22 f o r j i n ra n g e ( i +1 , columnas− f i l a s ) :
23 A[ j , : ] =A[ j , : ] −A[ i , : ] ∗ A[ j , i ]
24
25 f o r i i n r e v e r s e d ( ra n g e ( f i l a s ) ) :
26 f o r j i n r e v e r s e d ( ra n g e ( 0 , i ) ) :
27 A[ j , : ] =A[ j , : ] −A[ i , : ] ∗ A[ j , i ]
28
29 ## para o b t e n e r l a s u b m a tri z con l a i n v e r s a
30 B=A [ 0 : columnas , f i l a s : columnas ]
31
32 print " la m a t r i z i n v e r s a de A: \n" , B
1 >>>
2 La m a t r i z A=
3 [ [ 1. 7. 2.]
4 [ 6. 2. 2.]
5 [ 7. 5. 2.]]
6 __________________________
7
8 La m a t r i z A aumentada con l a i d e n t i d a d : A=
9 [ [ 1. 7. 2. 1. 0. 0.]
10 [ 6. 2. 2. 0. 1. 0.]
11 [ 7. 5. 2. 0. 0. 1.]]
12 __________________________
13
14 la m a t r i z i n v e r s a de A:
15 [ [ − 0 . 1 5 −0.1 0.25]
16 [ 0 . 0 5 −0.3 0.25]
17 [ 0.4 1.1 −1. ]]
18 >>>
.:Ejercicios 1.5
a) d)
1 5 9
6 −7 3 1 0 0
1 2 3 11 1 0
3 −5 1
b)
0 3 7
5 0 2 e)
1 2 0
2 5 8 7
c) 4
1 5 6
5 3 2
0 10 2 2 2
2 3
0 0 1 5 1 1 1
Encuentre la inversa de dicha matriz. ¿Qué puede concluir del ejercicio?, ¿es posible
generalizar para matrices diagonales de mayor tamaño?.
3. Dada las matrices:
2 −4 9 11
A= , y B=
1 9 2 −2
Calcule:
t −1
a) A−1 + B −1
−1
b) At B A + B 2
t
c) B t At A + B −1
d ) A At B −1 B
a) b)
1 2 −6 2 8 −7
−2 −4 5 3 12 1
2 4 −12 3 12 0
74 1.6. Sistemas de ecuaciones lineales y la inversa de una matriz
c) e)
3 −8 9 3 7 6 0
0 7 0 7 4 0 0
0 0 1 6 0 5 1
d) 0 0 1 9
1 0 0
2 1 0
3 −8 1
5. Usando los ciclos for de Python, implemente la función inversaMatriz(A), tal que
dada una matriz A, devuelva la inversa en la matriz B como se muestra en el
siguiente código:
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ − 4 , 2 , 5 , 4 ] ,
4 [ 1 , −2 , 0 , 5 ] ,
5 [ 6 , −9, 4 , − 9 ] ] , dtype=f l o a t )
6
7
8 d e f i n v e r s a M a t r i z (A) :
9 .
10 .
11 .
12 .
13 r e t u r n B # donde B e s l a i n v e r s a de A
14
15 B=i n v e r s a M a t r i z (A)
16 print B
Ax = b
A−1 Ax = A−1 b
A−1 A x = A−1 b
In x = A−1 b
x = A−1 b (1.2)
El vector x obtenido en (1.2) es la solución al sistema.
.:Ejemplo 1.24 Encuentre la forma matricial del siguiente sistema, halle la solución
utilizando la inversa de la matriz de coeficientes:
x + 9y + 3z = 5
11x − 2y + z = −2
x − 4y − 3z = 1
Solución:
La matriz de cofactores
1 9 3
A = 11 −2 1
1 −4 −3
cuya inversa es:
1 3 3
19 38 38
−1
17 3 16
A =
95 − 95 95
− 21
95
13
190
101
− 190
76 1.6. Sistemas de ecuaciones lineales y la inversa de una matriz
.:Algoritmo 1.28
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 4 , 3 , 1] ,
4 [11 , 1 , 7] ,
5 [ 2 , 1 , − 1 ] ] , dtype=f l o a t )
6
7 p r i n t "La m a t r i z de c o e f i c i e n t e s A \n " , A
8 p r i n t " \n________________________\n"
9
10 b = np . a r r a y ( [ [ − 5 ] ,
11 [4] ,
12 [ 1 ] ] , dtype=f l o a t )
13
14 p r i n t " El v e c t o r b de t e r m i n o s i n d e p e n d i e n t e s : b= \n" , b
15 B = np . l i n a l g . i n v (A)
16 X=B . dot ( b )
17
18 p r i n t " \n________________________\n"
19 p r i n t " \n La s o l u c i o n e s X=\n" , X
1. Matrices y vectores 77
1 >>>
2 La m a t r i z de c o e f i c i e n t e s A
3 [[ 4. 3. 1.]
4 [ 11. 1. 7.]
5 [ 2. 1. −1.]]
6
7 ________________________
8
9 El v e c t o r b de t e r m i n o s i n d e p e n d i e n t e s : b=
10 [[ −5.]
11 [ 4.]
12 [ 1.]]
13
14 ________________________
15
16
17 La s o l u c i o n e s X=
18 [ [ 1.46153846]
19 [ −3.19230769]
20 [ −1.26923077]]
21 >>>
.:Ejercicios 1.6
12 d e f s o l u c i o n S i s t e m a (A, b ) :
13 .
14 .
15 .
16 .
17 r e t u r n X # donde X e s l a s o l u c i o n a l s i e t m a AX=b
18
19 X=s o l u c i o n S i s t e m a (A, b )
20 print X
2. Valide el algoritmo del punto anterior, para ver las múltiples soluciones si el sistema
dado es singular.
3. Use el Algoritmo anterior, para implementar una nueva función, que resuelva el
sistema con matrices de coeficientes que tengan más filas que columnas (obviamente
no podemos usar la inversa). ¿Es posible que tengan solución única, sistemas que
tengan matrices de coeficientes con más columnas que filas?
4. Con el algoritmo anterior, determine si los siguientes sistemas tienen solución única,
múltiples soluciones o no tienen solución:
a) d)
x − 2y + 4z = 6
x + y − 9z = 11 x+y+z = 0
2y − 7z = −3 −11x + 3y + 3z = 1
7x − 2y − 11z = 11
b)
4x − 2z = −6
4x + 11y + 3z = 1
3x − 9y − z = 3
e)
6x − 18y − 2z = 6
c) 4x + z = 1
4x + 11y + 3z = 1 x − 9y + 6z = 4
3x − 9y − z = 3 x − 5y + 3z = 1
6x − 18y − 2z = 6 x − 4y − z = 1
“Ama de veras a su enemigo el que no se duele de la injuria
que se le hace, sino que, por el amor de Dios, se requema por el
pecado que hay en su alma. Y muéstrele su amor con obras.”
San Francisco de Asís
Factorización de matrices
2
2.1. Matrices elementales
Para empezar, recordemos las operaciones elementales por fila que vimos en la sección
1.2.1, estas operaciones son clave para entender el proceso de factorización de una matriz.
Al igual que en la aritmética, los números primos son la base de los números naturales, de
igual forma ocurre para las matrices. Sin embargo, en este caso hablaremos de matrices
elementales y no de números.
.:Ejemplo 2.1
79
80 2.1. Matrices elementales
.:Ejemplo 2.2
Sea
1 −4 6
A = 0 1 −4
9 0 9
Aplicamos la operación elemental f3 → f3 + (−9)f1
1 −4 6
A= 0 1 −4 (2.1)
0 36 −45
Bien, Ahora tomaremos la matriz I3 y le aplicaremos la misma operación elemental
f3 → f3 + (−9)f1 , tenemos
1 0 0
E= 0 1 0
−9 0 1
Ahora consideremos el producto EA
1 0 0 1 −4 6 1 −4 6
0 1 0 0 1 −4 = 0 1 −4 (2.2)
−9 0 1 9 0 9 0 36 −45
Las ecuaciones (2.1) y (2.2), muestran que es posible reemplazar las operaciones
elementales por fila, por la multiplicación de matrices elementales.
2. Factorización de matrices 81
.:Ejemplo 2.3
Sea
6 3 2
B= 4 5 8
4 8 9
La operación elemental f1 ⇆ f3 podemos reemplazarla por la matriz elemental E, la cual
obtenemos al aplicarle a la matriz I3 dicha operación:
0 0 1
E= 0 1 0
1 0 0
Ahora multiplicamos por la izquierda y obtenemos
0 0 1 6 3 2 4 8 9
0 1 0 4 5 8 = 4 5 8
1 0 0 4 8 9 6 3 2
La multiplicación de E por B, aplicó el mismo efecto que la operación elemental f1 ⇆ f3 .
.:Ejemplo 2.4
Sea A,
1 4 2
A= 5 9 3
4 2 1
Queremos realizar la operación f3 → (2)f3 . De nuevo, tomamos E que se obtiene al
aplicarle a la matriz I3 la operación elemental f3 → (2)f3
1 0 0
E= 0 1 0
0 0 2
1 0 0 1 4 2 1 4 2
0 1 0 5 9 3 = 5 9 3
0 0 2 4 2 1 8 4 2
Los ejemplos anteriores, muestran que las operaciones elementales por fila, se pueden
reemplazar por matrices elementales.
82 2.1. Matrices elementales
.:Teorema 2.1 Sea A una matriz de tamaño n × n y E una matriz elemental de tamaño
n×n. La matriz EA es la misma que se obtiene al realizar sobre las filas de A la operación
elemental correspondiente a la matriz E.
El teorema 2.1 nos muestra que las operaciones elementales por fila, se pueden visualizar
como la multiplicación de matrices elementales. El siguiente ejemplo tomado de [11],
muestra que podemos convertir una matriz invertible, en una matriz identidad del mismo
tamaño usando matrices elementales.
Ahora
1 0 1 3 1 3
=
0 −1 0 −8 0 1
| {z 8 }
E2
Luego
1 −3 1 3 1 0
=
0 1 0 1 0 1
| {z }
E3
Es decir
E3 E2 E1 A = I
El siguiente teorema, muestra una de las características más importantes de las matrices
elementales.
2. Factorización de matrices 83
Luego E3 E3−1 = I
Las matrices elementales inversas, se construyen fácilmente, sólo debemos tener en cuenta
los siguiente aspectos:
Esto nos dice que este tipo de procesos sólo es posible para matrices invertibles.
84 2.1. Matrices elementales
Finalmente
1 0 1 0 1 3 1 0 1 0 1 3
=
5 1 −5 1 5 7 5 1 0 −8 0 1
| {z }| {z } | {z } | {z } | {z } | {z }
E1−1 E1 A E1−1 E2−1 E3−1
1 3 1 0 1 0 1 3
=
5 7 5 1 0 −8 0 1
| {z } | {z }| {z } | {z }
A E1−1 E2−1 E3−1
2. Factorización de matrices 85
.:Algoritmo 2.1
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 5 , − 9 ] ,
4 [6 , −2 ,4] ,
5 [ 7 , 2 , − 5 ] ] , dtype=f l o a t )
6
7
8 p r i n t "La m a t r i z A= "
9 print A
10
11
12 d e f O p e ra c i o n E l e m e n t a l 1 (A, i , k ) :
13 A[ i , : ] = k∗A[ i , : ]
14 return A
15
16
17 d e f O p e ra c i o n E l e m e n t a l 2 (A, i , j , k ) :
18 A[ i , : ] =A[ i , : ] + k ∗A[ j , : ]
19 return A
20
21
22 d e f O p e ra c i o n E l e m e n t a l 3 (A, i , j ) :
23 f o r k i n ra n g e ( np . shape (A[ i , : ] ) [ 0 ] ) :
24 c=A[ i , k ]
25 A[ i , k ]=A[ j , k ]
26 A[ j , k ]= c
27 return A
28
29
30 print " "
31 print " O p e ra c i o n e l e m e n t a l que m u l t i p l i c a una f i l a por un e s c a l a r "
32 print "En e s t e c a s o , l a f i l a 1 por −3.5 "
33 print O p e ra c i o n E l e m e n ta l 1 (A, 1 , − 3 . 5 )
34
35 print " "
36 print " O p e ra c i o n e l e m e n t a l que "
37 print "suma a una f i l a e l p ro d u c to de un e s c a l a r por o t r a f i l a "
38 print "En e s t e c a s o , l a u l t i m a f i l a mas l a p ri m e ra m u l t i p l i c a d a por −7"
39 print O p e ra c i o n E l e m e n ta l 2 (A, 2 , 0 , − 7 )
40
41 print " "
42 print " O p e ra c i o n e l e m e n t a l que "
43 print " i n t e r c a m b i a dos f i l a s "
44 print "En e s t e c a s o , l a u l t i m a f i l a y l a p ri m e ra "
45 print O p e ra c i o n E l e m e n ta l 3 (A, 0 , 2 )
86 2.1. Matrices elementales
1 >>>
2 La m a t r i z A=
3 [ [ 1. 5 . −9.]
4 [ 6 . −2. 4.]
5 [ 7. 2. −5.]]
6
7 O p e ra c i o n e l e m e n t a l que m u l t i p l i c a una f i l a por un e s c a l a r
8 En e s t e c a s o , l a f i l a 1 por −3.5
9 [[ 1. 5. −9.]
10 [ −21. 7 . −14.]
11 [ 7. 2. −5.]]
12
13 O p e ra c i o n e l e m e n t a l que
14 suma a una f i l a e l p ro d u c to de un e s c a l a r por o t r a f i l a
15 En e s t e c a s o , l a u l t i m a f i l a mas l a p ri m e ra m u l t i p l i c a d a por −7
16 [[ 1. 5. −9.]
17 [ −21. 7 . −14.]
18 [ 0 . −33. 58.]]
19
20 O p e ra c i o n e l e m e n t a l que
21 i n t e r c a m b i a dos f i l a s
22 En e s t e c a s o , l a u l t i m a f i l a y l a p ri m e ra
23 [[ 0 . −33. 58.]
24 [ −21. 7 . −14.]
25 [ 1. 5. −9.]]
26 >>>
.:Algoritmo 2.2
1 i m p o rt numpy a s np
2
3 d e f O p e ra c i o n E l e m e n t a l 1 (A, i , k ) :
2. Factorización de matrices 87
4 A[ i , : ] = k∗A[ i , : ]
5 return A
6
7
8 d e f O p e ra c i o n E l e m e n t a l 2 (A, i , j , k ) :
9 A[ i , : ] =A[ i , : ] + k ∗A[ j , : ]
10 return A
11
12
13 d e f O p e ra c i o n E l e m e n t a l 3 (A, i , j ) :
14 f o r k i n ra n g e ( np . shape (A[ i , : ] ) [ 0 ] ) :
15 c=A[ i , k ]
16 A[ i , k ]=A[ j , k ]
17 A[ j , k ]= c
18 return A
19
20
21 d e f M a tri z E l e m e n ta l 1 ( n , i , k ) :
22 I=np . e y e ( n )
23 A=O p e ra c i o n E l e m e n ta l 1 ( I , i , k )
24 return A
25
26
27 p r i n t ""
28 p r i n t M a tri z E l e m e n t a l 1 ( 3 , 0 , 0 . 5 )
29
30
31 d e f M a tri z E l e m e n ta l 2 ( n , i , j , k ) :
32 I=np . e y e ( n )
33 A=O p e ra c i o n E l e m e n ta l 2 ( I , i , j , k )
34 return A
35
36 p r i n t ""
37 p r i n t M a tri z E l e m e n t a l 2 ( 4 , 2 , 0 , − 2 . 0 )
38
39 d e f M a tri z E l e m e n ta l 3 ( n , i , j ) :
40 I=np . e y e ( n )
41 A=O p e ra c i o n E l e m e n ta l 3 ( I , i , j )
42 return A
43
44 p r i n t ""
45 p r i n t M a tri z E l e m e n t a l 3 ( 5 , 0 , 4 )
1 >>>
2 [ [ 0.5 0. 0. ]
3 [ 0. 1. 0. ]
4 [ 0. 0. 1. ] ]
88 2.1. Matrices elementales
5
6 [ [ 1. 0. 0. 0.]
7 [ 0. 1. 0. 0.]
8 [ −2. 0. 1. 0.]
9 [ 0. 0. 0. 1.]]
10
11 [ [ 0. 0. 0. 0. 1.]
12 [ 0. 1. 0. 0. 0.]
13 [ 0. 0. 1. 0. 0.]
14 [ 0. 0. 0. 1. 0.]
15 [ 1. 0. 0. 0. 0.]]
16 >>>
El Algoritmo 2.2, implementa tres funciones que retornan los tres tipos de matrices
elementales, de acuerdo a cada una de las operaciones elementales por fila:
MatrizElemental1(n,i,k): Esta función, retorna la matriz elemental, que resulta de
reemplazar una fila por ella misma multiplicada por un escalar. El parámetro n es
el tamaño de la matriz, i es la fila y k es el escalar.
En la salida del Algoritmo 2.2, vemos los tres tipos de matrices elementales:
0.5 0 0
I3 = 0 1 0
0 0 1
1 0 0 0
0 1 0 0
I4 =
−2 0 1 0
0 0 0 1
0 0 0 0 1
0 1 0 0 0
I5 = 0 0 1 0 0
0 0 0 1 0
1 0 0 0
2. Factorización de matrices 89
.:Algoritmo 2.3
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 3 ] ,
4 [ 5 , 7 ] ] , dtype=f l o a t )
5
6 p r i n t "La m a t r i z A= "
7 print A
8
9 d e f O p e ra c i o n E l e m e n t a l 1 (A, i , k ) :
10 A[ i , : ] = k∗A[ i , : ]
11 return A
12
13 d e f O p e ra c i o n E l e m e n t a l 2 (A, i , j , k ) :
14 A[ i , : ] =A[ i , : ] + k ∗A[ j , : ]
15 return A
16
17 d e f O p e ra c i o n E l e m e n t a l 3 (A, i , j ) :
18 f o r k i n ra n g e ( np . shape (A[ i , : ] ) [ 0 ] ) :
19 c=A[ i , k ]
20 A[ i , k ]=A[ j , k ]
21 A[ j , k ]= c
22 return A
23
24 d e f M a tri z E l e m e n ta l 1 ( n , i , k ) :
25 I=np . e y e ( n )
26 A=O p e ra c i o n E l e m e n ta l 1 ( I , i , k )
27 return A
28
29
30 d e f M a tri z E l e m e n ta l 2 ( n , i , j , k ) :
31 I=np . e y e ( n )
32 A=O p e ra c i o n E l e m e n ta l 2 ( I , i , j , k )
33 return A
34
35 d e f M a tri z E l e m e n ta l 3 ( n , i , j ) :
36 I=np . e y e ( n )
37 A=O p e ra c i o n E l e m e n ta l 3 ( I , i , j )
38 return A
39
40
41 p r i n t ""
42
43 p r i n t " M u l t i p l i c a m o s por l a s M a t r i c e s E l e m e n t a l e s "
44 p r i n t " Para c o n v e r t i r l a m a t r i z A en l a m a t r i z i d e n t i d a d "
90 2.1. Matrices elementales
45
46 E1=M a tri z E l e m e n t a l 2 ( 2 , 1 , 0 , − 5 )
47 p r i n t "La m a t r i z e l e m e n t a l E1\n" , E1
48 p r i n t " a l m u l t i p l i c a r E1 por A obtenemos : "
49 A=E1 . dot (A)
50 print A
51
52 print " "
53
54 E2=M a tri z E l e m e n t a l 1 ( 2 , 1 , − 1 . 0 / 8 . 0 )
55 p r i n t "La m a t r i z e l e m e n t a l E2\n" , E2
56 p r i n t " a l m u l t i p l i c a r E2 por A obtenemos : "
57 A=E2 . dot (A)
58 print A
59
60 print " "
61
62 E3=M a tri z E l e m e n t a l 2 ( 2 , 0 , 1 , − 3 . 0 )
63 p r i n t "La m a t r i z e l e m e n t a l E3\n" , E3
64 p r i n t " a l m u l t i p l i c a r E3 por A obtenemos : "
65 A=E3 . dot (A)
66 print A
1 >>>
2 La m a t r i z A=
3 [ [ 1. 3.]
4 [ 5. 7.]]
5
6 M u l t i p l i c a m o s por l a s M a t r i c e s E l e m e n t a l e s
7 Para c o n v e r t i r l a m a t r i z A en l a m a t r i z i d e n t i d a d
8 La m a t r i z e l e m e n t a l E1
9 [ [ 1. 0.]
10 [ −5. 1.]]
11 a l m u l t i p l i c a r E1 por A obtenemos :
12 [ [ 1. 3.]
13 [ 0. −8.]]
14
15 La m a t r i z e l e m e n t a l E2
16 [ [ 1. 0. ]
17 [ −0. −0.125]]
18 a l m u l t i p l i c a r E2 por A obtenemos :
19 [ [ 1. 3.]
20 [ 0. 1.]]
21
22 La m a t r i z e l e m e n t a l E3
23 [ [ 1 . −3.]
24 [ 0. 1.]]
2. Factorización de matrices 91
25 a l m u l t i p l i c a r E3 por A obtenemos :
26 [ [ 1. 0.]
27 [ 0. 1.]]
28 >>>
2.2. Factorización A = LU
Esta factorización requiere del concepto de matriz Triangular:
.:Ejemplo 2.8
4 5 2 1 0 0
1 0
A = 0 −1 2 , B= 9 1 0 , C=
0 1
0 0 −9 −4 2 1
Las matrices A, B y C son matrices triangulares, en el caso de A es triangular superior,
B es triangular inferior y C es una matriz identidad que es superior e inferior.
El siguiente teorema, muestra como están relacionadas las matrices elementales con las
matrices triangulares.
.:Teorema 2.4 Sea A una matriz de n×n, entonces A se puede escribir como el producto
de matrices elementales E1 , E2 . . . Ek y una matriz triangular superior U , teniendo en
cuenta que las matrices elementales están a la izquierda y la matriz U está a la derecha.
92 2.2. Factorización A = LU
El teorema nos dice que es posible obtener la representación de una matriz, por medio del
producto de matrices elementales y una matriz triangular superior; un ejemplo de dicha
representación lo podemos ver en la matriz del ejemplo 2.5:
1 3
A=
5 7
Ahora bien, en el ejemplo 2.7, vemos que A se puede obtener como el producto de matrices
elementales por U .
1 3 1 0 1 0 1 3
=
5 7 5 1 0 −8 0 1
| {z } | {z } | {z } | {z }
A E1−1 E2−1 E3−1 =U
| {z } | {z }
Matrices elementales Matriz Triangular Superior
Pero, para continuar, necesitamos saber un poco más sobre el producto de matrices
triangulares:
.:Ejemplo 2.9
.:Ejemplo 2.10
2. Factorización de matrices 93
A = LU
Donde L es una matriz triangular inferior con unos en la diagonal y U es una matriz
triangular superior.
.:Ejemplo 2.11
Dada la matriz A
4 2
A=
−7 5
expresemos A como el producto LU :
1 0 4 2 4 2
=
1.75 1 −7 5 0 8.5
| {z }| {z }
E1 A
4 2 1 0 4 2
=
−7 5 −1.75 1 0 8.5
| {z } | {z }| {z }
A L U
En el ejemplo anterior, sólo fue necesario encontrar una matriz elemental y su inversa,
pero para matrices de mayor tamaño es necesario obtener más matrices elementales.
.:Algoritmo 2.4
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 6 , 5, 7] ,
5 [4 , 2 , −3] ,
6 [7 , 2, 9 ] ] , dtype=f l o a t )
7
8 p r i n t "La m a t r i z A: \ n" , A
9 print " "
10
11 n=np . shape (A) [ 0 ]
12
13 U=copy . copy (A)
14
15 f o r i i n ra n g e ( n−1) :
16 f o r j i n ra n g e ( i +1 , n ) :
17 TEMP=−1∗U[ j , i ] /U[ i , i ]
18 U[ j , : ] =U[ j , : ] + TEMP∗U[ i , : ]
19
20 p r i n t "La M a tri z U: \ n" , U
21
22 print " "
23
24 L=np . e y e ( n )
25
26 L [ 1 : n , 0 ] =A [ 1 : n , 0 ] / U[ 0 , 0 ]
27 f o r i i n ra n g e ( 1 , n ) :
28 f o r j i n ra n g e ( i +1 ,n ) :
29 TEMP=0
30 f o r l i n ra n g e ( i ) :
31 TEMP = TEMP + L [ j : n , 0 ] ∗ U[ l , i ]
2. Factorización de matrices 95
1 >>>
2 La m a t r i z A:
3 [ [ 6. 5. 7.]
4 [ 4. 2 . −3.]
5 [ 7. 2. 9.]]
6
7 La M a tri z U:
8 [[ 6 . 0 0 0 0 0 0 0 0 e+00 5 . 0 0 0 0 0 0 0 0 e+00 7 . 0 0 0 0 0 0 0 0 e +00]
9 [ 0 . 0 0 0 0 0 0 0 0 e+00 −1.33333333 e+00 −7.66666667 e +00]
10 [ 0 . 0 0 0 0 0 0 0 0 e+00 −4.44089210 e −16 2.28750000 e +01]]
11
12 la M a tri z L :
13 [[ 1. 0. 0. ]
14 [ 0.66666667 1. 0. ]
15 [ 1.16666667 2.875 1. ]]
16
17 La m u l t i p l i c a c i o n LU :
18 [ [ 6. 5. 7.]
19 [ 4. 2 . −3.]
20 [ 7. 2. 9.]]
21 >>>
Una vez calculamos la matriz U , seguimos con la matriz L. El proceso es muy similar, sólo
que antes de empezar el ciclo, tomamos L como la matriz identidad (línea 22) y calculamos
los valores para la primera columna (línea 26): L[1:n,0]=A[1:n,0]/U[0,0]; luego, en el ciclo
96 2.2. Factorización A = LU
for, calculamos cada valor, teniendo en cuenta que las listas sólo representan los vectores
de la matriz L de la diagonal hacia abajo; el valor se almacena en una variable temporal,
y luego se actualiza cada columna.
Este Algoritmo toma la matriz A y devuelve las matrices L y U , al final comprueba que
la multiplicación de L por U es A.
6 5 7 1 0 0 6.00000000e + 00 5.00000000e + 00 7.00000000e + 00
4 2 −3 = 0.66666667 1 0 0.00000000e + 00 −1.33333333e + 00 −7.66666667e + 00
7 2 9 1.16666667 2.875 1 0.00000000e + 00 −4.44089210e − 16 2.28750000e + 01
| {z } | {z }| {z }
A L U
En este caso, la matriz U , tiene en su componente 3,2 el valor −4.44089210e − 16, que
debería ser un cero, pero Python toma este valor muy cercano a cero.
.:Ejercicios 2.1
a) e)
1 7
8 −1 3 2 5 8 7
5 −5 6 9 8
b)
−8 5 1 0 4
6 3
2 −9 9 5 4 9 8
c)
8 4 f)
0 2
d)
8 8 6
1.25 5.214 4.698
−4 5 8.325 0.2145 0.2544
6
3.32 5.62 0.214
1 2 3
2. Con base a los algoritmos 2.1, 2.2 y 2.4, implemente la función FactorizacionLU(A):
en Python, con las siguientes características:
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 3 , 5] ,
4 [ 4 , −2, 9 ] ,
5 [ − 1 , 7 , 6 ] ] , dtype=f l o a t )
6
7
8 d e f F a c t o r i z a c i o n L U (A) :
2. Factorización de matrices 97
9 .
10 .
11 .
12 return Lista
2.3. Factorización P A = LU
En la factorización A = LU , conlleva operaciones elementales por fila, que no requieren
matrices elementales de permutación. Por esta razón, se hace necesario tener en
cuenta, aquellas matrices que durante su proceso de eliminación, requieren una o más
permutaciones. El siguiente teorema ilustra la situación.
.:Teorema 2.8 Sea A una matriz cuadrada de n × n. Entonces existe una matriz de
permutación P tal que
P A = LU
donde L es una matriz triangular inferior con unos en la diagonal y U es una matriz
triangular superior.
Cada vez que hacemos una permutación, a una matriz de tamaño n × n, tenemos n − 1
posibles filas para hacer el intercambio. Esto genera que tengamos una matriz P , una
matriz L y una matriz U , diferentes por cada una delas filas con que se haga el intercambio.
.:Ejemplo 2.12
0 0 1 0 2 −1
PA = 0 1 0 2 5 0
1 0 0 1 −3 1
1 −3 1
= 2 5 0
0 2 −1
0 0 1 0 2 −1 1 0 0 d e f
0 1 0 2 5 0 = a 1 0 0 g h
1 0 0 1 −3 1 b c 1 0 0 i
| {z }| {z } | {z }| {z }
P A L U
1 −3 1 1 0 0 d e f
2 5 0 = a 1 0 0 g h
0 2 −1 b c 1 0 0 i
| {z } | {z }| {z }
PA L U
d
1 = 1 0 0 · 0
0
1 = d+0+0
1 = d
e f
−3 = 1 0 0 · g 1 = 1 0 0 · h
0 i
= e+0+0 = f +0+0
−3 = e 1 = f
d
2 = a 1 0 · 0
0
= ad + 0 + 0
2 = a(1)
2 = a
Luego,
e f
5 = a 1 0 · g 0 = a 1 0 · h
0 i
= ae + g + 0 = af + h + 0
5 = (2)(−3) + g = (2)(1) + h
11 = g −2 = h
d
0 = b c 1 · 0
0
0 = bd + 0 + 0
0 = b
100 2.3. Factorización P A = LU
e
2 = b c 1 · g
0
= be + cg + 0
2 = (0)(−3) + c(11)
2
= c
11
f
−1 = b c 1 · h
i
= bf + ch + i
2
= (0)(1) + (−2) + i
11
4
1 = − +i
11
7
− = i
11
Luego, La factorización P A = LU es la siguiente
0 0 1 0 2 −1 1 0 0 1 −3 1
0 1 0 2 5 0 = 2 1 0 0 11 −2
2 7
1 0 0 1 −3 1 0 11 1 0 0 − 11
| {z }| {z } | {z }| {z }
P A L U
.:Algoritmo 2.5
1 i m p o rt numpy a s np
2 from numpy . l i n a l g i m p o rt ∗
3 from s c i p y . l i n a l g i m p o rt ∗
2. Factorización de matrices 101
4
5 A = np . a r r a y ( [ [ 0 , −4, 5 ] ,
6 [ 1 6 , 21 , 9 ] ,
7 [ 3 7 , 4 2 , 2 1 ] ] , dtype=f l o a t )
8
9
10 P , L ,U=l u (A)
11
12 print "La m a t r i z de p e rm u ta c i o n P : \ n" ,P
13 print " "
14 print "La m a t r i z L t r i a n g u l a r i n f e r i o r con unos en l a d i a g o n a l : \ n" , L
15 print " "
16 print "La m a t r i z U t r i a n g u l a r s u p e r i o r : \ n" ,U
1 >>>
2 La m a t r i z de p e rm u ta c i o n P :
3 [ [ 0. 1. 0.]
4 [ 0. 0. 1.]
5 [ 1. 0. 0.]]
6
7 La matriz L t r i a n g u l a r i n f e r i o r con unos en l a d i a g o n a l :
8 [[ 1. 0. 0. ]
9 [ 0. 1. 0. ]
10 [ 0 . 4 3 2 4 3 2 4 3 −0.70945946 1 . ]]
11
12 La m a t r i z U t r i a n g u l a r s u p e r i o r :
13 [ [ 37. 42. 21. ]
14 [ 0. −4. 5. ]
15 [ 0. 0. 3.46621622]]
16 >>>
El Algoritmo 2.5, usa la función lu(A), la cual, devuelve como resultado tres matrices
P , L y U , razón por la cual, usamos la instrucción P,L,U=lu(A); donde en la matriz P
se almacena la matriz de permutación, en L la matriz triangular inferior con unos en la
diagonal y en U la matriz triangular superior; luego:
0 1 0 0 −4 5 1 0 0 37 42 21
0 0 1 16 21 9 = 0 1 0 0 −4 0
1 0 0 37 42 21 0.43243243 −0.70945946 1 0 0 3.46621622
| {z }| {z } | {z }| {z }
P A L U
102 2.3. Factorización P A = LU
.:Ejercicios 2.2
1. Para cada una de las matrices dadas a continuación, encuentre: una matriz de
permutación P , una triangular inferior L con unos en la diagonal y una matriz
escalonada U , tales que P A = LU
a) d)
0 1 −1
A=
1 −1 2
0 0 −1 2
b) −1 −1 1 2
A=
2 1 −3 6
0 0 3 −2
0 1 −1 4
0 0 2 −1
A=
3 −4 0
2
4 −5 −2 4 e)
c)
0 −1 2 1 3
5 −5 10 0 5 −1 1
−3 3 2 2 1 3 1 4
A= A=
1 −1
−2 2
−3 6 2
0 −1 0
2 −2 −4 1 0
1 −1 10 2 5
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 3 , 5] ,
4 [ 4 , −2, 9 ] ,
5 [ − 1 , 7 , 6 ] ] , dtype=f l o a t )
6
7
8 d e f FactorizacionPALU (A) :
9 .
10 .
11 .
12 return Lista
El algoritmo debe recibir como parámetros la matriz A, y debe devolver una lista
con las matrices P , L y U .
2. Factorización de matrices 103
.:Ejemplo 2.13
Veamos A−1 :
1 0 0
A−1 = 0 0 1
0 −1 0
y At
1 0 0
At = 0 0 1
0 −1 0
Luego A−1 = At .
.:Teorema 2.9 Sea A (en el campo de los R) una matriz de tamaño n × n con n pivotes.
Entonces existen matrices Q de tamaño n × n ortogonal y R de tamaño n × n triangular
superior e invertible tales que A = QR.1
.:Algoritmo 2.6
1 Para una demostración de este teorema ver [13].
104 2.4. Factorización QR.
1 i m p o rt numpy a s np
2 from numpy . l i n a l g i m p o rt ∗
3 from s c i p y . l i n a l g i m p o rt ∗
4
5 A = np . a r r a y ( [ [ 1 , −1, 5 ] ,
6 [6 , 5 , 9] ,
7 [ 9 , 4 , 1 ] ] , dtype=f l o a t )
8
9 p r i n t "La m a t r i z A: \ n" , A
10
11 Q,R=q r (A)
12
13 print " "
14 print "La m a t r i z Q o r t o g o n a l : \ n" ,Q
15 print " "
16 print "La m a t r i z R t r i a n g u l a r s u p e r i o r : \ n" ,R
1 >>>
2 La m a t r i z A:
3 [ [ 1 . −1. 5.]
4 [ 6. 5. 9.]
5 [ 9. 4. 1.]]
6
7 La m a t r i z Q o r t o g o n a l :
8 [[ −0.09205746 0.62309088 −0.77671306]
9 [ − 0 . 5 5 2 3 4 4 7 7 −0.68097364 − 0 . 4 8 0 8 2 2 3 7 ]
10 [ −0.82851716 0.38475011 0.4068497 ] ]
11
12 La m a t r i z R t r i a n g u l a r s u p e r i o r :
13 [[ −10.86278049 −5.98373502 −6.2599074 ]
14 [ 0. −2.48895867 −2.62855827]
15 [ 0. 0. −7.80411691]]
16 >>>
Ahora bien, aunque Numpy y Scipy traen implementada la función qr(), en el siguiente
Algoritmo, veremos como hacerlo, de acuerdo con el método de Gram-Schmidt. Dicho
2. Factorización de matrices 105
.:Algoritmo 2.7
1 i m p o rt numpy a s np
2 from numpy i m p o rt l i n a l g a s LA
3 i m p o rt copy
4
5
6 A = np . a r r a y ( [ [ 1 , 5, 7] ,
7 [4 , 2 , −3] ,
8 [7 , 2, 9 ] ] , dtype=f l o a t )
9
10
11 p r i n t "La m a t r i z A: \ n" , A
12 print " "
13
14 n , m = np . shape (A)
15
16 A1=copy . copy (A)
17
18 f o r j i n ra n g e ( n ) :
19 f o r k i n ra n g e ( j ) :
20 mult = A [ : , j ] . T . dot (A [ : , k ] ) / (A [ : , k ] . T . dot ( A [ : , k ] ) )
21 A [ : , j ] = A [ : , j ] − mult ∗A [ : , k ]
22
23
24 Q = np . z e r o s ( ( n ,m) )
25
26 f o r j i n ra n g e ( n ) :
27 i f LA . norm (A [ : , j ] ) < np . s q r t (2∗∗( −52) ) :
28 p r i n t " Las columnas de A son l i n a l m e n t e i n d e p e n d i e n t e s . "
29 Q [ : , j ] = A [ : , j ] /LA . norm (A [ : , j ] )
30
31 R = Q. T . dot (A1)
32
33 p r i n t "La m a t r i z Q: \ n" , Q
34 print " "
35 p r i n t "La m a t r i z R: \ n" , R
36
37 print " "
38 p r i n t "La m u l t i p l i c a c i o n de Q por R: \ n "
39 p r i n t Q. dot (R)
1 >>>
2 La m a t r i z A:
3 [ [ 1. 5. 7.]
4 [ 4. 2 . −3.]
5 [ 7. 2. 9.]]
6
7 La m a t r i z Q:
8 [ [ 0.12309149 0.97979782 0.15762208]
9 [ 0.49236596 0.07760775 −0.86692145]
10 [ 0 . 8 6 1 6 4 0 4 4 −0.1843184 0.47286624]]
11
12 La m a t r i z R :
13 [[ 8 . 1 2 4 0 3 8 4 0 e+00 3 . 3 2 3 4 7 0 2 6 e+00 7 . 1 3 9 3 0 6 4 8 e +00]
14 [ −2.22044605 e −16 4 . 6 8 5 5 6 7 7 8 e+00 4 . 9 6 6 8 9 5 8 7 e +00]
15 [ −4.16333634 e −16 −5.82867088 e −16 7.95991510 e +00]]
16
17 La m u l t i p l i c a c i o n de Q por R :
18
19 [ [ 1. 5. 7.]
20 [ 4. 2. −3.]
21 [ 7. 2. 9.]]
22 >>>
El Algoritmo 2.7, toma la matriz A y obtiene sus tamaños y saca una copia de la matriz
A en la matriz A1 (lineas 14 y 16). Luego, por medio de un ciclo, obtiene los valores
del proceso de Gram-Schmidt, almacenando en la variable mult, el cociente del producto
punto entre los vectores columna de A; luego, se usa este resultado para actualizar cada
columna de A con su correspondiente valor (líneas 18 a 21) .
Posteriormente, se genera la matriz Q como una matriz nula (línea 24) y por medio de un
ciclo, se construyen las columnas de Q, tomando las columnas de A y dividiéndolas por la
norma de cada columna (líneas 26 a 29). Finalmente, la matriz R se obtiene al multiplicar
la transpuesta de Q por la matriz original A, que esta almacenada en A1 (línea 31). Al
final del Algoritmo, multiplicamos de nuevo las matrices Q y R para corroborar que nos
da como resultado la matriz A (línea 39).
Tengamos en cuenta que la matriz R es una matriz triangular superior, pero nuestro
Algoritmo, nos devolvió la matriz:
8.12403840e + 00 3.32347026e + 00 7.13930648e + 00
R = −2.22044605e − 16 4.68556778e + 00 4.96689587e + 00
−4.16333634e − 16 −5.82867088e − 16 7.95991510e + 00
Aparentemente, la matriz R no es triangular superior, pero los valores por debajo de la
diagonal, son muy pequeños y se pueden redondear a cero sin ningún problema:
2. Factorización de matrices 107
8.12403840 3.32347026 7.13930648
R= 0 4.68556778 4.96689587
0 0 7.95991510
Finalmente, la matriz A en su factorización QR sería:
1 5 7 0.12309149 0.97979782 0.15762208 8.12403840 3.32347026 7.13930648
4 2 −3 = 0.49236596 0.07760775 −0.86692145 0 4.68556778 4.96689587
7 2 9 0.86164044 −0.1843184 0.47286624 0 0 7.95991510
| {z } | {z }| {z }
A Q R
.:Ejemplo 2.14
9
Como vemos, el resultado es un número positivo, de igual manera, si realizamos el mismo
procedimiento con otro vector, el resultado siempre será un número mayor que cero.
A = U tU
u11 u11 ··· u1k ··· u1j ··· u1n
.. .. .. ..
. . . .
u1k
··· ukk
ukk · · · ukj ··· ukn
.. .. .. ..
. . . .
u1j
··· ukj ··· ujj
ujj ··· ujn
. .. .. ..
.. . . .
u1n · · · ukn · · · ujn · · · unn unn
u211 = a11
Luego
√
u11 = a11
El producto de la primera fila de U t por la columna de j de U es:
k
X
u2ik = akk
i=1
k−1
X
u2ik + u2kk = akk
i=1
Entonces
v
u k−1
u X
ukk = ta kk − u2ik , para k = 2, . . . , n
i=1
Entonces:
k−1
X
akj − uik uij
i=1
ukj = para k = 2, . . . , n, j = k + 1, . . . , n
ukk
Éste método sólo devuelve una matriz, pues la segunda se obtiene al trasponer la primera;
en este caso la matriz triangular superior.
.:Ejemplo 2.15
1.73205081 −0.57735027 0
U = 0 0 0
0 0 0
Calculamos el nuevo pivote:
p
u22 = 3 − (−0.57735027)2 = 1.63299316
Ahora calculamos los valores de la segunda fila:
−1
u23 = = −0.61237244
1.63299316
Ahora, la matriz U está definida de la siguiente forma:
1.73205081 −0.57735027 0
U = 0 1.63299316 −0.61237244
0 0 0
Finalmente, el último pivote:
p
u33 = 3 − (−0.612372442 + 02 ) = 1.62018517
Nuestra matriz U es completa:
1.73205081 −0.57735027 0
U = 0 1.63299316 −0.61237244
0 0 1.62018517
El Algoritmo 2.8, muestra como hacer la factorización de Cholesky con la librería Numpy
de Python.
.:Algoritmo 2.8
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 3 , −1, 0 ] ,
5 [ −1 , 3 , −1] ,
6 [ 0 , −1, 3 ] ] , dtype=f l o a t )
7
8 UT = np . l i n a l g . c h o l e s k y (A)
9
10 U=UT.T
11
12 p r i n t "La m a t r i z A: \ n" , A
13 print " "
14
2. Factorización de matrices 111
1 >>>
2 La m a t r i z A:
3 [ [ 3 . −1. 0.]
4 [ −1. 3 . −1.]
5 [ 0 . −1. 3.]]
6
7 La m a t r i z UT:
8 [ [ 1 . 7 3 2 0 5 0 8 1 −0. 0. ]
9 [ −0.57735027 1 . 6 3 2 9 9 3 1 6 −0. ]
10 [ 0. −0.61237244 1 . 6 2 0 1 8 5 1 7 ] ]
11
12 La m a t r i z t r a s p u e s t a U:
13 [ [ 1 . 7 3 2 0 5 0 8 1 −0.57735027 0 . ]
14 [ −0. 1.63299316 −0.61237244]
15 [ 0. −0. 1.62018517]]
16
17 La m u l t i p l i c a c i o n de UT por U:
18 [ [ 3 . −1. 0.]
19 [ −1. 3 . −1.]
20 [ 0 . −1. 3.]]
21 >>>
.:Algoritmo 2.9
112 2.5. Factorización de Cholesky
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 5 , −1, 0 , 0 ] ,
5 [ −1 , 5 , −1, 0 ] ,
6 [ 0 , −1, 5 , −1] ,
7 [ 0 , 0 , −1, 5 ] ] , dtype=f l o a t )
8
9 n = np . shape (A) [ 0 ]
10 e p s= 1 . 0 e−4
11
12 U = np . z e r o s ( ( n , n ) )
13
14 f o r k i n ra n g e ( n ) :
15 t = A[ k , k ] − U [ 0 : k , k ] . T . dot (U [ 0 : k , k ] )
16 i f t <= e p s :
17 p r i n t ’ M a tri z no d e f i n i d a p o s i t i v a . \ n ’
18 b re a k
19 else :
20 U[ k , k]= np . s q r t ( t )
21 f o r j i n ra n g e ( k+1 ,n ) :
22 U[ k , j ] = ( A[ k , j ] − U [ 0 : k , k ] . T . dot (U [ 0 : k , j ] ) ) /U[ k , k ]
23
24 p r i n t "La m a t r i z A: \ n" , A
25 print " "
26 p r i n t "La m a t r i z U: \ n" , U
27
28 UT=U.T
29
30 print " "
31 p r i n t "La m a t r i z UT: \ n" , UT
32
33 print " "
34 p r i n t "La m u l t i l i c a c i o n de UT por U: \ n" , UT. dot (U)
1 >>>
2 La m a t r i z A:
3 [ [ 5 . −1. 0 . 0.]
4 [ −1. 5 . −1. 0.]
5 [ 0 . −1. 5 . − 1 . ]
6 [ 0. 0 . −1. 5.]]
7
8 La m a t r i z U:
9 [[ 2 . 2 3 6 0 6 7 9 8 −0.4472136 0. 0. ]
10 [ 0. 2 . 1 9 0 8 9 0 2 3 −0.45643546 0 . ]
11 [ 0. 0. 2.18898759 −0.45683219]
12 [ 0. 0. 0. 2.18890483]]
2. Factorización de matrices 113
13
14 La m a t r i z UT:
15 [ [ 2.23606798 0. 0. 0. ]
16 [ −0.4472136 2.19089023 0. 0. ]
17 [ 0. −0.45643546 2 . 1 8 8 9 8 7 5 9 0. ]
18 [ 0. 0. −0.45683219 2.18890483]]
19
20 La m u l t i l i c a c i o n de UT por U:
21 [ [ 5 . −1. 0 . 0.]
22 [ −1. 5 . −1. 0.]
23 [ 0 . −1. 5 . − 1 . ]
24 [ 0. 0 . −1. 5.]]
25 >>>
.:Ejercicios 2.3
a) e)
8 9
7 −2
−9 8 5 4 7
b) 4 −9 9 −9 8
3.254 9.2147 7 4 1 2 5
6.321 −5.012 0 2 1 4 5
c)
9.3214 6.012
0.01214 −0.874 f)
d)
7 −9 −6
5 8 7 −5 −8
4 10 3 −1
0 2 1
−9 8 0
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , 3 , 5] ,
4 [ 4 , −2, 9 ] ,
5 [ − 1 , 7 , 6 ] ] , dtype=f l o a t )
6
7
8 d e f F a c to ri z a c i o n Q R (A) :
9 .
10 .
11 .
12 return Lista
a) c)
1 0 16 12 8 −16
0 1 −12 18 −6 9
8 −6 5 −10
−16 9 −10 46
b)
d)
4 −1 0 4 1 4
−1 4 −1 1 5 5
0 −1 4 4 5 5
6. ¿La matriz diagonal de cualquier tamaño es definida positiva? explique ¿por qué?.
2. Factorización de matrices 115
117
118 3.1. Usando la factorización A = LU
Ax = b
Ax = b (3.1)
Ahora bien, podemos escribir A de la siguiente forma:
3. Solución de sistemas de ecuaciones lineales 119
A = LU (3.2)
Entonces, reemplazamos 3.2 en 3.1 y obtenemos:
LU x = b (3.3)
La ecuación 3.3 podemos reagruparla de la siguiente forma:
L(U x) = b (3.4)
En la ecuación 3.4, la matriz U es de tamaño n × n y el vector x es de tamaño n × 1,
luego su producto, al que llamaremos z, es de tamaño n × 1, de modo que:
Lz = b (3.5)
Ux = z
.:Ejemplo 3.1
Tomemos el sistema:
8x − 4y + 5z = 7
9x + y + 9z = −1
4x + 2y − z = 4
Tenemos la matriz A y el vector b:
8 −4 5 7
A= 9 1 9 , b = −1
4 2 −1 4
Al realizar la factorización A = LU obtenemos:
8.000000 −4.000000 5.000000
U = 0.000000 5.500000 3.375000
0.000000 0.000000 −5.954545
y
1.000000 0.000000 0.000000
L = 1.125000 1.000000 0.000000
0.500000 0.727273 1.000000
120 3.1. Usando la factorización A = LU
z1 = 7
1.125000z1 + z2 = −1
0.500000z1 + 0.727273z2 + z3 = 4
Es fácil hacer la sustitución regresiva, a simple vista:
z1 = 7
z2 = −1 − (1.125000z1) = −1 − (1.125000(7))
luego
z2 = −8.875
Finalmente
z3 = −0.5z1 − 0.727273z2
donde
8x − 4y + 5z = 7
+ 5.5y + 3.375z = −8.875
− 5.954545z = 6.9545479
De nuevo, la naturaleza triangular de la matriz, hace que el proceso sea relativamente
fácil:
3. Solución de sistemas de ecuaciones lineales 121
−5.954545z = 6.9545479
6.9545479
z =
−5.954545
= −1.1679394
8x − 4y + 5z = 7
7 + 4y − 5z
x =
8
7 + 4(−0.8969463) − 5(−1.1679394)
=
8
= 1.156489
8 −4 5 7
A= 9 1 9 , b = −1
4 2 −1 4
Tendríamos la matriz LU y el vector de la siguiente forma:
9.000000 1.000000 9.000000
LU = 0.888889 −4.888889 −3.000000
0.444444 −0.318182 −5.954545
1.000000
P = 1.000000
2.000000
Posteriormente, usamos la función de Numpy llamada lu_solve((LU, P), b), esta función
recibe dos parámetros, el primero es una tupla con la matriz LU y el vector P ; el segundo
parámetro es el vector b del sistema. Veamos el siguiente algoritmo:
.:Algoritmo 3.1
1 i m p o rt numpy a s np
2 from s c i p y . l i n a l g i m p o rt ∗
3
4 A = np . a r r a y ( [ [ 8 , −4, 5 ] ,
5 [9 , 1, 9] ,
6 [4 , 2 , − 1 ] ] , dtype=f l o a t )
7
8 b= np . a r r a y ( [ [ 7 , −1, 4 ] ] ) .T
9
10 LU, P = l u _ f a c t o r (A)
11
12 p r i n t "La m a t r i z A: \ n" ,A
13 print " "
14
15 p r i n t " El v e c t o r b : \ n" , b
16 print " "
17
18 p r i n t " El v e c t o r s o l u c i o n e s : \ n" , np . l i n a l g . s o l v e (A, b )
19 print " "
20
21 p r i n t " v e c t o r de p e rm u ta c i o n P : \ n" ,P
22 print " "
23
24 p r i n t "La m a t r i z LU : \ n" ,LU
25 print " "
26
27 p r i n t " El v e c t o r s o l u c i o n usando A=LU: \ n" , l u _ s o l v e ( ( LU, P) , b )
3. Solución de sistemas de ecuaciones lineales 123
1 >>>
2 La m a t r i z A:
3 [ [ 8 . −4. 5.]
4 [ 9. 1. 9.]
5 [ 4. 2. −1.]]
6
7 El v e c t o r b :
8 [ [ 7]
9 [ −1]
10 [ 4]]
11
12 El v e c t o r s o l u c i o n e s :
13 [ [ 1.15648855]
14 [ −0.89694656]
15 [ −1.16793893]]
16
17 v e c t o r de p e rm u ta c i o n P:
18 [1 1 2]
19
20 La m a t r i z LU :
21 [[ 9. 1. 9. ]
22 [ 0 . 8 8 8 8 8 8 8 9 −4.88888889 −3. ]
23 [ 0 . 4 4 4 4 4 4 4 4 −0.31818182 − 5 . 9 5 4 5 4 5 4 5 ] ]
24
25 El v e c t o r s o l u c i o n usando A=LU :
26 [ [ 1.15648855]
27 [ −0.89694656]
28 [ −1.16793893]]
29 >>>
Ax = b
multiplicaremos a ambos lados de la ecuación por Qt :
Qt Ax = Qt b
Al producto Qt A lo llamaremos R y a Qt b lo llamaremos c, entonces:
Qt A x = Qt b
|{z} |{z}
R c
Rx = c
Lo bueno de este proceso es que R es una matriz triangular superior1 , así que encontrar la
solución al sistema es relativamente fácil, pues sólo debemos hacer la sustitución regresiva
para encontrar el vector x que es la solución.
.:Ejemplo 3.2
8 −4 5 7
A= 9 1 9 , b = −1
4 2 −1 4
Su factorización A = QR es la siguiente:
−0.630488 0.735106 0.249207
Q = −0.709299 −0.415251 −0.569615
−0.315244 −0.535898 0.783221
−12.688578 1.182166 −9.220892
R= 0.000000 −4.427469 0.474171
0.000000 0.000000 −4.663723
Ahora, como ya tenemos R, sólo debemos encontrar c:
c = Qt b
−0.630488 −0.709299 −0.315244 7
c = 0.735106 −0.415251 −0.535898 −1
0.249207 −0.569615 0.783221 4
| {z } | {z }
Qt b
−4.965096
c = 3.417400
5.446944
Ahora resolvemos el nuevo sistema Rx = c, que en forma de sistema sería:
−4.663723x3 = 5.446944
5.446944
=
−4.663723
x3 = −1.16793893
126 3.2. Usando la factorización A = QR
3.417400 − 0.474171x3
=
−4.427469
x2 = −0.89694656
finalmente:
x1 = 1.15648855
.:Algoritmo 3.2
1
2 i m p o rt numpy a s np
3
4 A = np . a r r a y ( [ [ 8 , −4, 5 ] ,
5 [9 , 1, 9] ,
6 [4 , 2 , − 1 ] ] , dtype=f l o a t )
7
8 b= np . a r r a y ( [ [ 7 , −1, 4 ] ] ) .T
9
10 p r i n t "La m a t r i z A: \ n"
11 print A
12 print " "
13
14 p r i n t " El v e c t o r b : \ n"
15 print b
16 print " "
3. Solución de sistemas de ecuaciones lineales 127
17
18 Q, R = np . l i n a l g . q r (A)
19
20 p r i n t "La m a t r i z Q: \ n"
21 print Q
22 print " "
23
24 p r i n t "La m a t r i z R: \ n"
25 print R
26 print " "
27
28 c=Q. T . dot ( b )
29
30 print " "
31 p r i n t " El v e c t o r c : \ n"
32 print c
33
34 x=np . l i n a l g . s o l v e (R, c )
35
36 print " "
37 p r i n t " El v e c t o r s o l u c i o n x : \ n"
38 print x
1 >>>
2 La m a t r i z A:
3
4 [ [ 8 . −4. 5.]
5 [ 9. 1. 9.]
6 [ 4. 2. −1.]]
7
8 El v e c t o r b :
9
10 [ [ 7]
11 [ −1]
12 [ 4]]
13
14 La m a t r i z Q:
15
16 [[ −0.63048832 0.7351058 0.2492066 ]
17 [ − 0 . 7 0 9 2 9 9 3 7 −0.41525061 − 0 . 5 6 9 6 1 5 0 8 ]
18 [ − 0 . 3 1 5 2 4 4 1 6 −0.53589774 0 . 7 8 3 2 2 0 7 4 ] ]
19
20 La m a t r i z R :
21
22 [[ −12.68857754 1.18216561 −9.22089175]
23 [ 0. −4.42746931 0.4741713 ]
24 [ 0. 0. −4.6637235 ] ]
128 3.3. Usando la factorización de Cholesky
25
26
27 El v e c t o r c :
28
29 [[ −4.96509556]
30 [ 3.41740026]
31 [ 5.44694424]]
32
33 El v e c t o r s o l u c i o n x :
34
35 [ [ 1.15648855]
36 [ −0.89694656]
37 [ −1.16793893]]
38 >>>
Ax = b (3.6)
y teniendo en cuanta que A es una matriz simétrica definida positiva, la cual la podemos
representra como:
A = U tU (3.7)
Reemplazamos 3.7 en 3.6. Ahora necesitamos resolver
U tz = b (3.8)
El sistema de la ecuación 3.8 es relativamente fácil de resolver, debido, a que las matrices
U t y U son triangulares.
1.732051z1 = 3
−0.577350z1 + 1.632993z2 = −1
−0.612372z2 + 1.620185z3 = 2
La sustitución regresiva es relativamente fácil, debido a la forma de la matriz:
3
z1 = = 1.7320506
1.732051
Luego con z2
−0.577350z1 + 1.632993z2 = −1
−1 + 0.577350z1
z2 =
1.632993
z2 = −0.0000004
130 3.3. Usando la factorización de Cholesky
Finalmente z1 :
−0.612372z2 + 1.620185z3 = 2
2 + 0.612372z2
z3 =
1.620185
z3 = 1.2344268
Entonces:
1.7320506
z = −0.0000004
1.2344268
Ahora, usamos z para resolver el sistema U x = z:
1.732051 −0.577350 0.000000 x1 1.7320506
0.000000 1.632993 −0.612372 x2 = −0.0000004
0.000000 0.000000 1.620185 x3 1.2344268
donde:
1.620185x3 = 1.2344268
x3 = 0.7619048
Ahora x2 :
−0.0000004 + 0.612372x3
x2 =
1.632993
x2 = 0.2857139
Finalmente:
1.732051x1 − 0.577350x2 = 3
3 + 0.577350x2
x1 =
1.732051
x1 = 1.0952381
3. Solución de sistemas de ecuaciones lineales 131
.:Algoritmo 3.3
1 from U t i l i d a d p a r a L a t e x i m p o rt ∗
2 i m p o rt numpy a s np
3 #from numpy i m p o rt l i n a l g a s LA
4
5 i m p o rt copy
6
7 A = np . a r r a y ( [ [ 3 , −1, 0 ] ,
8 [ −1, 3 , −1 ] ,
9 [ 0 , −1, 3 ] ] , dtype=f l o a t )
10
11 b=np . a r r a y ( [ [ 3 , −1, 2 ] ] , dtype=f l o a t ) .T
12
13 UT = np . l i n a l g . c h o l e s k y (A)
14
15 U=UT.T
16
17 z= np . l i n a l g . s o l v e (UT, b )
18
19 x= np . l i n a l g . s o l v e (U, z )
20
21 p r i n t "La m a t r i z A: \ n" , A
22 print " "
23
24 p r i n t " El v e c t o r b : \ n" , b
25 print " "
26
27 p r i n t "La m a t r i z UT: \ n" , UT
28 print " "
29
30 p r i n t "La m a t r i z U: \ n" , UT. T
31 print " "
32
33 p r i n t " El v e c t o r z : \ n" , z
34 print " "
35
36 p r i n t " El v e c t o r x : \ n" , x
1 >>>
2 La m a t r i z A:
3 [ [ 3 . −1. 0.]
4 [ −1. 3 . −1.]
5 [ 0 . −1. 3.]]
6
7 El v e c t o r b :
8 [[ 3.]
9 [ −1.]
10 [ 2.]]
11
12 La m a t r i z UT:
13 [ [ 1 . 7 3 2 0 5 0 8 1 −0. 0. ]
14 [ −0.57735027 1 . 6 3 2 9 9 3 1 6 −0. ]
15 [ 0. −0.61237244 1 . 6 2 0 1 8 5 1 7 ] ]
16
17 La m a t r i z U:
18 [ [ 1 . 7 3 2 0 5 0 8 1 −0.57735027 0 . ]
19 [ −0. 1.63299316 −0.61237244]
20 [ 0. −0. 1.62018517]]
21
22 El v e c t o r z:
23 [[ 1 . 7 3 2 0 5 0 8 1 e +00]
24 [ 1 . 3 5 9 7 3 9 9 6 e −16]
25 [ 1.23442680 e +00]]
26
27 El vector x :
28 [[ 1.0952381 ]
29 [ 0.28571429]
30 [ 0.76190476]]
31
32 >>>
A primera vista, podemos pensar que es ineficiente usar dos veces la instrucción
[Link], pero recordemos que este método es muy rapido y sólo se hace con fines
pedagógicos. En la práctica, lo ideal sería crear un método que haga la sustitución regresiva
para solucionar los sistemas.
.:Ejercicios 3.1
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 5 , −1, 0 , 0]
4 [ −1 , 5 , −1, 0 ]
5 [ 0 , −1, 5 , −1]
6 [ 0, 0 , −1, 5 ] ] , dtype=f l o a t )
7
8 b=np . a r r a y ( [ [ 4 , −7, 1, 1 ] ] , dtype=f l o a t ) .T
9
10
11 d e f S o l S i s te m a s L U (A, b ) :
12 .
13 .
14 .
15 return x
3. De igual forma, repita el ejercicio del los numerales 1 y 2 pero con la factorización
de Cholesky.
Otro detalle que debemos tener en cuenta para los métodos iterativos, es el cálculo del
error. En nuestro caso, tenemos dos alternativas, en primer lugar, encontrar la diferencia
de las normas, entre los resultados de las diferentes iteraciones y en segundo lugar,
mediremos en términos de porcentajes, si el nuevo vector encontrado, se parece al vector
3. Solución de sistemas de ecuaciones lineales 135
b1 − (a12 x2 + · · · + a1n xn )
x1 =
a11
b2 − (a21 x1 + a23 x3 + · · · + a2n xn )
x2 =
a22
.. .. .. .. ..
. = . . . .
bi − ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) + ai(j+1) x(j+1) + · · · + ain xn
xi =
aii
.. .. .. .. ..
. = . . . .
bn − an1 x1 + an2 x2 + · · · + an(n−1) x(n−1)
xn = (3.10)
ann
3 Tambien se le conoce como Gauss-Jacobi, ver [17]
136 3.4. Método de Jacobi
(k−1) (k−1)
b1 − a12 x2 + · · · + a1n xn
(k)
x1 =
a11
(k−1) (k−1) (k−1)
b2 − a21 x1 + a23 x3 + · · · + a2n xn
(k)
x2 =
a22
.. .. .. .. ..
. = . . . .
(k−1) (k−1) (k−1) (k−1) (k−1)
bi − ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) + ai(j+1) x(j+1) + · · · + ain xn
(k)
xi =
aii
.. .. .. .. ..
. = . . . .
(k−1) (k−1) (k−1)
bn − an1 x1 + an2 x2 + · · · + an(n−1) x(n−1)
x(k)
n = (3.11)
ann
En general tendrá de la siguiente forma:
X n
(k−1)
bi − aij xj
i=1
(k) i 6= j
xi = i = 1, 2, . . . , n
aii
Este proceso, requiere que se comience con un valor inicial, en este caso es un vector al
que llamaremos x(0) . La escogencia de este vector inicial, puede o no retardar el proceso
de convergencia, se debe tener especial cuidado con la escogencia de este vector.
4 Cuando hablamos de un proceso iterativo, nos referimos a un proceso que se repite muchas veces,
haciendo pequeños cambios al interior del proceso, hasta llegar a un punto de parada determinado por
algún tipo de condición.
3. Solución de sistemas de ecuaciones lineales 137
x(k) − x(k−1)
<ǫ (3.12)
x(k)
.:Ejemplo 3.4
Tomemos el sistema:
5x + 2y + z = 1
x − 7y − 2z = 2
x − y + 6z = −1 (3.13)
Iteración 1:
138 3.4. Método de Jacobi
Cuadro 3.1: Seis primeras iteraciones usando Jacobi, para solucionar el sistema de la
ecuación (3.13), usando x(0) como el vector nulo.
A=L+D+U
Donde L es una matriz triangular inferior con ceros en la diagonal, D es una matriz
diagonal, la cual se va a obtener la diagonal de la matriz A y finalmente, la matriz U , la
cual será, una matriz triangular superior con ceros en la diagonal, es decir, si A = (aij )
de tamaño n × n, entonces:
a 0 0 ··· 0 0 a12 a13 ··· a1n
11
0 0 a23 ··· a2n
a21 0
.
.
a31 a32 0 0 a22 . ··· 0 .
.
A= + 0 0 a33 ··· 0 + 0 .
. . ..
. . . . . . .. . ..
. . . . . .
. . . . . . a(n−1)n
an1 an2 an3 ··· 0
| {z } 0 0 0 ··· ann 0
L
| {z } | {z }
D U
Ax = b
(L + D + U )x = b
Aplicamos la propiedad distributiva de las matrices:
(L + D + U )x = b
Lx + Dx + U x = b
Ahora despejamos Dx:
Lx + Dx + U x = b
Dx = −Lx − U x + b
140 3.4. Método de Jacobi
Dx = −(L + U )x + b
Sólo nos queda despejar la matriz D, la cual, es la única matriz que tiene inversa (L y U
no son invertibles) :
x = −D−1 (L + U )x + D−1 b
Esta nueva manera de ver el sistema, nos permite encontrar la forma iterativa matricial:
x(k) = T x(k−1) + c
Donde T = −D−1 (L + U ) y c = −D−1 b.
A primera vista, el método no parece muy eficiente, pues se debe calcular D−1 , pero
recordemos que la matriz D es una matriz diagonal de tamaño n × n que tiene la forma:
d11 0 · · · 0
0 d22 · · · 0
D= . . .. ..
.. .. . .
0 0 · · · dnn
Lo que nos dice que el cálculo de D−1 , no conlleva mucho esfuerzo computacional.
.:Ejemplo 3.5
3. Solución de sistemas de ecuaciones lineales 141
Tomemos el sistema:
1
Ahora, sólo debemos encontrar las matrices L, D y U
0.000000 −0.000000 0.000000 0.000000
0.026700 0.000000 −0.000000 −0.000000
L=
4.356120
0.332000 0.000000 0.000000
3.098700 −0.998000 0.324000 0.000000
4.345000 0.000000 0.000000 0.000000
0.000000 7.560100 0.000000 0.000000
D=
0.000000
0.000000 11.009800 0.000000
0.000000 0.000000 0.000000 21.971000
0.000000 −0.129000 0.345000 0.087100
0.000000 0.000000 −0.885400 −3.111200
U =
0.000000
0.000000 0.000000 0.712000
0.000000 −0.000000 0.000000 0.000000
T = −D−1 (L + U )
−0.000000 0.029689 −0.079402 −0.020046
−0.003532 −0.000000 0.117115 0.411529
=
−0.395658 −0.030155 −0.000000 −0.064670
−0.141036 0.045424 −0.014747 −0.000000
y
142 3.4. Método de Jacobi
c = D−1 b
1.305178
0.001299
=
0.069484
0.414106
x(k) = T x(k−1) + c
(k) (k−1)
x1 −0.000000 0.029689 −0.079402 −0.020046 x1 1.305178
(k) (k−1)
x2 −0.003532 −0.000000 0.117115 0.411529
x 0.001299
(k) = 2 +
x3 −0.395658 −0.030155 −0.000000 −0.064670 x(k−1) 0.069484
3
(k) −0.141036 0.045424 −0.014747 −0.000000 (k−1) 0.414106
x4 x4
El proceso iterativo se hace de la misma forma que el realizado con el sistema, el resultado
del lado derecho de la ecuación anterior, se introduce de nuevo en el proceso, de esta forma
obtenemos las nuevas soluciones.
Iteración 1:
1.23542002 −0.000000 0.029689 −0.079402 −0.020046 1 1.305178
0.52641103 −0.003532 −0.000000 0.117115 0.411529 1 0.001299
−0.42099947 = −0.395658 −0.030155 −0.000000
+
−0.064670 1 0.069484
0.30374676 −0.141036 0.045424 −0.014747 −0.000000 1 0.414106
Iteración 2:
1.34814626 −0.000000 0.029689 −0.079402 −0.020046 1.23542002 1.305178
0.07263108 −0.003532 −0.000000 0.117115 0.411529 0.52641103 0.001299
−0.45483787 = −0.395658 −0.030155 −0.000000
+
−0.064670 −0.42099947 0.069484
0.26998707 −0.141036 0.045424 −0.014747 −0.000000 0.30374676 0.414106
Iteración 3:
1.33803742 −0.000000 0.029689 −0.079402 −0.020046 1.34814626 1.305178
0.0543769 −0.003532 −0.000000 0.117115 0.411529 0.07263108 0.001299
−0.48357202 = −0.395658 +
−0.030155 −0.000000 −0.064670 −0.45483787 0.069484
0.23397535 −0.141036 0.045424 −0.014747 −0.000000 0.26998707 0.414106
3. Solución de sistemas de ecuaciones lineales 143
Cuadro 3.2: Seis primeras iteraciones usando Jacobi, para solucionar el sistema de la
ecuación (3.14), usando x(0) = (1, 1, 1, 1)t .
El cuadro 3.2, muestra las seis primeras iteraciones del sistema dado en la ecuación (3.14).
En nuestros ejemplos, usamos la forma planteada en (3.12), pues nos ofrece un error
relativo, frente a un error total, que en muchas ocasiones, no nos dice como es la diferencia
con respecto a las magnitudes trabajadas en el experimento.
El Cuadro 3.3, muestra las mismas iteraciones hechas en el Cuadro 3.2 del ejemplo 3.5,
pero en esta ocasión, obtenemos el error ε(k) .
x1 x2 x3 x4
(0)
x 1.000000 1.000000 1.000000 1.000000
x(1) 1.235420 0.526411 -0.420999 0.303747
ε(1) 19.055 % 89.96 % 337.52 % 229.22 %
x(2) 1.348146 0.072631 -0.454838 0.269987
ε(2) 8.36 % 624.77 % 7.43 % 12.50 %
x(3) 1.338037 0.054377 -0.483572 0.233975
ε(3) 0.75 % 33.56 % 5.94 % 15.39 %
x(4) 1.340499 0.036228 -0.476693 0.234996
ε(4) 0.18 % 50.09 % 1.44 % 0.43 %
x(5) 1.339393 0.037444 -0.477186 0.233723
ε(5) 0.08 % 3.24 % 0.103 % 0.54 %
x(6) 1.339494 0.036867 -0.476703 0.233941
ε(6) 0.007 % 1.56 % 0.101 % 0.093 %
x(7) 1.339434 0.037013 -0.476739 0.233893
ε(7) 0.0044 % 0.39 % 0.0076 % 0.0203 %
Cuadro 3.3: Siete primeras iteraciones usando Jacobi, para solucionar el sistema de la
ecuación (3.14), usando x(0) = (1, 1, 1, 1)t y teniendo en cuenta el error ε(k) .
En el Cuadro 3.3, las filas muestran los vectores solución encontrados en cada iteración.
Después de cada vector, se muestra el vector ε(k) (resaltado en gris) correspondiente a la
fila anterior; en él, podemos ver como el porcentaje de error va disminuyendo con el pasar
del proceso iterativo. Si embargo, la componente x2 , tarda más en llegar a un error menor
al 1 %, pues en la primera iteración tiene un porcentaje de error 89.96 %, posteriormente,
pasa a un error de 624.77 %, pero luego vuelve a 50.09 %, para finalmente llegar a 0.39 %.
3. Solución de sistemas de ecuaciones lineales 145
Cuadro 3.4: Seis primeras iteraciones usando Jacobi, para solucionar el sistema de la
ecuación (3.14), usando diferentes x(0) .
.:Algoritmo 3.4
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 4 . 3 4 5 , −0.129 , 0 . 3 4 5 , 0 . 0 8 7 1 ] ,
5 [ 0 . 0 2 6 7 , 7 . 5 6 0 1 , −0.8854 , − 3 . 1 1 1 2 ] ,
6 [4.35612 , 0.332 , 11.0098 , 0. 712] ,
7 [ 3 . 0 9 8 7 , −0.998 , 0 . 3 2 4 , 2 1 . 9 7 1 ] ] , dtype=f l o a t )
8
9 b=np . a r r a y ( [ [ 5 . 6 7 1 , 0 . 0 0 9 8 2 , 0 . 7 6 5 , 9 . 0 9 8 3 2 ] ] , dtype=f l o a t ) . T
10
11 tam=np . shape (A) [ 0 ]
12
13 temp=np . d i a g (A)
14 D=np . e y e ( np . shape (A) [ 0 ] )
15
16 f o r i i n ra n g e ( np . shape (A) [ 0 ] ) :
17 D[ i , i ]=temp [ i ]
18
19 L=np . t r i l (A) − D
20 U=np . t r i u (A) − D
21
22 T = −1∗(np . l i n a l g . i n v (D) . dot (L + U) )
23 C = np . l i n a l g . i n v (D) . dot ( b )
24
25 x0=np . a r r a y ( [ [ 0 . 5 , 0 . 5 , 0 . 5 , 0 . 5 ] ] , dtype=f l o a t ) . T
26
27 N=5 ## c a n t i d a d de i t e r a c i o n e s
28
29 M=copy . copy ( x0 )
30
31 f o r i i n ra n g e (N+1) :
32 x1=T . dot ( x0 )+C
33 M=np . c o n c a t e n a t e ( (M, x1 ) , a x i s =1)
34 x0=x1
35
36 p r i n t "La m a t r i z A: \ n" , A
37 print " "
38
39 p r i n t " El v e c t o r b=:\ n" , b
40 print " "
41
42 p r i n t "La s o l u c i o n r e a l e s : \ n" , np . l i n a l g . s o l v e (A, b )
43 print " "
44
45 p r i n t "La s o l u c i o n por J a c o b i usando %d i t e r a c i o n e s : \ n" % (N+1)
46 p r i n t x1
47
48 print " "
49 p r i n t " Las i t e r a c i o n e s : \n"
50 print M
3. Solución de sistemas de ecuaciones lineales 147
1 >>>
2 La m a t r i z A:
3 [[ 4.345 −0.129 0.345 0.0871 ]
4 [ 0.0267 7.5601 −0.8854 −3.1112 ]
5 [ 4.35612 0.332 11.0098 0.712 ]
6 [ 3.0987 −0.998 0.324 21.971 ]]
7
8 El v e c t o r b=:
9 [[ 5.671 ]
10 [ 0.00982]
11 [ 0.765 ]
12 [ 9.09832]]
13
14 La s o l u c i o n r e a l e s :
15 [ [ 1.33944017]
16 [ 0.0369971 ]
17 [ −0.47671957]
18 [ 0.23390729]]
19
20 La s o l u c i o n por J a c o b i usando 6 i t e r a c i o n e s :
21
22 [ [ 1.33943488]
23 [ 0.03707418]
24 [ −0.4768025 ]
25 [ 0.2338775 ] ]
26
27 Las i t e r a c i o n e s :
28
29 [ [ 0.5 1.2702 1.3197 1.3407 1.3392 1.3396 1.3394]
30 [ 0.5 0.2638 0.1239 0.0449 0.0401 0.0369 0.0370]
31 [ 0 . 5 −0.1757 −0.4642 −0.4725 −0.4778 −0.4767 − 0 . 4 7 6 8 ]
32 [ 0.5 0.3589 0.2495 0.2404 0.2340 0.2341 0.2338]]
33 >>>
El Algoritmo 3.4, inicia con la implementación del sistema del ejemplo 3.5, con la matriz
A y el vector b (líneas 4 y 9). Posteriormente, en la variable tam, almacena el tamaño de
la matriz A y en temp almacena el vector con la diagonal de A (línea 13). El vector temp,
se utiliza para la construcción de la matriz D, la cual, se inicia con la matriz identidad de
tamaño n, para posteriormente, con un ciclo for, cambiar los valores de la diagonal de D
(líneas 14 a 17). Luego, calculamos las matrices L y U , estas matrices se construyen con
las instrucciones [Link](A) y [Link](A), las cuales obtienen la matriz triangular inferior
148 3.5. Método de Gauss-Seidel
En las líneas 22 y 23 calculamos la matriz T y el vector c, los cuales son fundamentales para
el proceso iterativo: T = -1*([Link](D).dot(L + U)) y C = [Link](D).dot(b).
En la línea 25, inicializamos el vector x(0) con x0=[Link]([[ 0.5, 0.5, 0.5, 0.5 ]],
dtype=float).T. Luego, usamos la variable N como el número de ciclos (línea 27), para
posteriormente declarar la matriz M, que inicialmente es el vector x0 (línea 25); la matriz
M tiene la función de almacenar el vector solución en cada iteración, con lo que podemos
ver como es el proceso iterativo.
El ciclo for en las líneas 31 a 34 , es el responsable del proceso iterativo; en el, se usan
la matriz T y el vector c, los cuales permiten calcular la nueva solución y almacenarla
en la variable x1. Una vez calculado el vector x1, es agregado a la matriz M como una
nueva columna M=[Link]((M,x1),axis=1) (línea 33). Finalmente, se imprimen
la matriz A, el vector b, la solución verdadera usando [Link](A,b), la solución
encontrada con el método de Jacobi y la matriz M con las iteraciones.
b1 − (a12 x2 + · · · + a1n xn )
x1 =
a11
b2 − (a21 x1 + a23 x3 + · · · + a2n xn )
x2 =
a22
.. .. .. .. ..
. = . . . .
bi − ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) + ai(j+1) x(j+1) + · · · + ain xn
xi =
aii
.. .. .. .. ..
. = . . . .
bn − an1 x1 + an2 x2 + · · · + an(n−1) x(n−1)
xn = (3.17)
ann
Aquí es donde reside la diferencia, pues, para construir la versión iterativa, debemos tener
en cuenta que la primera componente x1 se actualiza con las componentes del vector
x(0) , pero las siguientes componentes se actualizan con los valores ya calculados. Nuestra
versión iterativa quedaría de la siguiente forma:
(k−1) (k−1)
b1 − a12 x2 + · · · + a1n xn
(k)
x1 =
a11
(k) (k−1) (k−1)
b2 − a21 x1 + a23 x3 + · · · + a2n xn
(k)
x2 =
a22
.. .. .. .. ..
. = . . . .
(k) (k) (k) (k−1) (k−1)
bi − ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) + ai(j+1) x(j+1) + · · · + ain xn
(k)
xi =
aii
.. .. .. .. ..
. = . . . .
(k) (k) (k)
bn − an1 x1 + an2 x2 + · · · + an(n−1) x(n−1)
x(k)
n = (3.18)
ann
Para ver el funcionamiento del método de Gauss-Seidel, tomemos el ejemplo del sistema
descrito en la ecuación (3.13):
.:Ejemplo 3.6
5x + 2y + z = 1
x − 7y − 2z = 2
x − y + 6z = −1
150 3.5. Método de Gauss-Seidel
Iteración 1:
(b), tenemos el sistema resuelto por el método de Gauss-Seidel. En ambos casos podemos
apreciar que el método de Gauss-Seidel tomó sólo cuatro iteraciones para encontrar la
solución con un error menor al 0.01, frente a las seis usadas por el método de Jacobi.
Cuadro 3.5: Comparación entre el método de Jacobi y Gauss- Seidel, para el sistema
(3.13)
.:Ejemplo 3.7
Resuelva el sistema:
Usando el vector x(0) como el vector nulo y con una tolerancia menor a 0.01.
Cuadro 3.6: Cuatro primeras iteraciones usando Gauss-Seidel, para solucionar el sistema
de la ecuación (3.19), usando x(0) como el vector nulo.
0.01830965
0.12928865
x=
0.21537638
−0.15741028
Para solucionar este inconveniente, podemos intercambiar las filas dos y tres. Con este
cambio, el sistema (3.19), se transforma en el sistema (3.20), el cual, si es diagonalmente
dominante:
Ahora, aplicamos de nuevo el método de Gauss-Seidel al sistema (3.20), usando los mismos
parámetros; los resultados los podemos ver en el Cuadro 3.7.
El método de Gauss-Seidel es por lo general, más rápido que el método de Jacobi, sin
embargo, en algunas ocasiones, Jacobi puede llegar a encontrar la solución en una iteración
anterior. De otro lado, el método de Gauss-Seidel también lo podemos representar con
la descomposición matricial como lo hicimos con el método de Jacobi, todo parte de la
descomposición de la matriz A en las matrices L, D y U . En la forma iterativa general
mostrada en la ecuación (3.18), podemos deducir la siguiente expresión:
3. Solución de sistemas de ecuaciones lineales 153
Cuadro 3.7: Cuatro primeras iteraciones usando Gauss-Seidel, para solucionar el sistema
de la ecuación (3.20), usando x(0) como el vector nulo.
(k) (k) (k) (k−1) (k−1)
bi − ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) + ai(j+1) x(j+1) + · · · + ain xn
(k)
xi =
aii
(3.21)
En la ecuación (3.21), podemos ver que la variable xi se despeja de la ecuación i
del sistema. En el paréntesis podemos apreciar términos que usan las variables de la
(k) (k) (k)
iteraciones que se han calculado hasta el momento ai1 x1 + ai2 x2 + · · · + ai(j−1) x(j−1) ;
Luego aparecen los términos de las variables que para calcularse requieren de la iteración
(k−1) (k−1)
anterior ai(j+1) x(j+1) + · · · + ain xn . Esta división nos permite visualizar la forma
general del método de Gauss-Seidel:
i−1
X n
X
(k) (k−1)
bi − aij xj + aij xj
(k) j=1 j=i+1
xi = (3.22)
aii
i−1
X (k)
Podemos ver que la primera sumatoria aij xj , relaciona los elementos que están
j=1
por debajo de la diagonal principal de la matriz de coeficientes. La otra sumatoria
Xn
(k−1)
aij xj , relaciona los elementos que están por encima de la diagonal. Entonces
j=i+1
la forma iterativa matricial se tomará de acuerdo a esta observación:
(D − L)x(k) = U x(k−1) + b
h i
(D − L)−1 (D − L)x(k) = (D − L)−1 U x(k−1) + b
x(k) = TG x(k−1) + cG
con TG = (D − L)−1 U y cG = (D − L)−1 b. El siguiente ejemplo, muestra como plantear
el problema en forma matricial:
.:Ejemplo 3.8
Resuelva el sistema
Usando el vector x(0) = (−1, −1, 0, 0) y con una tolerancia menor a 0.0001.
Para este ejemplo hemos cambiado el vector inicial, sin embargo, el resultado es el mismo,
tenemos las matrices:
0.0 0.0 0.0 0.0
7.501 0.0 0.0 0.0
L= 4.532 1.982
0.0 0.0
0.012 3.66 −7.372 0.0
12.34 0.0 0.0 0.0
0.0 23.389 0.0 0.0
D=
0.0 0.0 13.450000 0.0
0.0 0.0 0.0 56.322
0.0 −3.528000 1.112000 −0.019000
0.0 0.0 −1.177000 2.203000
U =
0.0 0.0 0.0 −1.607000
0.0 0.0 0.0 0.0
3. Solución de sistemas de ecuaciones lineales 155
−0.164861
La forma iterativa esta definida de la siguiente forma:
x(k−1)
x(k)
0.0 0.285900 −0.090113 0.001540
0.000997
y (k) 0.0 −0.091690 0.079223 −0.094683 (k−1)
0.148853
y
=
+
z (k) 0.0 −0.082823 0.018690 0.132913 z (k−1) 0.168138
w (k) 0.0 −0.004943 −0.002683 0.023550 w (k−1) −0.164861
x(6) x(7)
x 0.034588 0.034588
y 0.160875 0.160875
z 0.134734 0.134734
w -0.170022 -0.170022
Error 5.4117e-06 5.328e-07
Cuadro 3.8: Siete primeras iteraciones usando Gauss-Seidel, para solucionar el sistema de
la ecuación (3.23), usando x(0) = (−1, −1, 0, 0).
.:Algoritmo 3.5
156 3.5. Método de Gauss-Seidel
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 1 2 . 3 4 , −3.528 , 1.112 , −0.019] ,
5 [ 7 . 5 0 1 , 2 3 . 3 8 9 , −1.177 , 2 . 2 0 3 ] ,
6 [ 4.532 , 1.982 , 1 3 . 4 5 , −1.607 ] ,
7 [ 0.012 , 3.66 , −7.372 , 5 6 . 3 2 2 ] ] , dtype=f l o a t )
8
9
10 b=np . a r r a y ( [ [ 0 . 0 1 2 3 , 3 . 4 8 9 , 2 . 5 6 1 , −9.98 ] ] , dtype=f l o a t ) . T
11
12 x0=np . a r r a y ( [ [ −1 , −1 ,0 ,0 ] ] , dtype=f l o a t ) .T
13
14 tam =np . shape (A) [ 0 ]
15 temp =np . d i a g (A)
16
17 D=np . e y e ( np . shape (A) [ 0 ] )
18
19 f o r i i n ra n g e ( np . shape (A) [ 0 ] ) :
20 D[ i , i ]=temp [ i ]
21
22 L=np . t r i l (A) − D
23 U=np . t r i u (A) − D
24
25 LDinv=np . l i n a l g . i n v (L+D)
26
27 T = −1∗(LDinv . dot (U) )
28 C = LDinv . dot ( b )
29
30 N=6 ## c a n t i d a d de i t e r a c i o n e s
31
32 M=copy . copy ( x0 )
33
34 f o r i i n ra n g e (N+1) :
35 x1=T . dot ( x0 )+C
36 M=np . c o n c a t e n a t e ( (M, x1 ) , a x i s =1)
37 x0=x1
38
39 print " "
40 print "La m a t r i z A: \ n" , A
41 print " "
42 print " El v e c t o r b=:\ n" , b
43 print " "
44 print "La s o l u c i o n r e a l e s : \ n" , np . l i n a l g . s o l v e (A, b )
45 print " "
46 print "La s o l u c i o n por Gauss − S e i d e l usando %d i t e r a c i o n e s : \ n" % (N+1)
47 print x0
48
49 print " "
50 p r i n t " Las i e t r a c i o n e s : \ n "
51 print M
3. Solución de sistemas de ecuaciones lineales 157
1 >>>
2 La m a t r i z A:
3 [ [ 1 . 2 3 4 0 0 0 0 0 e +01 −3.52800000 e+00 1 . 1 1 2 0 0 0 0 0 e+00 −1.90000000 e −02]
4 [ 7 . 5 0 1 0 0 0 0 0 e +00 2 . 3 3 8 9 0 0 0 0 e+01 −1.17700000 e+00 2 . 2 0 3 0 0 0 0 0 e +00]
5 [ 4 . 5 3 2 0 0 0 0 0 e +00 1 . 9 8 2 0 0 0 0 0 e+00 1 . 3 4 5 0 0 0 0 0 e+01 −1.60700000 e +00]
6 [ 1 . 2 0 0 0 0 0 0 0 e −02 3 . 6 6 0 0 0 0 0 0 e+00 −7.37200000 e+00 5.63220000 e +01]]
7
8 El v e c t o r b=:
9 [[0.0123]
10 [3.489 ]
11 [2.561 ]
12 [ −9.98 ]]
13
14 La s o l u c i o n r e a l e s :
15 [[0.03458763]
16 [0.16087467]
17 [0.13473387]
18 [ −0.17002163]]
19
20 La s o l u c i o n por Gauss − S e i d e l usando 7 i t e r a c i o n e s :
21
22 [[0.03458762]
23 [0.16087467]
24 [0.13473387]
25 [ −0.17002163]]
26
27 Las i e t r a c i o n e s :
28
29 [ [ − 1 . −0.2849 0 . 0 4 6 9 0.0351 0.0345 0.0345 0.0345 0.03458762]
30 [ −1. 0.2405 0.1618 0.1605 0.1608 0.1608 0.1608 0.16087467]
31 [ 0. 0.2509 0.1316 0.1345 0.1347 0.1347 0.1347 0.13473387]
32 [ 0 . −0.1599 −0.1704 −0.1700 −0.1700 −0.1700 −0.1700 − 0 . 1 7 0 0 2 1 6 3 ] ]
33
34 >>>
Sea A una matriz de tamaño n × n, se dice que el radio espectral de A denotado como
ρ(A), el mayor de entre los valores absolutos de los elementos de su espectro, es decir,
es el mayor de entre los valores propios de A; si A tiene valores propios λ1 , λ2 . . . λn ,
entonces:
Los valores propios de A son un concepto que veremos en el capítulo sobre valores
y vectores propios, sin embargo, el método de relajación hace que se amplie el rango
espectral de la matriz, haciendo que el método converja más rápido.
1 1−w
A= D− D−L−U
w w
Donde el término w1 D − 1−w
w D es D sólo que reescrito de otra forma. Ahora Si tenemos
que resolver el sistema Ax = b, entonces:
Ax = b
remplazamos:
1 1−w
D− D−L−U x = b
w w
1 1−w
Dx − Dx − Lx − U x = b
w w
1 1−w
Dx − Lx = Dx + U x + b
w w
Dx − wLx 1−w
= Dx + U x + b
w w
despejando x:
3. Solución de sistemas de ecuaciones lineales 159
1−w
(D − wL)x = w Dx + U x + b
w
= (1 − w)Dx + wU x + wb
x = T s x + cs
En forma general, la forma iterativa sería:
x(k+1) = TS x(k) + cS
El siguiente teorema demuestra la convergencia de los métodos antes citados:
Para una demostración del Teorema ver [2] y [18]. El teorema anterior converge siempre
y cuando la matriz de coeficientes A sea diagonal estrictamente dominante; mejor aun,
los métodos iterativos que hemos vista en este capítulo caen bajo este teorema, pues el
método de Relajación es una generalización del método de Gauss-Seidel, sólo falta hacer
w = 1, para obtener la misma forma iterativa.
.:Ejemplo 3.9
36x + 7y + 8z + 4w = 7
7x + 29y + 9z + 4w = 5
3x + 8y + 24z + 3w = 4
4x + 4y + 2z + 17w = 8 (3.24)
El cuadro 3.9, muestra que en la sexta iteración el método ya tiene una solución con una
tolerancia bastante buena, en este ejemplo se uso un w = 0.8. El cambio de este parámetro
puede hacer que el método tarde más en llegar a una buena solución. El Cuadro 3.10
muestra el mismo ejemplo con el sistema (3.24), donde se cambio el parámetro w.
Con un w = 0.3 (Subcuadro (a)), el método tomó 19 iteraciones, mientras que con un
w = 1 (Subcuadro (b)), sólo tomó seis; de igual manera, con un w = 1.5 la cantidad de
3. Solución de sistemas de ecuaciones lineales 161
Cuadro 3.9: Seis primeras iteraciones usando el método de Relajación, para solucionar el
sistema de la ecuación (3.24), usando x(0) como el vector nulo y w = 0.8.
iteraciones llego a 16 (Subcuadro (c)). La pregunta sería ¿de que forma podemos encontrar
el mejor w?. En algunos textos como el de Burden [2] muestran algunas fórmulas especiales
pero éstas sólo funcionan en casos muy particulares, mientras que Mora [16] sugiere hacer
varias pruebas hasta obtener un resultado óptimo.
.:Algoritmo 3.6
1 i m p o rt numpy a s np
2 i m p o rt copy
3
4 A = np . a r r a y ( [ [ 3 6 . , 7. , 8. , 4.] ,
5 [ 7. , 29. , 9. , 4.] ,
6 [ 3. , 8. , 24. , 3.] ,
7 [ 4. , 4. , 2. , 1 7 . ] ] , dtype=f l o a t )
8
9
10 b=np . a r r a y ( [ [ 7 , 5 , 4 , 8 ] ] , dtype=f l o a t ) .T
11
12 x0=np . z e r o s ( ( np . shape (A) [ 0 ] , 1 ) )
13
14 w=0.8
15
16 tam=np . shape (A) [ 0 ]
17
18 temp=np . d i a g (A)
19 D=np . e y e ( np . shape (A) [ 0 ] )
20
21 f o r i i n ra n g e ( np . shape (A) [ 0 ] ) :
22 D[ i , i ]=temp [ i ]
23
24
25 L=np . t r i l (A) − D
26 U=np . t r i u (A) − D
162 3.6. Método de Relajación
27
28
29 LDinv=np . l i n a l g . i n v (D + (w∗L ) )
30 T= LDinv . dot ((1 −w) ∗D − w∗U)
31 C = w∗ ( LDinv . dot ( b ) )
32
33 N=6## c a n t i d a d de i t e r a c i o n e s
34
35 M=copy . copy ( x0 )
36
37
38 f o r i i n ra n g e (N+1) :
39 x1=T . dot ( x0 ) + C
40 M=np . c o n c a t e n a t e ( (M, x1 ) , a x i s =1)
41 x0=x1
3. Solución de sistemas de ecuaciones lineales 163
42
43 print " "
44 print "La m a t r i z A: \ n" , A
45 print " "
46 print " El v e c t o r b=:\ n" , b
47 print " "
48 print "La s o l u c i o n r e a l e s : \ n" , np . l i n a l g . s o l v e (A, b )
49 print " "
50 print "La s o l u c i o n por SOR usando %d i t e r a c i o n e s : \ n" % (N+1)
51 print x0
52 print " "
53 print " Las i t e r a c i o n e s : \ n" , M
1 >>>
2 La m a t r i z A:
3 [ [ 36. 7. 8. 4.]
4 [ 7. 29. 9. 4.]
5 [ 3. 8. 24. 3.]
6 [ 4. 4. 2. 17.]]
7
8 El v e c t o r b=:
9 [[ 7.]
10 [ 5.]
11 [ 4.]
12 [ 8.]]
13
14 La s ol uci on r e a l es :
15 [[ 0.11837445]
16 [ 0.06153967]
17 [ 0.07898626]
18 [ 0.418963 ]]
19
20 La s o l u c i o n por SOR usando 7 i t e r a c i o n e s :
21
22 [[ 0.11833374]
23 [ 0.06152953]
24 [ 0.07901747]
25 [ 0.41896098]]
26
27 Las i t e r a c i o n e s :
28 [ [ 0.0 0.15555556 0.1257486 0.11830219 0.11773504 0.11804439
0.11824952 0.11833374]
29 [ 0.0 0.10789272 0.07798377 0.06590623 0.06252795 0.06171439
0.06155061 0.06152953]
30 [ 0.0 0.08900639 0.08591375 0.08173731 0.07994815 0.07930293 0.0790868
0.07901747]
164 3.7. ¿Qué método usar?
.:Ejemplo 3.10
0.6
Error
0.4
0.2
2 4 6 8 10
Iteraciones
Figura 3.1: Aplicación de los métodos de Relajación con w = 0.85, Gauss-Seidel y Jacobi,
al ejemplo 3.10 (Iteraciones vs Error)
La literatura y en especial Gutiérrez [4], nos sugiere que los mejores algoritmos son los
iterativos, el siguiente cuadro propuesto por Gutiérrez y otros, nos muestran la cantidad
de operaciones necesarias en cada método ( Cuadro 3.11):
El Cuadro 3.11, nos dice que si n es el tamaño de la matriz (el número de ecuaciones)5 ;
entonces los métodos iterativos se muestran como los más eficientes, sin embargo, estos
sólo funcionan si la matriz es diagonalmente dominantes; para matrices que no lo sean,
se recomienda la descomposición triangular, bien sea A = LU o P A = LU . La figura
3.2, muestra como los métodos iterativos usan menos operaciones, mientras que usar la
inversa de la matriz es poco recomendable.
Existen otros métodos para hallar la solución a sistemas de ecuaciones lineales. En este
libro, hemos visto algunos métodos iterativos, pero existen otros que son más complejos;
motivo por el cual, no los he incluido en este texto, pues requieren de conocimientos
previos para su desarrollo. (para más información ver [17, 2, 18, 16]).
5 En el caso de los métodos iterativos r es el número de iteraciones necesaria determinada por algún
criterio
166 3.7. ¿Qué método usar?
n3 n
Eliminación Gaussiana + n2 −
3 3
n3 n
Descomposición triangular + n2 −
3 3
n3 n
Eliminación Gauss-Jordan + n2 −
2 2
Cuadro 3.11: Cantidad de operaciones para los métodos estándar. (Cuadro tomado de [4],
pag 134)
.:Ejercicios 3.2
200
150
100
50
0 1 2 3 4 5 6
n tamaño de la matriz
Determinantes
4
4.1. Definición
El determinante es un número asociado a una matriz, que inicialmente se usaba para
conocer la soluciones a un sistema de ecuaciones lineales; veamos la siguiente definición:
.:Definición 4.1 El determinante de una matriz es una función con dominio Rn×n → R,
en la cual se toma una matriz cuadrada y se retorna un número real.
La anterior definición, sólo hace referencia a matrices en el campo de los números reales
R, sin embargo, los teoremas, hechos y algoritmos, pueden ajustarse para que manipulen
matrices en el campo de los números complejos C.1
los números reales, es en realidad un caso particular de los números complejos. En este texto, sólo
abordaremos la parte real.
169
170 4.3. Determinante de matrices 3 × 3
a11 a12
detA = = a11 a22 − a12 a21 (4.1)
a21 a22
Lo único que debemos hacer es multiplicar las diagonales de la matriz, las barras en la
matriz; ya no representan la matriz en sí misma, sino el determinante y se pueden tratar
como un número.
2 3
.:Ejemplo 4.1 Hallar el determinante de la matriz A = .
−1 7
a22 a23
es la matriz que se obtiene al eliminar la primera fila y la primera
a32 a33
columna de A.
a21 a23
es la matriz que se obtiene al eliminar la primera fila y la segunda
a31 a33
columna de A.
a21 a22
es la matriz que se obtiene al eliminar la primera fila y la tercera
a31 a32
columna de A.
5 7 9
A = 1 −1 3
6 −1 4
detA = |A|
−1 3 1 3 1 −1
= 5 −7 +2
−1 4 6 4 6 −1
= 138
Como vimos, al calcular el determinante de una matriz de tamaño 3×3, se hace un proceso
de eliminación de la primera fila y las tres columnas, esto genera tres sub matrices de
tamaño 2 × 2, a estas matrices las llamaremos las Menores:
172 4.4. Determinantes de matrices de tamaño n × n
a11 a12 ··· a1j ··· a1n
a21 a22 ··· a2j ··· a2n
.. .. .. .. .. ..
. . . . . .
A =
fila
ai1
ai2 ··· aij ··· ain
} i
. .. .. .. .. ..
..
. . . . .
an1 an2 ··· anj ··· ann
|{z}
Columna j
Entonces
−1 3 5 9
M11 = , M22 =
−1 4 6 4
5 7 1 3
M33 = , M12 =
1 −1 6 4
Dada una matriz A de orden n × n, el cofactor ij de A denotado por Aij está dado por:
i+j
Aij = (−1) |Mij |
i+j
(−1) = 1 si (i + j) es par
i+j
(−1) = −1 si (i + j) es impar
5 9
A22 = (−1)2+2
6 4
= −34
1 −1
A23 = (−1)1+3
6 −1
= 5
Ahora, ya podemos calcular el determinante de una matriz de cualquier tamaño:
Sea A de orden n × n. El detA se puede expresar como expansión por cofactores, así:
n
X
detA = |A| = a11 A11 + a12 A12 + · · · + a1n A1n = a1k A1k
k=1
Entonces:
.:Algoritmo 4.1
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 1 , −4, 5 ] ,
4 [9 , 0, 9] ,
5 [2 , 7 , − 1 ] ] , dtype=f l o a t )
6
7 d=np . l i n a l g . d e t (A)
8
9 p r i n t "La m a t r i z A: \ n" , A
10 print " "
11 p r i n t " d e t (A) = " , d
1 >>>
2 La m a t r i z A:
3 [ [ 1 . −4. 5.]
4 [ 9. 0. 9.]
5 [ 2. 7. −1.]]
6
7 d e t (A) = 144.0
8 >>>
.:Algoritmo 4.2
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 2 , −4, 7 ] ,
4 [ −9 , 6 , 9] ,
5 [ 2 , 7 , − 1 ] ] , dtype=f l o a t )
6
7 B = np . a r r a y ( [ [ 9 , 5 ] ,
8 [ 4 , − 1 ] ] , dtype=f l o a t )
9
10 d e f D e te rm i n a n a te 2 x 2 (A) :
11 r e t u r n A[ 0 , 0 ] ∗ A[ 1 , 1 ] − (A[ 1 , 0 ] ∗ A[ 0 , 1 ] )
12
13 d e f D e te rm i n a n a te 3 x 3 (A) :
14
15 M11=np . a r r a y ( [ [ A [ 1 , 1 ] , A[ 1 , 2 ] ] ,
16 [ A[ 2 , 1 ] , A[ 2 , 2 ] ] ] )
17
18 M12=np . a r r a y ( [ [ A [ 1 , 0 ] , A[ 1 , 2 ] ] ,
19 [ A[ 2 , 0 ] , A[ 2 , 2 ] ] ] )
20
21 M13=np . a r r a y ( [ [ A [ 1 , 0 ] , A[ 1 , 1 ] ] ,
22 [ A[ 2 , 0 ] , A[ 2 , 1 ] ] ] )
23
24 c o f 1 = (( −1) ∗∗(1+1) ) ∗A[ 0 , 0 ] ∗ D e te rm i n a n a te 2 x 2 (M11)
25 c o f 2 = (( −1) ∗∗(1+2) ) ∗A[ 0 , 1 ] ∗ D e te rm i n a n a te 2 x 2 (M12)
26 c o f 3 = (( −1) ∗∗(1+3) ) ∗A[ 0 , 2 ] ∗ D e te rm i n a n a te 2 x 2 (M13)
27
28 return cof1 + cof2 + cof3
29
30
31 p r i n t "La m a t r i z B 2 x2 : \ n" , B
32 print " "
176 4.4. Determinantes de matrices de tamaño n × n
1 >>>
2 La m a t r i z B 2 x2 :
3 [ [ 9. 5.]
4 [ 4. −1.]]
5
6 d e t (B) = −29.0
7
8 La m a t r i z A 3 x3 :
9 [ [ 2 . −4. 7.]
10 [ −9. 6. 9.]
11 [ 2. 7. −1.]]
12
13 d e t (A) = −699.0
14 >>>
.:Ejercicios 4.1
1 −1 −1 0
−3 4 6 0
a) A=
2 5 −1 −3
4 0 3 0
0 a 0 0
b 0 0 0
b) A=
0 0 0 c
0 0 d 0
0 b 0 0
c d 0 0
c) A=
0 0 a −b
0 0 c d
2 5 −6 1 0
0
1 −7 6 0
d) A=
0 0 0 −7 0
0 2 1 5 −8
2 −1 5 4 0
2. El método de Sarrus consiste de los sigientes pasos:
a) a11 > 0
a11 a12
b) >0
a21 a22
a11 a12 a13
c) a21 a22 a23 >0
a31 a32 a33
a11 a12 a13 ··· a1n
a21 a22 a23 ··· a2n
d) .. .. .. .. .. >0
. . . . .
an1 an2 an3 · · · ann
detA = 0
.:Ejemplo 4.6
9 6 −8 6 −8 6
= (5)(−1)1+1 + (9)(−1)1+2 + (1)(−1)1+3
0 0 0 0 0 0
= 0+0+0=0
Entonces det A = 0
4. Determinantes 179
det(kA) = k n detA
.:Ejemplo 4.7
−8 7 4
det A = 33 5 1 2 = 27(−107) = −2889
5 4 7
.:Ejemplo 4.8
180 4.5. Propiedades de los determinantes
.:Ejemplo 4.9
Tomemos la matriz A;
1 2 9
A= 7 5 6
9 8 1
Como vimos, el detA = 150, ahora intercambiemos la fila 3 por la fila 1 (f1 ⇄ f3 ):
9 8 1
B= 7 5 6
1 2 9
el detB = −150
4. Determinantes 181
.:Ejemplo 4.10
Tomemos la matriz A;
7 5
A=
7 5
El detA = 7(5) − 7(5) = 0
.:Ejemplo 4.11
Tomemos la matriz A;
7 5
A=
14 10
El detA = 7(10) − 14(5) = 0
.:Ejemplo 4.12
Tomemos la matriz A;
1 2 9
A= 7 5 6
9 8 1
182 4.6. Determinante de matrices especiales
(α + 1) 0 0 ··· 0
0 (α + 2) 0 ··· 0
3 0 0
A= 4 1
0 , B = 0 0 (α + 3) ··· 0
α∈R
2 2 7
.. .. .. .. ..
. . . . .
0 0 0 · · · (α + n) n×n
4. Determinantes 183
detA = 3 × 1 × 7 = 21
Para el caso de la matriz B, aplicamos el Corolario del Teorema 4.8; sin embargo, este
resulta ser un poco más complejo, pues está determinado por la variable α:
1 3 5 2
0 −1 3 4
|A| =
2 1 9 6
3 2 4 8
1 3 5 2
0 −1 3 4
|A| = Tratamos de convertirlo en el determinante de una matriz
2 1 9 6
3 2 4 8
triangular.
1 3 5 2
0 −1 3 4
|A| =
0 −5 − 1 2
0 −7 −11 2
- Multiplicamos el renglón 2 por -5 y lo sumamos al tercero.
- Multiplicamos el renglón 2 por -7 y lo sumamos al cuarto, entonces:
1 3 5 2
0 −1 3 4
|A| =
0 0 −16 −18
0 0 −32 −26
- Multiplicamos el renglón 3 por -2 y lo sumamos al cuarto y se obtiene:
184 4.6. Determinante de matrices especiales
1 3 5 2
0 −1 3 4
|A| =
0 0 −16 −18
0 0 0 10
Como la matriz que se obtiene es triangular superior, detA=producto de los elementos
en la diagonal principal
Bien, observemos que la cuarta fila de A tiene 4 ceros, así que usaremos esta fila para
calcular el determinante:
detA = a41 A41 + a42 A42 + a43 A43 + a44 A44 + a45 A45
X5
= a4k A4k para i = 1, 2, . . . , 5
k=1
7 0 5 6 8 0 5 6
4+1 2 0 4 7
+ (0) (−1)4+2 3
0 4 7
= (0)
(−1)
+
5 0 7 9 8 0 7 9
8 7 4 1 7 7 4 1
| {z } | {z }
=0 =0
8 7 5 6 8 7 0 6
4+3 3 2 4 7 4+4 3 2 0 7
+ (0)
(−1)
+ (0) (−1)
8 5 7 9 8 5 0 9
7 8 4 1 7 8 7 1
| {z } | {z }
=0 =0
8 7 0 5
4+5 3 2 0 4
+(4)
(−1)
8 5 0 7
7 8 7 4
Bien, de los cinco determinantes de 4 × 4, sólo debemos calcular uno (el último de la
ecuación anterior); los demás cofactores no son necesarios, pues el determinante de la
menor correspondiente se e hace cero.
8 7 0 5 8 7 0 5
4+5 3 2 0 4
= −4 3 2 0 4
(4)
(−1) 8 5 0 7 8 5 0 7
7 8 7 4 7 8 7 4
De nuevo, de los cuatro determinantes sólo es necesario calcular uno, pues los demás se
hacen cero:
8 7 5 8 7 5
(−4) (7) (−1)4+3 3 2 4 = 28 3 2 4
8 5 7 8 5 7
= 28(24)
= 672
.:Teorema 4.10 Sea E una matriz elemental definida por la operación elemental fi →
kfi , entonces, detE = k
.:Teorema 4.11 Sea E una matriz elemental definida por la operación elemental fi →
fi + kfj , entonces, detE = 1
.:Teorema 4.12 Sea E una matriz elemental definida por la operación elemental fi ⇆
fj , entonces, detE = −1
.:Ejemplo 4.16 Hallar el determinante de las siguientes matrices elementales
1 0 0 1 0 0 0 1 0
A = 0 −8 0 , B = 0 1 0 , C = 1 0 0
0 0 1 −7 0 1 0 0 1
4. Determinantes 187
Su inversa es
−0.2632043 0.2180053 −0.0077413
A−1 = 0.1610556 0.0375695 −0.0887561
0.0563377 −0.0653915 0.1212240
Y si calculamos detA = −203.2693, luego detA 6= 0
El teorema anterior, podríamos interpretarlo como una manera muy “costosa” de saber a
priori, si un sistema de la forma Ax = b, tiene solución única o si tiene múltiples soluciones.
Más adelante, veremos que el determinante, puede inclusive, ayudar en el cálculo de la
inversa de la matriz.
Los siguientes teoremas, nos ofrece una luz sobre como podemos calcular el determinante
de una manera más eficiente:
detA = ±d1 d2 · · · dn
20 48 42
det(AB) = −42 96 73 = −5360
3 40 31
Ahora bien, detA = 67 y detB = −80, luego detAdetB = −5360.
23 54 96
21 21 36
−45 87 63
Su inversa
−0.0166667 0.2833333 −0.0166667
A−1 = −0.4333333 −0.6333333 0.5666667
0.5 0.5 −0.5
Ahora, detA = 60 y el detA−1 = 0.0166666, se puede ver que
1
0.0166666 =
60
Ahora, veremos otro concepto, del cual es posible relacionar con el determinante y la
inversa de una matriz, se trata de matriz Adjunta.
Ahora bien, como vimos un cofactor conlleva el calculo de un determinante más pequeño;
en el caso de una matriz de 3 × 3 tendríamos que calcular nueve determinantes de 2 × 2,
entonces calcular la adjunta puede resultar un proceso muy largo, debido a la cantidad
de cofactores implícitos en la matriz original. El siguiente ejemplo es tomado de [11].
Para hallar la adjunta primero debemos hallar los cofactores de A, es decir, los
componentes de la matriz B de la definición 4.7.
5 1 2 4
A11 = (−1)2 = 22 A23 = (−1)5 = 14
−7 3 0 −7
−3 1
A12 = (−1)3 =9
0 3 4 −6
A31 = (−1)4 = 34
5 1
4 −3 5
A13 = (−1) = 21
0 −7
2 −6
−3 5 A32 = (−1)5 = 16
A21 = (−1) 3
= 30 −3 1
0 −7
2 −6 2 4
A22 = (−1)4 =6 A33 = (−1)6 = 22
0 3 −3 5
Según [20], calcular la inversa por éste método es muy complejo, se requiere calcular n2
determinantes de n − 1 y un determinante de orden n. La pregunta es:
A lo largo de este capítulo, hemos visto que la mayoría de los métodos expuestos son
muy costosos computacionalmente. Para contestar este interrogante, debemos avanzar un
poco más en la teoría; por ahora veamos un ejemplo del Teorema 4.18.
Bien, pero sigue siendo un método muy costoso, pues es necesario hallar el determinante y
la inversa de A, y como hemos visto, son procesos muy complejos. El siguiente algoritmo
muestra la implementación de la adjunta por medio de la inversa.
.:Algoritmo 4.3
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 2 , 4 , −6] ,
4 [ −3 , 5 , 1 ] ,
5 [ 0 , − 7 , 3 ] ] , dtype=f l o a t )
6
7 Ainv=np . l i n a l g . i n v (A)
8 d e t=np . l i n a l g . d e t (A)
9 Adjunta=d e t ∗ Ainv
10
11 p r i n t "La m a t r i z A e s : \ n" , A
12 print " "
13 p r i n t "La Adj (A) e s : \ n" , Adjunta
1 >>>
2 La m a t r i z A e s :
3 [ [ 2. 4 . −6.]
194 4.8. La factorización de matrices en el cálculo del determinante
4 [ −3. 5. 1.]
5 [ 0 . −7. 3.]]
6
7 La Adj (A) es :
8 [ [ 22. 30. 34.]
9 [ 9. 6. 16.]
10 [ 21. 14. 22.]]
11 >>>
El Teorema 4.15, el cual, nos dice que si A = BC, entonces detA = detBdetC.
El Teorema 2.7, éste nos dice que si la matriz A es invertible, es posible hallar
su factorización A = LU , donde la matriz L es triangular inferior con unos en la
diagonal y la matriz U es triangular superior.
El Teorema 4.8, el cual, nos dice que el determinante de una matriz triangular
superior o inferior es el producto de su diagonal.
Con estos tres Teoremas, podemos deducir que si A es una matriz de tamaño n × n
invertible, entonces por el Teorema 2.7, podemos escribir A como:
A = LU
Ahora aplicamos el Teorema 4.15:
Luego
detA = detU
De nuevo, aplicado el Teorema 4.8, el calculo del determinante de la matriz U es muy
simple, pues, sólo basta multiplicar los elementos de la diagonal de U .
detA = detU
= −262
Ahora bien, se podría pensar: es igual de costoso el método de los cofactores que el método
de la factorización de matrices. Pero la realidad es que el método de los cofactores es de de
orden n! (donde n es el tamaño de la matriz), mientras que el método de la factorización
de matrices es de orden n3 . Éste es mejor método, hallar la factorización A = LU y
simplemente multiplicar los elementos de la diagonal de U .
.:Algoritmo 4.4
1 i m p o rt numpy a s np
2 from s c i p y . l i n a l g i m p o rt ∗
3
4 A=np . round (1 0 ∗ np . random . rand ( 4 , 4 ) )
5
6 n=np . shape (A) [ 0 ]
7
8 U=copy . copy (A)
9
10 f o r i i n ra n g e ( n−1) :
11 f o r j i n ra n g e ( i +1 , n ) :
12 TEMP=−1∗U[ j , i ] /U[ i , i ]
13 U[ j , : ] =U[ j , : ] + TEMP∗U[ i , : ]
14
15
16 d e t2 =1.0
17 f o r i i n ra n g e ( np . shape (U) [ 0 ] ) :
18 d e t2=d e t2 ∗U[ i , i ]
19
20
21 d e t1=np . l i n a l g . d e t (A)
22
23 print "La m a t r i z A e s : \ n" , A
24 print " "
25 print "La m a t r i z U: \ n" , U
26 print " "
27 print " d e t e r m i n a n t e r e a l " , d e t1
28 print " "
29 print " d e t e r m i n a n t e con U" , d e t2
1 >>>
2 La m a t r i z A e s :
3 [[ 8. 7. 8. 10.]
4 [ 7. 0. 8. 8.]
5 [ 7. 9. 0. 9.]
6 [ 2. 0. 6. 8.]]
7
8 La m a t r i z U:
9 [[ 8. 7. 8. 10. ]
10 [ 0. −6.125 1 . −0.75 ]
11 [ 0. 0. −6.53061224 −0.10204082]
12 [ 0. 0. 0. 5.65625 ]]
13
14 determinante r e a l 1810.0
15
4. Determinantes 197
16 d e t e r m i n a n t e con LU 1 8 1 0 . 0
17 >>>
2 0 6 8
Como la instrucción [Link](4,4) genera una matriz de componentes aleatorias
con valores entre cero y uno, multiplicamos por 10, para obtener valores más grandes,
luego redondeamos con la instrucción [Link]().
Sin embargo, el Algoritmo 4.4, no tiene en cuenta si el pivote usado el ciclo for, en
la instrucción TEMP=-1*U[j,i]/U[i,i] se hace cero; esto causaría un error que Python
manifiesta de la siguiente forma:
detBj
xj =
detA
Si tenemos en cuenta que el cálculo del determinante es muy costoso, la regla de Cramer,
sólo podría utilizarse para sistemas de ecuaciones lineales pequeños.
x1 − 2x2 + 3x3 + x4 = 1
x1 + 9x2 − x3 − 4x4 = 9
2x1 + x2 − 7x3 + 9x4 = 2
x1 − x2 + x3 − x4 = −1
La matriz A y el vector b:
1 −2 3 1 1
1 9 −1 −4 9
A= y b=
2 1 −7 9 2
1 −1 1 −1 −1
El detA = 357, Ahora bien, queremos calcular el valor de x1 entonces reemplazamos la fila
1 por el vector b y obtenemos el determinante de esta nueva matriz (B1 ), luego dividimos
por el detA.
4. Determinantes 199
1 −2 3 1
9 9 −1 −4
2 1 −7 9
detB1 −1 −1 1 −1 79
x1 = = = = 0.2212885
detA 1 −2 3 1 357
1 9 −1 −4
2 1 −7 9
1 −1 1 −1
El mismo procedimiento lo aplicamos para x4
1 −2 3 1
1 9 −1 9
2 1 −7 2
detB4 1 −1 1 −1 270
x4 = = = = 0.7563025
detA 1 −2 3 1 357
1 9 −1 −4
2 1 −7 9
1 −1 1 −1
Como vemos, el método es muy simple. La única ventaja que tiene este método, es que
sólo calcula la variable que necesitamos, no calcula las demás. Sin embargo, hay que pagar
un precio muy alto por esto, se deben calcular dos determinantes, el de la matriz original
A y el de la matriz Bj ; esto hace que método sea poco eficiente.
.:Algoritmo 4.5
1 i m p o rt numpy a s np
2 from s c i p y . l i n a l g i m p o rt ∗
3
4 A=np . round (1 0 ∗ np . random . rand ( 4 , 4 ) )
5 b=np . round (1 0 ∗ np . random . rand ( 4 , 1 ) )
6
7 detA=np . l i n a l g . d e t (A)
8
9 B1=copy . copy (A)
10
11 f o r i i n ra n g e ( np . shape (A) [ 0 ] ) :
12 B1 [ i , 0 ] = b [ i ]
13
14 detB1=np . l i n a l g . d e t (B1 )
15
16 x=np . l i n a l g . s o l v e (A, b )
17
18 x1=detB1 / detA
19
20 p r i n t "La m a t r i z A e s : \ n" , A
200 4.9. Regla de Cramer
1 >>>
2 La m a t r i z A e s :
3 [ [ 6. 6. 7. 9.]
4 [ 9. 9. 7. 3.]
5 [ 1. 5. 0. 1.]
6 [ 8. 2. 4. 3.]]
7
8 El vector b :
9 [[ 2.]
10 [ 1.]
11 [ 2.]
12 [ 3.]]
13
14 La m a t r i z B1 e s :
15 [[ 2. 6. 7. 9.]
16 [ 1. 9. 7. 3.]
17 [ 2. 5. 0. 1.]
18 [ 3. 2. 4. 3.]]
19
20 El d e t e r m i n a n t e de A :
21 966.0
22
23 El d e t e r m i n a n t e de B1 :
24 704.0
25
26 El v e c t o r s o l u c i o n x :
27 [ [ 0.72877847]
4. Determinantes 201
28 [ 0.13457557]
29 [ −1.22360248]
30 [ 0.59834369]]
31
32 x1 c a l c u l a d o con Cramer 0 . 7 2 8 7 7 8 4 6 7 9 0 9
33 >>>
8 2 4 3 3
Luego, calculamos el detA = 966 (línea 7) en la variable detA, y creamos la matriz B1,
la cual, inicialmente es igual a la matriz A (línea 9). Posteriormente, se una un ciclo for
para cambiar la primera fila de B1 por el vector b, en este ejemplo vamos a encontrar la
variable x1 (líneas 11 y 12).
.:Ejercicios 4.3
7 8 5 0 0 2 5 4
7 8 5 0 7 8 9 6
a) c)
3 6 98 0 5 21 5 4
42 2 5 8 1 2 5 1
5 4 1 2 5
5 −8 7 4 87 4 5 8 9
0 0 −5 5 d) 6 5 8 74 5
b)
−5 1 4 7 2 1 2 0 2
8 5 4 5 2 1 2 0 2.00001
202 4.9. Regla de Cramer
a 0 0 0 0 a 0 0 0 0 0
0 0 b 0 0 0 0 b 0 0 0
e) 0 0 0 0 c 0 0 0 0 c 0
f)
0 0 0 d 0 0 0 e 0 0 0
0 e 0 0 0 0 0 0 0 0 f
0 d 0 0 0 0
x + 10x2 + x3 = 7
a) x1 − x2 + x3 = 5
x1 + 7x2 − 45x3 = 0
2x1 + x2 + x3 = −9
b) x1 + 11x2 + 2x3 = 0
−x1 − 54x2 − 28x3 = 8
x1 − 11x2 − 54x3 = 0
x1 + x2 − 11x4 = 0
c)
x1 + 3x3 − 2x4 = 10
x1 + x3 + 9x4 = 87
0.214x1 − 0.2147x2 + 4.2158x3 + 0.0214x4 = 0.0012
0.0147x1 − 0.1824x3 + 0.2147x4 = 0.0147
d)
0.09874x1 + 0.1249x2 + 0.2585x4 = 0.0147
0.897x1 + 0.00015x2 − x3 − 0.214x4 = 0.0214
3. Dada las siguientes matrices cuadradas, encuentre la adjunta por el método de los
cofactores, luego encuentre la inversa usando la adjunta:
6 5 8 4 −5 8 7 4
1 2 5 −4 1 −2 5 6
a) A = 1 1 1
c) C =
5 9 63 2 1
1 2 5 5 4 7 96 −5
5 4 1 4 7 7 8 5 4 1
0 1 2 5 4 2 5 4 7 8
b) B = 7 8 5 2 2
d ) D = 9 −6 5 1 10
1 2 5 9 6 2 0 2 5 5
3 21 58 8 5 8 9 5 5 4
0 2 1 4 6 5 2 1
5 8 9 6 4 7 8 5
a) A =
c) C =
57 5 5 4 4 7 4 1
2 1 0 14 0 0 1 0
8 5 4 7 4 8 4 5 4 0
1 1 1 5 8 1 2 5 4 8
b) B =
80 1 2 0 1
d) D =
9 6 9 8 5
21 0 1 0 1 2 1 4 7 8
0 1 1 1 10 5 4 1 2 5
1 i m p o rt numpy a s np
2
3 A = np . a r r a y ( [ [ 2, 5, 9, 7]
4 [ 8, 1, 7, −4]
5 [ 2 , −1, 2, −1]
6 [ −10 , 4 , 2, − 1 ] ] , dtype=f l o a t )
7
8
9
10 d e f M e n o ri j (A, i , j ) :
11 .
12 .
13 .
14 r e t u r n Mij
Esta función, toma como parámetro la matriz A de tamaño n×n, y debe devolver la
matriz inversa de A, usando la matriz adjunta. La función debe servir para cualquier
matriz cuadrada, sin importar el tamaño. Recuerde que el determinante no se puede
calcular con la función [Link](A), se debe usar la descomposición A = LU
para calcular el determinanate.
13. Implemente un programa en Python con las siguientes características:
1 i m p o rt numpy a s np
2
4. Determinantes 207
3 A = np . a r r a y ( [ [ 2, 5, 9, 7]
4 [ 8, 1, 7, −4]
5 [ 2 , −1, 2, −1]
6 [ −10 , 4 , 2, − 1 ] ] , dtype=f l o a t )
7
8 b=np . a r r a y ( [ [ 1 , 7 , 8, − 4 ] ] , dtype=f l o a t ) . T
9
10 d e f SolveSistemaAxbCramer (A, b ) :
11 .
12 .
13 .
14 return x
Antes que nada, debemos tener en cuenta que una magnitud es escalar cuando representa
un valor numérico simple; por ejemplo, la altura de una persona es una magnitud escalar;
la distancia entre dos puntos es una magnitud escalar. Ahora bien, existen magnitudes
que no son susceptibles de representarse con un número; por ejemplo, si te pones una cita
con una persona, debes definir el lugar y la hora donde se hará el encuentro; este sería un
ejemplo muy simple de una magnitud vectorial. En Matemáticas y Física, encontramos
otros ejemplos de magnitudes vectoriales; por ejemplo, la velocidad es una magnitud
vectorial, pues debemos conocer tanto la rapidez como la dirección en que se viaja.
209
210 5.1. Nociones básicas de vectores en R2
El uso de la palabra vector, ha evolucionado hasta el punto, en que hoy en día se utiliza
para representar objetos o magnitudes que aparentemente, no están relacionadas con la
Física o las Matemáticas, por ejemplo en Epidemiología, se usa la palabra vector para
representa una especie animal que es propensa a transmitir un agente infeccioso, como
los mosquitos o los ratones. En navegación y aeronáutica es común escuchar “El vector
de aproximación” que en realidad es un conjunto de maniobras y ajustes de la nave
(dirección, sustentación y estabilidad, etc) previas a la llegada a cierto punto o usadas
para aterrizar. En Genética, también se usa el concepto, el vector genético es una porción
de la cadena de ADN que transmite algún tipo de información genética.
1.80mts
500kl
Cuando hablamos de magnitudes escalares, estos se obtendrán del conjunto R. Para las
magnitudes vectoriales de dos componentes usaremos el plano representado como R2 . En
el espacio el conjunto se llamará R3 y para dimensiones más grandes hablaremos de Rn .
b Q b Q
−−→ −−→
PQ QP
b b
P P
−−→ −−→
Figura 5.1: Segmentos dirigidos P Q y QP .
concepto de vector:
Ahora bien, matemáticamente podemos representar un vector en el plano como una tupla:
las dos definiciones suenan un poco distintas, pero en realidad, representan un mismo
concepto. La representación matemática en forma de tupla sólo tiene en cuenta el punto
final del vector, el punto inicial se toma el origen del sistema, por ejemplo: Tomemos el
−−→
vector P Q con P (1, 3) y Q(5, 6) veamos la figura 5.2.
−−→
Vemos en la sub figura (a) de la figura 5.2, el vector P Q y en la sub figura (b) el vector
(4, 3); ambos vectores son iguales, el lector puede apreciar que ambos tienen la misma
longitud, en este caso 5 y ambos tienen el mismo ángulo de elevación con respecto al eje
horizontal, que en este caso es de 36.87o o 0.6435011 radianes.
Q
6 6
5 5
4 4
(4, 3)
3 3
P
2 2
1 1
0 0
0 1 2 3 4 5 6 0 1 2 3 4 5 6
(a) (b)
−−→
Figura 5.2: Los vectores P Q y (4, 3)
Otro de los componentes del vector es su ángulo de elevación, también conocido como
dirección u orientación del vector.
5. Vectores y Espacios vectoriales 213
(a, b)
b2
+
√ a2 b
(a, b)
.:Ejemplo 5.1
La magnitud:
5 (2, 5)
p √ √
5
5 .3 8
|v| = 22 + 52 = 4 + 25 = 29 = 5.3851
4
52 =
Ahora su dirección estaría dada por:
22+
3
5
= √
tan θ = = 2.5 2 v
2
|v |
Luego 1
θ = 68.12
θ = tan−1 (2.5) = 1.1902899 0
0 1 2 3
que en grados, sería aproximadamente
68.198591. Figura 5.5: El vector v = (2, 5) con su
magnitud y dirección
Recuerde que en algunos casos, cuando el
vector no esta en el primer cuadrante, el ángulo de la dirección no siempre corresponde a
un ángulo positivo. Para visualizarlo, debemos sumar o restar π según sea el caso.
Como vemos, la Definición 5.6 es igual a la Definición 1.8, sólo que se aplica para matrices
de tamaño n×1 o 1×n según sean vectores filas o vectores columna. Gráficamente, la suma
de vectores, genera un paralelogramo construido de tal forma que, en el punto final del
primer vector se ubica el otro vector; luego, al segundo vector, se le ubica el primer vector
en su punto final. De esa forma, construimos un paralelogramo; el nuevo vector v1 + v2 ,
5. Vectores y Espacios vectoriales 215
((a1 + a1 ), (b1 + b2 ))
b1
v2
+
v1
v1
b2
v2
a1 a2
.:Ejemplo 5.2
w = v1 + v2
= (4 , 2) + (−1 , 1)
= (3 , 3)
4
w = (3, 3)
3
2
v1 = (4, 2)
v2 = (−1, 1)
1
−1 0 1 2 3 4
.:Ejemplo 5.3
1
Tomemos el vector v = (3, −2) y lo multiplicaremos por los escalares k1 = 2 y k2 = − :
2
k1 v = 2(3, −2) = (6, −4)
1 3
k2 v = − (3, −2) = − , 1
2 2
5. Vectores y Espacios vectoriales 217
k2 v
1
−2 −1 1 2 3 4 5 6
−1
v
−2
−3 k1 v
−4
Es fácil ver, que al multiplicar un escalar por un vector, la longitud del vector aumenta
|k| unidades, si k > 0 se conserva su dirección, pero si k < 0 su dirección se incrementa
en 180o. Tomemos v = (a, b) y k, veamos que ocurre con la magnitud de kv:
kv = (ka, kb)
Luego,
p
|kv| = (ka)2 + (kb)2
p
= k² a2 + k 2 b2
p
= k² (a2 + b2 )
p
= k (a2 + b2 ) = k |v|
los componentes del vector kv, estos quedan positivos. La dirección del vector es opuesta,
debido a que un escalar negativo cambia los signos de los componentes internos del vector.
v2 − v1 v1 − v2
v2 v2
v1 v1
.:Ejemplo 5.4
4
v1 − v2
3
v2
2
−2 −1 1 2 3 4 5 6
−1 v1
−2
−3
−4
−5
v2 − v1
−6
−7
= (6 − 4, −3 − 4)
= (2, −7)
Ahora bien,
220 5.1. Nociones básicas de vectores en R2
= (4 − 6, 4 − (−3))
= (−2, 7)
La figura 5.10, ilustra la situación. Como podemos observar, ambos vectores tienen la
misma magnitud:
p
|v2 − v1 | = (−2)2 + (7)2 = 7.2801
p
|v1 − v2 | = (2)2 + (−7)2 = 7.2801
En cuando al ángulo, ambos vectores son opuestos. Esto muestra que la diferencia de
vetores, produce vectores con la misma magnitud, pero con direcciones opuestas.
Todos los vectores se pueden representar como el producto de dos escalares por dos
vectores, a los que llamaremos vectores unitarios, dichos vectores, los denominaremos i
y j; más adelante, les daremos el nombre de bases unitarias a dichos vectores. El vector
i = (1, 0) y el vector j = (0, 1), cualquier vector se puede representar en forma de
estos vectores; por ejemplo, tomemos el vector v = (2, −1), para representarlo como la
multiplicación de los vectores i y j por los escalares 2 y -1:
Ahora:
= (2, −1)
Como vemos, los vectores v = (2, −1) y 2i + (−1)j son el mismo vector pero con diferente
representación.
5. Vectores y Espacios vectoriales 221
1
u= v
|v|
.:Ejemplo 5.5
1
u = v
|v|
1
= p (3, 5)
(3) + (5)2
2
= 0.1714986(3, 5)
= (0.5144958, 0.857493)
La figura 5.11 ilustra la situación. Ambos vectores, tienen la misma dirección pero
diferente longitud.
222 5.1. Nociones básicas de vectores en R2
5 5
4 4
3 3
2 2
u = (0.5144958, 0.857493)
1 v = (5, 3) 1
0 0
0 1 2 3 4 0 1 2 3 4
a1 a2 + b 1 b 2
cos θ =
|v1 | |v2 |
.:Ejemplo 5.6
Sean los vectores v1 = (4, 1) y v2 = (2, 5), hallar el ángulo entre los dos vectores:
p √
|v2 | = 22 + 52 = 29 = 5.3851648
Ahora,
(4)(2) + (1)(5)
cos θ = = 0.5854906
(4.1231056)(5.3851648)
4
v2
3
2
θ = 54.16o
1
v1
0
0 1 2 3 4 5
.:Ejemplo 5.7
Sean los vectores v1 = (−4, 8) y v2 = (2, 1), Determine si ambos vectores son ortogonales:
p √
|v1 | = (−4)2 + (8)2 = 80 = 8.9442719
p √
|v2 | = 22 + 12 = 5 = 2.236068
Ahora,
(−4)(2) + (8)(1)
cos θ = =0
(8.9442719)(2.236068)
π
θ = cos−1 (0) = 1.5707963 =
2
Luego v1 ⊥ v2 .
El concepto de vectores ortogonales, lo utilizaremos más adelante; el ejemplo más simple
es el de proyecciones ortogonales, que es cuando un vector se proyecta sobre otro vector
o sobre un plano. de igual forma, lo encontramos en la factorización de matrices de la
forma A = QR, (ver la sección 2.4) donde la matriz Q es un matriz ortogonal, es decir,
sus vectores columna son ortogonales entre si. La matriz Q tiene muchas aplicaciones,
sobretodo en la computación gráfica (rotación y reflexión de figuras ).
v1 3
2 π
θ=
2
1
v2
−4 −3 −2 −1 0 1 2
La figura 5.14, vemos que el vector proyv u, es paralelo al vector v, en cuyo caso, tienen
las mismas direcciones o direcciones opuestas. En realidad, el proceso de obtener el vector
proyección consiste, en conseguir un nuevo vector a partir de v, el cual, se redimensiona
a1 a2 + b 1 b 2
multiplicándolo por un escalar, que en este caso es 2 , para que coincida con la
|v|
proyección ortogonal de u.
.:Ejemplo 5.8
u
u
v
π
θ> 2
v
θ proyv u
π
0<θ< 2 proyv u
a1 a2 + b 1 b 2 > 0 a1 a2 + b 1 b 2 < 0
(6)(2) + (1)(5)
proyv u = (2, 5)
5.38516482
= 0.5862069(2, 5)
= (1.1724138, 2.9310345)
(6)(2) + (1)(5)
proyu v = (6, 1)
6.08276252
= 0.4594595(6, 1)
= (2.756757, 0.4594595)
5 5
v v
4 4
proyv u = (1.17, 2.93)
3 3
1 1
u u
0 0
0 1 2 3 4 5 6 0 1 2 3 4 5 6
.:Algoritmo 5.1
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " D e f i n i m o s l o s v e c t o r e s u y v\n"
5
6 u=np . a r r a y ( [ 2 , 5 ] , dtype=f l o a t )
7 v=np . a r r a y ( [ 6 , 1 ] , dtype=f l o a t )
8
9 p r i n t " El v e c t o r u : " , u , " \n"
10 p r i n t " El v e c t o r v : " , v , " \n"
11
12 d e f l o n g V e c to rR 2 ( v ) :
13 r e t u r n np . s q r t ( v [ 0 ] ∗ ∗ 2 + v [ 1 ] ∗ ∗ 2 )
14
15 p r i n t "La l o n g i t u d d e l v e c t o r u e s : " , l o n g V e c to rR 2 ( u )
16 print " "
17 p r i n t "La l o n g i t u d d e l v e c t o r v e s : " , l o n g V e c to rR 2 ( v )
18
19 def direccionVectorR2 ( v ) :
20 i f v [0]==0:
21 r e t u r n np . p i / 2 . 0
22 else :
23 return atan ( v [ 1 ] / v [ 0 ] )
24
25 print " \nLa d i r e c c i o n del vector u : " , direccionVectorR2 (u)
26 print " \n en g r a d o s e s : " , ( 1 8 0 . 0 ∗ d i r e c c i o n V e c t o r R 2 ( u ) ) /np . p i
27
28 print " \nLa d i r e c c i o n del vector v : " , direccionVectorR2 (v )
29 print " \n en g r a d o s e s : " , ( 1 8 0 . 0 ∗ d i r e c c i o n V e c t o r R 2 ( v ) ) /np . p i
30
31 def vectorUnitario (v) :
32 k =1.0/ l o n g V e c to rR 2 ( v )
228 5.1. Nociones básicas de vectores en R2
33 r e t u r n k∗ v
34
35 print " \ nEl v e c t o r u n i t a r i o del vector u : " , vectorUnitario (u)
36 print " \ nEl v e c t o r u n i t a r i o del vector v : " , vectorUnitario (v)
37
38 def anguloEntreVectores (u , v ) :
39 t =(u [ 0 ] ∗ v [ 0 ] + u [ 1 ] ∗ v [ 1 ] ) / ( l o n g V e c to rR 2 ( u ) ∗ l o n g V e c to r R 2 ( v ) )
40 return acos ( t )
41
42 print " \ nEl a n g u l o e n t r e u y v e s : " , a n g u l o E n t r e V e c t o r e s ( u , v )
43 print " \n en g r a d o s e s : " , ( 1 8 0 . 0 ∗ a n g u l o E n t r e V e c t o r e s ( u , v ) ) /np . p i
44
45 def vectorProyeccion (u , v) :
46 k=(u [ 0 ] ∗ v [ 0 ] + u [ 1 ] ∗ v [ 1 ] ) / ( l o n g V e c to rR 2 ( v ) ∗ ∗ 2 )
47 r e t u r n k∗ v
48
49 print " \ nEl v e c t o r proyuv e s : " , v e c t o r P r o y e c c i o n ( u , v )
50 print " \ nEl v e c t o r proyvu e s : " , v e c t o r P r o y e c c i o n ( v , u )
1 >>>
2 Definimos l o s v e c t o r e s u y v
3
4 El v e c t o r u : [ 2. 5.]
5
6 El v e c t o r v : [ 6. 1.]
7
8 La l o n g i t u d d e l v e c t o r u e s : 5.38516480713
9
10 La l o n g i t u d d e l v e c t o r v e s : 6.0827625303
11
12 La d i r e c c i o n del vector u : 1.19028994968
13
14 en g r a d o s e s : 68.1985905136
15
16 La d i r e c c i o n del vector v : 0.165148677415
17
18 en g r a d o s e s : 9.46232220803
19
20 El v e c t o r u n i t a r i o del vector u : [ 0.37139068 0.92847669]
21
22 El v e c t o r u n i t a r i o del vector v : [ 0.98639392 0.16439899]
23
24 El a n g u l o e n t r e u y v e s : 1.02514127227
25
26 en g r a d o s e s : 58.7362683056
27
28 El v e c t o r proyuv e s : [ 2.75675676 0.45945946]
5. Vectores y Espacios vectoriales 229
29
30 El v e c t o r proyvu e s : [ 1.17241379 2.93103448]
31 >>>
5.2. Vectores en Rn
El concepto de vector en el plano puede llevarse a más dimensiones, sólo debemos
aumentar la cantidad de componentes del vector. Sin embargo, sólo podemos tener una
representación gráfica hasta R3 , de ahí en adelante, no es posible hacer la gráfica de un
vector pero, si podemos hacer las mismas operaciones que hacíamos con los vectores en
R2 . Para iniciar, haremos una definición más amplia de lo que es un vector en Rn .
Cuando hablamos de una n tupla, nos referimos a una secuencia ordenada de objetos, en
este caso las componentes del vector. Así por ejemplo, los vectores en el espacio llamado
R3 , tienen tres componentes:
v = (x, y, z)
Su representación gráfica ya no se ciñe al plano xy, ahora debemos tener en cuenta el eje
z, el cual es perpendicular (ortogonal) al plano xy. En la figura 5.16 se ilustra la posición
del nuevo eje.
En el espacio, es muy fácil graficar un vector, sólo debemos tener en cuenta la nueva
componente z. Tomemos como ejemplo los vectores u = (2, 1, 3), v = (−2, 3, 4) y
w = (3, 3, 0) hagamos su representación gráfica en el espacio.
b
v
u
b
x y
b
El despliegue de los tres ejes coordenados, implica la aparición de tres planos coordenados,
llamados xy, yz y xz. Desafortunadamente, no podemos tener una representación gráfica
de vectores con dimensión mayor a tres. Sin embargo, si podemos realizar las mismas
operaciones, por ejemplo, la suma, la diferencia, el vector proyector, etc.
232 5.2. Vectores en Rn
.:Ejemplo 5.9
Para u tenemos:
p
|u| = (−3)2 + 52 + (−1)2
√ √
= 9 + 25 + 1 = 35 = 5.9160798
Para v:
p
|u| = 12 + (−2)2 + 42 + 82 + 72
√ √
= 1 + 4 + 16 + 64 + 49 = 134 = 11.575837
Como vemos el concepto es el mismo, sólo que lo extendemos a las diferentes dimensiones.
.:Ejemplo 5.10
Tomemos los vectores en R3 u = (3, 2, 1) y v = (1, −1, 2), su suma está dada por:
u+v = (3 + 1, 2 + (−1), 1 + 2)
= (4, 1, 3)
u−v = (3 − 1, 2 − (−1), 1 − 2)
= (2, 3, −1)
z z
b b
u+v b
v v
b b
u y u
u+v y
x x
(a) u + v (b) u − v
.:Ejemplo 5.11
kv = 2(1, 2, 1)
= (2, 4, 2)
En la figura 5.19, se muestra el vector v y el vector kv, en este ejemplo de puede ver
que el concepto es el mismo que en plano xy, el vector amplía su longitud k veces, si es
negativo lo ampliará en el sentido contrario, mientras que si 0 < k < 1, provocará que el
vector se reduzca.
v
b
kv
b
y
x
.:Ejemplo 5.12
p
|v| = 0.26726122 + 0.53452252 + 0.80178372
= 1
Al igual que en un vector en R2 , para obtener un vector unitario a partir de otro vector
no unitario, sólo se multiplica el vector, por el reciproco de su norma:
.:Ejemplo 5.13
Sea v un vector de R3 , tal que v = (1, 5, 2), a partir de este vector encontraremos el vector
unitario u, tal que v y u tengan la misma dirección. Primero hallamos la norma de v:
p
|v| = 12 + 52 + 22
√
= 30
1
u = v
|v|
1
= √ (1, 5, 2)
30
Ahora bien, ya hemos tratado el tema de las longitudes de los vectores. Sin embargo, y
como vimos en el caso de R2 , en el espacio no es posible tener sólo un eje de referencia,
necesitamos el ángulo tomado desde los demás ejes.
Gráficamente, podemos apreciar que los ángulos directores, son en realidad el mismo
concepto de dirección de un vector en R2 pero llevado al espacio. Los ángulos directores,
tienen en cuenta todos los ejes para determinar su dirección.
(0, 0, c)
(a, b, c)
α
(0, b, 0)
(a, 0, 0)
β
La figura 5.20, muestra la disposición de los ángulos directores del vector v = (a, b, c).
Los cosenos de dichos ángulos son comúnmente llamados cosenos directores, y cumplen
5. Vectores y Espacios vectoriales 237
a2 + b 2 + c2 a2 + b 2 + c2
cos2 α + cos2 β + cos2 γ = = 2 =1
|v| a + b 2 + c2
donde los ángulos, α, β y γ están en el intervalo [0, π].
.:Ejemplo 5.14
Ahora:
1
cos α = √ = 0.1690309
35
3
cos β = √ = 0.5070926
35
−5
cos γ = √ = −0.8451543
35
Así como en el plano hallamos el ángulo entre dos vectores, de igual forma lo podemos
hacer entre dos vectores en el espacio. Sólo debemos tener encuentra los demás ejes
coordenados.
Ahora bien, este ángulo θ debe ser calculado usando los componentes de los vectores u y
v.
238 5.2. Vectores en Rn
El siguiente ejemplo ilustra cómo podemos encontrar el ángulo entre dos vectores en el
espacio.
.:Ejemplo 5.15
p √
|v| = 12 + 12 + 22 = 6
Luego:
Tengamos en cuenta que si dos vectores son paralelos, entonces el ángulo entre ellos es π
o cero, mientras que si son ortogonales o perpendiculares, el ángulo entre ellos es π2 , es
decir, 90o .
u = kv
para algún k 6= 0
5. Vectores y Espacios vectoriales 239
u b
b
v
θ
Lo que nos dice el teorema anterior, es que los vectores que son paralelos, pueden tener
la misma dirección o la dirección contraria; lo que varía en ellos es el tamaño.
u·v = 0
.:Ejemplo 5.16
240 5.2. Vectores en Rn
5 5 5
Entonces proyv u = 6, 6, 3 = (0.8333333, 0.8333333, 1.6666667) (figura 5.22)
ub
v
b
b
Como vemos el producto cruz entre los vectores genera otro vector que es ortogonal a los
vectores iniciales. El principal ejemplo que encontramos del producto cruz es el eje z, el
cual es ortogonal a los ejes x y y.
.:Ejemplo 5.17
= 3i + 0j − 3k
v×u = −3i + 0j + 3k
En la figura 5.23, podemos ver que u × v es muy diferente a v × u, aunque tienen el mismo
tamaño, tiene direcciones opuestas, en cuyo caso u × v = −(v × u). Además, podemos
apreciar que u×v y v×u son ortogonales a los vectores u y v, lo cual es fácil de corroborar:
= 0
Ahora v · (u × v)
242 5.2. Vectores en Rn
v×u
v b
y
x
b
u×v
= 0
El producto vectorial, se puede representar por medio del determinante de una matriz de
3 × 3; si vemos las definiciones 5.21 y 4.3, observamos que los procesos son similares.
i j k
b1 c1 a1 c1 a1 b1
u×v = a1 b1 c1 =i −j +k
b2 c2 a2 c2 a2 b2
a2 b2 c2
.:Ejemplo 5.18
Sean los vectores u = (4, −1, 2) y v = (−5, 0, 1), usar los determinantes para hallar el
producto vectorial o producto cruz.
i j k
−1 2 4 2 4 −1
u×v = 4 −1 2 =i −j +k
0 1 −5 1 −5 0
−5 0 1
Ya hemos visto que el producto cruz o producto vectorial, tiene algunas propiedades como
lo hemos señalado en los ejemplos anteriores. El siguiente teorema lista las propiedades
más significativas del producto vectorial:
3. u × v = −(v × u)
4. u × (v + w) = (u × v) + (u × w)
.:Ejemplo 5.19
Tomemos los vectores u = (3, −1, −1), v = (5, 1, 0) y w = (1, −2, 7). El triple producto
escalar entre u, v y w se calcula de la siguiente forma:
244 5.2. Vectores en Rn
Como vemos, las operaciones en R2 , R3 y otras dimensiones son muy similares. El siguiente
algoritmo, implementa algunos de estos procesos:
.:Algoritmo 5.2
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " D e f i n i m o s l o s v e c t o r e s u y v\n"
5
6 u=np . a r r a y ( [ 5 , −2, 7 ] , dtype=f l o a t )
7 v=np . a r r a y ( [ 2 , −1, 3 ] , dtype=f l o a t )
8
9 p r i n t " El v e c t o r u : " , u , " \n"
10 p r i n t " El v e c t o r v : " , v , " \n"
11
12 d e f NormaRn ( v ) :
13 suma=0.0
14 for i in v :
15 suma=suma+i ∗∗2
16 r e t u r n np . s q r t ( suma )
17
18 p r i n t "La l o n g i t u d d e l v e c t o r u e s : " , NormaRn ( u )
19 print " "
20 p r i n t "La l o n g i t u d d e l v e c t o r v e s : " , NormaRn ( v )
21
22 def vectorUnitario (v) :
23 k =1.0/NormaRn ( v )
24 r e t u r n k∗ v
25
26 print " \ nEl v e c t o r u n i t a r i o del vector u : " , vectorUnitario (u)
27 print " \ nEl v e c t o r u n i t a r i o del vector v : " , vectorUnitario (v)
28
29 def CosenosDirectores (v) :
30 Lista =[]
31 n=NormaRn ( v )
32 for i in v :
33 L i s t a . append ( i /n )
34 return Lista
35
36 print " \ nLos c o s e n o s d i r e c t o r e s del vector u : " , CosenosDirectores (u)
37 print " \ nLos c o s e n o s d i r e c t o r e s del vector v : " , CosenosDirectores (v)
38
39 d e f A n g u l o E n tre V e c t o r e s ( u , v ) :
40 cosT=(u . dot ( v . T) ) / ( NormaRn ( u ) ∗NormaRn ( v ) )
5. Vectores y Espacios vectoriales 245
41 return a c o s ( cosT )
42
43 p r i n t " \ nEl a n g u l o e n t r e l o s v e c t o r e s u y v : " , A n g u l o E n tre V e c t o r e s ( u , v ) , "
rad "
44 p r i n t " \ nen g r a d o s s e x a g e s i m a l e s e s : " , ( 1 8 0 . 0 ∗ A n g u l o E n tre V e c to r e s ( u , v ) ) /np
. pi
45
46 def vectorProyeccion (u , v) :
47 k=(u . dot ( v . T) ) / ( NormaRn ( v ) ∗ ∗ 2 )
48 r e t u r n k∗ v
49
50 print " \ nEl v e c t o r proyuv e s : " , v e c t o r P r o y e c c i o n ( u , v )
51 print " \ nEl v e c t o r proyvu e s : " , v e c t o r P r o y e c c i o n ( v , u )
52
53 d e f ProductoCruz ( u , v ) :
54 k0=u [ 1 ] ∗ v [ 2 ] − u [ 2 ] ∗ v [ 1 ]
55 k1=u [ 2 ] ∗ v [ 0 ] − u [ 0 ] ∗ v [ 2 ]
56 k2=u [ 0 ] ∗ v [ 1 ] − u [ 1 ] ∗ v [ 0 ]
57 r e t u r n np . a r r a y ( [ k0 , k1 , k2 ] )
58
59 print " \ nEl v e c t o r uxv : " , ProductoCruz ( u , v )
60 print " \ nEl v e c t o r vxu : " , ProductoCruz ( v , u )
1 >>>
2 Definimos l o s v e c t o r e s u y v
3
4 El v e c t o r u : [ 5 . −2. 7.]
5
6 El v e c t o r v : [ 2 . −1. 3.]
7
8 La l o n g i t u d d e l v e c t o r u e s : 8.83176086633
9
10 La l o n g i t u d d e l v e c t o r v e s : 3.74165738677
11
12 El v e c t o r u n i t a r i o del vector u : [ 0 . 5 6 6 1 3 8 5 2 −0.22645541 0.79259392]
13
14 El v e c t o r u n i t a r i o del vector v : [ 0 . 5 3 4 5 2 2 4 8 −0.26726124 0.80178373]
15
16 Los c o s e n o s d i r e c t o r e s del vector u : [0.56613851707229779 ,
−0.22645540682891913 , 0.79259392390121697]
17
18 Los c o s e n o s d i r e c t o r e s del vector v : [0.53452248382484879 ,
−0.2672612419124244 , 0.80178372573727319]
19
20 El a n g u l o e n t r e l o s v e c t o r e s u y v : 0 . 0 5 2 4 3 8 2 7 0 7 4 9 rad
21
22 en g r a d o s s e x a g e s i m a l e s e s : 3.00449159888
246 5.2. Vectores en Rn
23
24 El v e c t o r proyuv e s : [ 4 . 7 1 4 2 8 5 7 1 −2.35714286 7.07142857]
25
26 El v e c t o r proyvu e s : [ 2 . 1 1 5 3 8 4 6 2 −0.84615385 2.96153846]
27
28 El v e c t o r uxv : [ 1 . −1. − 1 . ]
29
30 El v e c t o r vxu : [ −1. 1. 1.]
31 >>>
√ √ √
a) u = (2, 3, −5) e) u = ( 45, 7, 28)
b) u = (7, 1, 8) f ) u = (1, 1, 1, 1)
c) u = (5, 6, 3, −9, −8, 7, 4) g) u = (1, 0, 0, 1, 0, 1)
d ) u = π, π2 , π4 , π6 h) u = π, π2 , π4 , π6 , . . . 2n
π
a) 3u + 2v d) u − v π 5
g) u− v
3 e
b) 5u − 8v e) −u + 5v
π e
c) 5u − πv f ) πeu + ev h) v + u
e π
π
a) u y v sean ortogonales. c) El ángulo entre u y v sea de 6
π
b) u y v sean paralelos. d ) El ángulo entre u y v sea de 2
248 5.2. Vectores en Rn
8. Dados u y v encuentre u × v y v × u:
a1 b1 c1
u · (v × w) = a2 b2 c2
a3 b3 c3
.:Definición 5.22 Diremos que el conjunto de vectores V , con dos operaciones, adición
+ y producto por escalar (·), son un espacio vectorial si satisfacen los siguientes axiomas:
7. Para todo escalar α y para todo v1 y v2 ∈ V , se cumple que α(v1 + v2 ) = αv1 + αv2 .
Distributiva del producto escalar frente a la suma de vectores.
Si los elementos que componen los vectores de un espacio vectorial V , pertenecen a los
reales; diremos que es un espacio vectorial real. Si dichos elementos son números complejos,
diremos que es un espacio vectorial complejo.
Ahora bien: ¿todo conjunto de vectores es un espacio vectorial?. Los dos ejemplos
mostrados a continuación, son comunes en varios textos de Álgebra Lineal, en este caso
tomaremos el ejemplo de [11] para ilustrar qué es y qué no es un espacio vectorial.
V = {v = (x, y) : ax + by = 0, a, b ∈ R}
podemos ver que V es un conjunto de vectores que están sobre las lineas rectas que pasan
por el origen del plano xy.
Para ajustarnos a la definición 5.22, debemos demostrar que V cumple los 10 axiomas:
1. Sean v1 = (x1 , y1 ) y v2 = (x2 , y2 ), de forma que v1 , v2 ∈ V , entonces debemos
demostrar que v1 + v2 también pertenece a V .
Si v1 ∈ V entonces se cumple que:
a(x2 + x3 ) + b(y2 + y2 ) = 0
a(x1 + x2 + x3 ) + b(y1 + y2 + y2 ) = 0
a(x1 + x2 ) + b(y1 + y2 ) = 0
a(x2 + x1 ) + b(y2 + y1 ) = 0
Luego v1 + v2 = v2 + v1 .
252 5.3. Espacio vectorial
a(αx1 ) + b(αy1 ) = 0
aα(x1 + x2 ) + bα(y1 + y2 ) = 0
α (βax1 + βby2 ) = 0
αβax1 + αβby2 = 0
(1)(ax1 + by1 ) = 0
ax1 + by1 = 0
Como vemos, los puntos de una recta que pasan por el origen del plano xy genera un
espacio vectorial. Ahora veremos un ejemplo de lo que no es, un espacio vectorial. Para
ello, tomaremos las rectas que no pasan por el origen del sistema, es decir:
V = {v = (x, y) : ax + by + c = 0, a, b, c ∈ R y (c 6= 0)}
Podemos ver que V es un conjunto de vectores que están sobre las líneas rectas que no
pasan por el origen del plano xy.
ax1 + by1 + c = 0
Ahora bien, v2 ∈ V puede tener la siguiente forma:
ax2 + by2 + c = 0
donde a1 , a2 , . . . , an ∈ R.
El siguiente ejemplo tomado de [11], muestra que los polinomios se pueden ver como
vectores de coeficientes y por lo tanto pueden formar espacios vectoriales, siempre que
estos conjuntos se adapten a la definición.
Que también es un polinomio de grado menor o igual a dos, lo que implica que
(p + q) ∈ V .
2. Supongamos que p, q, r ∈ V , de modo que p = a1 x2 + b1 x + c1 , q = a2 x2 + b2 x + c2
y r = a3 x2 + b3 x + c3 , entonces
p + (q + r) = a1 x2 + b1 x + c1 + a2 x2 + b2 x + c2 + a3 x2 + b3 x + c3
= a1 x2 + b1 x + c1 + a2 x2 + b2 x + c2 + a3 x2 + b3 x + c3
= (p + q) + r
Luego p + (q + r) = (p + q) + r, además, el polinomio (p + q) + r y el polinomio
p + (q + r) pertenecen a V por ser polinomios de grado menor o igual a dos.
3. Sea p ∈ V y sea 0 = 0x2 + 0x + 0 el polinomio de grado cero5 , entonces al hacer la
suma p + 0 tenemos:
p+0 = a1 x2 + b1 x + c1 + 0x2 + 0x + 0
= a1 x2 + b1 x + c1
= p
luego p + 0 = p
5 En este caso 0 representa el polinomio cero o nulo
5. Vectores y Espacios vectoriales 255
ax2 + bx + 5 = 0
Si tomamos dos polinomio de este espacio vectorial p1 = a1 x2 +b1 x+5 y p2 = a2 x2 +b2 x+5,
al sumarlos tenemos:
p1 + p2 = a1 x2 + b1 x + 5 + a2 x2 + b2 x + 5
SciPy y Numpy, tienen una librería especial para polinomios llamada polinomials. El
siguiente Algoritmo muestra cómo implementar los polinomios en Python:
5. Vectores y Espacios vectoriales 257
.:Algoritmo 5.3
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t "Tenemos dos p o l i n o m i o s p y q : "
5
6 p = np . p o l y 1 d ( [ 1 , 2 , 1 ] ) ;
7 q = np . p o l y 1 d ( [ 3 , 2 , −5, 6 ] ) ;
8
9 p r i n t " \ nEl p o l i n o m i o p : \ n" , p
10 p r i n t " \n\ nEl p o l i n o m i o q : \ n" , q
11
12 p r i n t " \n E v a l u a r p ( 3 . 8 ) : " , p ( 3 . 8 8 5 4 7 )
13 p r i n t " \n E v a l u a r q ( 5 ) : " , q ( 5 )
14
15 p r i n t " \n El o rd e n de p : " , p . o r d e r
16 p r i n t " \n El o rd e n de q : " , q . o r d e r
17
18 p r i n t " \n Los c o e f i c i e n t e s de p: " , p. coeffs
19 p r i n t " \n Los c o e f i c i e n t e s de q: " , q. coeffs
20
21 p r i n t " \n l a v a r i a b l e de p : " , p . v a r i a b l e
22 p r i n t " \n l a v a r i a b l e de q : " , q . v a r i a b l e
23
24 p r i n t " \n l a s r a i c e s de p:" , p. r
25 p r i n t " \n l a s r a i c e s de q:", q. r
26
27 p r i n t " \n El c o e f i c i e n t e de x^2 de p : " , p [ 2 ]
28 p r i n t " \n El c o e f i c i e n t e de x^1 de q : " , q [ 1 ]
29
30 w = np . p o l y 1 d ( [ 2 , 0 , 1 ] , v a r i a b l e = ’ z ’ )
31
32 p r i n t " \n El p o l i n o m i o w con v a r i a b l e z : \ n" , w
33
34 p r i n t " \n O p e r a c i o n e s con p o l i n o m i o s \n "
35
36 p r i n t " \n E s c a l a r por un p o l i n o m i o : 4p=\n" , 4∗ p
37
38 p r i n t " \n Suma de p o l i n o m i o s : p+q=\n" , p+q
39
40 p r i n t " \n m u l t i p l i c a c i o n de p o l i n o m i o s : p∗q=\n" , p∗q
41
42 p r i n t " \n O p e r a c i o n e s en g e n e r a l 4∗ p+5∗q−w=\n" , 4∗p+5∗q−w
43
44 p r i n t " \n C o n t r u i r un p o l i n o m i o a p a r t i r de s u s r a i c e s : \ n"
45
46 k=np . p o l y 1 d ( [ 5 , −3, −8] , True )
47
48 p r i n t " \n El p o l i n o m i o r \n" , np . p o l y 1 d ( k )
49
50 p r i n t " \n Las r a i c e s de k=\n" , k . r
258 5.3. Espacio vectorial
1 >>>
2 Tenemos dos p o l i n o m i o s p y q :
3
4 El p o l i n o m i o p :
5 2
6 1 x + 2 x + 1
7
8
9 El p o l i n o m i o q :
10 3 2
11 3 x + 2 x − 5 x + 6
12
13 Evaluar p ( 3 . 8 ) : 23.8678171209
14
15 E v a l u a r q ( 5 ) : 406
16
17 El o rd e n de p : 2
18
19 El o rd e n de q : 3
20
21 Los c o e f i c i e n t e s de p : [1 2 1]
22
23 Los c o e f i c i e n t e s de q: [ 3 2 −5 6]
24
25 l a v a r i a b l e de p : x
26
27 l a v a r i a b l e de q : x
28
29 l a s r a i c e s de p : [ −1. −1.]
30
31 l a s r a i c e s de q : [ − 2 . 0 0 0 0 0 0 0 0 + 0 . j 0 . 6 6 6 6 6 6 6 7 + 0 . 7 4 5 3 5 5 9 9 j
0.66666667 −0.74535599 j ]
32
33 El c o e f i c i e n t e de x^2 de p : 1
34
35 El c o e f i c i e n t e de x^1 de q : −5
36
37 El p o l i n o m i o w con v a r i a b l e z :
38 2
39 2 z + 1
40
41 O p e r a c i o n e s con p o l i n o m i o s
42
43 E s c a l a r por un p o l i n o m i o : 4p=
44 2
45 4 x + 8 x + 4
5. Vectores y Espacios vectoriales 259
46
47 Suma de p o l i n o m i o s : p+q=
48 3 2
49 3 x + 3 x − 3 x + 7
50
51 m u l t i p l i c a c i o n de p o l i n o m i o s : p∗q=
52 5 4 3 2
53 3 x + 8 x + 2 x − 2 x + 7 x + 6
54
55 O p e r a c i o n e s en g e n e r a l 4∗p+5∗q−w=
56 3 2
57 15 x + 12 x − 17 x + 33
58
59 C o n t r u i r un p o l i n o m i o a p a r t i r de s u s r a i c e s :
60
61
62 El p o l i n o m i o r
63 3 2
64 1 x + 6 x − 31 x − 120
65
66 Las r a i c e s de k=
67 [ 5 . −8. − 3 . ]
68
69 >>>
El Algoritmo 5.3 toma dos polinomio p(x) = x2 + 2x + 1 y q(x) = 3x3 + 2x2 − 5x + 6, cada
uno de ellos se genera con el comando p=np.poly1d([1, 2, 1]); la función poly1d([1, 2, 1]),
recibe como parámetros una lista con los coeficientes del polinomio. Los polinomios p y q
se declaran en las líneas 6 y 7.
[Link] : Esta función no tiene parámetros y entrega el orden del polinomio. En las líneas
15 y 16 vemos que p es de orden 2 y q es de orden 3. El tamaño de la lista de los
coeficientes está relacionado con el orden del polinomio, si la lista es de tamaño n
el polinomio es de tamaño n − 1.
[Link]: Al igual que la función order, coeffs tampoco tiene parámetros. La función
entrega la lista con los coeficientes del polinomio, líneas 18 y 19.
[Link]: Esta función no tiene parámetros. En las líneas 21 y 22, vemos que entrega
la variable en la que está definida el polinomio.
260 5.3. Espacio vectorial
p.r : Con esta función, obtenemos las raíces del polinomio. En las líneas 24 y 25
obtenemos la lista con las raíces del polinomio p que son [−1.0, −1.0] y las de q
son [−2.00000000 + 0j, 0.66666667 + 0.74535599j, 0.66666667 − 0.74535599j] (la
primera es una raíz real, las demás son complejas).
p[k]: Esta opción, es diferente a p(k); en esta se hace referencia a la lista de coeficientes,
y entrega el coeficiente que tenga la variable x con la potencia k. En las líneas 27 y
28, se puede ver como obtenemos el coeficiente de x2 de p y el coeficiente de x de q
(líneas 27 a 28).
Con la opción w = np.poly1d([2,0,1], variable=’z’), podemos declarar un polinomio con la
variable z y no x como es común. Además, podemos realizar operaciones entre polinomios
como 4p, p + q, p ∗ q, 4 ∗ p + 5 ∗ q − w, en este último caso, p y q son polinomios con
variable x y w es con variable z, pero Python los suma sin mostrar un error (líneas 30 a
42).
Con la opción k=np.poly1d([5, -3, -8], True), creamos un polinomio con una lista de raíces
y no de coeficientes como hicimos anteriormente. Luego imprimimos el polinomio k y sus
raíces (líneas 44 a 50).
.:Ejercicios 5.2
1. Demuestre que:
a) Rn es un espacio vectorial.
5. Vectores y Espacios vectoriales 261
b) Pn es un espacio vectorial.
c) Mmn es un espacio vectorial. (Con la suma y multiplicación por escalar)
d ) Mnn es un espacio vectorial. (Con la suma y multiplicación por escalar)
a) V el conjunto de todos los vectores (x, y) con y ≤ 0, con las operaciones usuales
en R2 .
b) V = {0}, con las operaciones ordinarias de suma y multiplicación en R.
c) V = {k} (donde k ∈ R) con las operaciones de suma y producto en R.
d ) V = R, con las operaciones ordinarias de suma y multiplicación en R.
e) V = (x, y, z) ∈ R3 /x = 0, , y, z ∈ R con las operaciones usuales de R3 .
f ) V el conjunto de matrices invertibles n × n con las operaciones matriciales
ordinarias.
g) V el conjunto de matrices no invertibles n × n con las operaciones matriciales
ordinarias.
1. H es subconjunto de V
2. H es diferente de vacío.
Los subespacios no vacíos son relativamente más fáciles de identificar, pues sólo falta
comprobar las reglas 3 y 4 del Teorema 5.7 , el cual, establece que para ser subespacio
vectorial, sólo se debe comprobar la cerradura bajo la suma y la cerradura bajo la
multiplicación por escalar. Además, debemos garantizar que el subespacio de un espacio
vectorial V contenga el vector nulo 0.
Según la teoría de conjuntos, tanto el conjunto mismo como el conjunto vacío, son
subconjuntos del conjunto original; en el caso de los espacios vectoriales, pasa exactamente
lo mismo: si V es un espacio vectorial, entonces V es un subespacio de V y el conjunto
vacío ∅ también es subespacio de V . De igual manera ocurre con {0}, es decir, el conjunto
unitario que sólo contiene el vector nulo.
.:Ejemplo 5.24 Sea H = (x, y) ∈ R2 /xy ≥ 0 y V = R2 . Comprobar que H es
subespacio de V .
264 5.4. Subespacio vectorial
Bien, el espacio vectorial V es el plano, es decir, nuestros vectores representan todos los
puntos que están en el plano xy. Ahora bien, el subconjunto H, representa todos los
puntos del plano, tales que al multiplicar las componentes del punto, esta multiplicación
debe ser positiva. En este caso, H estaría representando los puntos del plano que están en
el primer y tercer cuadrante. Por ejemplo, el punto v = (2, 3) esta en H, pues 2 ∗ 3 ≥ 0,
u = (−2, −5) también esta en H pues −2 ∗ (−5) ≥ 0; sin embrago, el vector w = (2, −1)
no pertenece a H, pues 2 ∗ (−1) 6≥ 0. Veamos ahora, como es el proceso para determinar
si H es subespacio de V :
3. Si v1 = (x
1 , y1 ) y v2= (x2 , y2 ) y v1 , v2 ∈ H, entonces x1 y1 ≥ 0 y x2 , y2 ≥ 0 y
x1 + x2
v1 +v2 = , pero en este caso, puede suceder que (x1 + x2 ) (y1 + y2 ) < 0,
y1 + y2
por ejemplo, si v1 = (−8, −10) y v2 = (3, 15), ambos pertenecen a H,
pero v1 + v2 = (−5, 5), el cual, no pertenece a H, pues (x1 + x2 ) (y1 + y2 ) =
(−8 + 3) (−10 + 15) = −25 < 0, luego, se concluye que H no es cerrado con respecto
a la suma y por tanto H no es subespacio de R2 .
.:Ejemplo 5.25 Sea H = (x, y) ∈ R2 /y = 0 y V = R2 . Comprobar que H es
subespacio de V .
El subconjunto H, representa todos los puntos del espacio que están en la recta real x, es
decir, son todos los puntos del plano que están sobre el eje x. Por ejemplo, el punto (3, 0)
y (−5, 0) pertenecen a H, pero (2, −4) y (1, 5) no están en H.
El conjunto V está conformado por los polinomios de grado menor o igual a 2. H está
conformado por los polinomios de grado 2, que al evaluarlos en cero, da como resultado
cero; en pocas palabras, son los polinomios de grado menor o igual a dos, donde el
coeficiente de x0 es cero. Por ejemplo x2 + 2x y 3x pertenecen a H, pero 7x2 + x − 6 y
3x + 9 no pertenecen a H.
.:Ejercicios 5.3
a) V = R2 , H = {(x, y) : y = 0}
b) V = R2 , H = {(x, y) : x = 2y}
c) V = R2 , H = {(x, y) : x − 7y + 5 = 0}
d ) V = P4 , W = {p ∈ P4 : p (0) = k, Para k ∈ R}
e) V = Mnn , H = {A ∈ Mnn : A es simétrica}
f ) V = Mnn , H = {A ∈ Mnn : A es antisimétrica}
g) V = Mnn , H = {A ∈ Mnn : A es triangular superior}
h) V = Mnn , H = {A ∈ Mnn : A es invertible}
i) V = R3 , H = (x, y, z) : x2 + y 2 + z 2 = 16
a 0
j ) V = M22 , H = A ∈ M22 : A =
0 b
k ) V = Mnn y H = {A ∈ Mnn : trA = 0}
a b c
l ) V = M23 , H = A ∈ M23 : A = , donde b = 2a + c .
d 0 0
2. Demuestre que:
266 5.5. Combinación lineal de vectores
x = α1 v1 + α2 v2 + · · · + αn vn
Xn
= αi vi
i=1
.:Ejemplo 5.27
−1 2
Tomemos los vectores en R3 : v1 = 2 y v2 = −4 , tomando α1 = 3 y α2 = −1,
9 7
5. Vectores y Espacios vectoriales 267
obtenemos:
2 −1 2
−4 = 3 2 + (−1) −4
7 9 7
−3 −2
= 6 + 4
27 −7
−5
= 10
20
−5
Decimos que 10 es combinación lineal de v1 y v2 con los escalares α1 = 3 y α2 = −1.
20
.:Ejemplo 5.28
3 7 1 4
Las matrices de M22 : A = yB = , tomando α1 = 9 y α2 = −2,
0 1 5 −1
obtenemos:
25 55 3 7 1 4
= (9) + (−2)
−10 11 0 1 5 −1
25 55
La matriz es combinación lineal de las matrices A y B, con α1 = 9 y
−10 11
α2 = −2.
.:Ejemplo 5.29
Luego, el polinomio H(x) es una combinación lineal de los polinomios P (x) y Q(x) con
α1 = 7 y α2 = 8
268 5.5. Combinación lineal de vectores
.:Ejemplo 5.30
1 0
Los vectores y , se conocen como bases canónicas de R2 . de igual manera, los
0 1
1 0 0
vectores 0 , 1 y 0 , se conocen como bases canónicas de R3 . En términos
0 0 1
1 0 0
0 1 0
generales, los vectores . , . · · · . , se conocen como la base canónica para
.. .. ..
0 0 1
Rn .
3
Si queremos construir el vector 5 de R3 , entonces, podemos generarlo de la
−2
siguiente forma:
3 1 0 0
5 = 3 0 +5 1 −2 0
−2 0 0 1
Como podemos apreciar,
bastacon
cambiar
los
escalares
para generar el vector deseado.
1 0 0
Esto implica que gen 0 , 1 , 0 genera a R3 . De la misma manera
0 0 1
1 4 2
con Rn . La pregunta es: ¿gen 2 , −7 , 1 también puede generar
1 2 5
3
5 ?
−2
5. Vectores y Espacios vectoriales 269
1 4 2
.:Ejemplo 5.31 Determine si 2 , −7 , 1 puede generar a
1 2 5
3
5 :
−2
Sólo debemos determinar si existen escalares k1 , k2 y k3 tales que:
3 1 4 2
5 = k1 2 + k2 −7 + k3 1
−2 1 2 5
Si realizamos las operaciones planteadas, obtendremos la siguiente igualdad entre vectores:
3 k1 + 4k2 + 2k3
5 = 2k1 − 7k2 + k3
−2 k1 + 2k2 + 5k3
Lo que equivale a resolver el sistema:
k1 + 4k2 + 2k3 = 3
2k1 − 7k2 + k3 = 5
k1 + 2k2 + 5k3 = −2
que al resolverlo, obtenemos k1 = 4.4509804, k2 = 0.3529412 y k3 = −1.4313725,
entonces:
3 1 4 2
5 = 4.4509804 2 + 0.3529412 −7 − 1.4313725 1
−2 1 2 5
Bien, en este caso si es posible comprobar, si un conjunto de vectores genera un vector;
pero podemos preguntarnos: ¿cualquier conjunto de tres vectores puede generar un vector
dado de R3 ?, ¿dos vectores de R3 , pueden generar cualquier vector de R3 ? mejor aun ¿un
vector de R3 , pueden generar cualquier vector de R3 ?. Los siguientes ejemplos pueden
ilustrar la repuesta a nuestra pregunta:
4 2 3
.:Ejemplo 5.32 Determine si −7 , 1 puede generar a 5 :
2 5 −2
Aplicamos la misma estrategia, debemos encontrar escalares k1 y k2 tales que:
3 4 2
5 = k2 −7 + k3 1
−2 2 5
270 5.5. Combinación lineal de vectores
4k2 + 2k3 = 3
−7k2 + k3 = 5
2k2 + 5k3 = −2
gen {v1 , v2 , . . . , vn } = {x : x = α1 v1 , α2 v2 , . . . , αn vn }
Podemos interpretar el espacio generado, como el posible espacio vectorial que se puede
obtener, al agrupar un número finito de vectores. Ahora bien, podríamos preguntarnos
¿todo subconjunto de vectores de un espacio vectorial, es subespacio del espacio vectorial
original? El siguiente teorema nos aclara la situación.
Como vemos, un conjunto tiene el potencial de ser subespacio vectorial, sólo se requiere
verificar la cantidad de elementos del subconjunto.
3
.:Ejemplo 5.35 Tomemos el espacio vectorial R2 y el conjunto S = ,
−7
entonces:
3 x x 3
gen = =α , α∈R
−7 y y −7
x α3
=
y −α7
Luego
x = 3α
y = −α7
Donde
x
α=
3
x
Luego y = −α7, es decir, y = − 3 7, lo que me representa el conjunto de puntos en el
plano que está sobre la recta y = − 73 x. Por ejemplo tomemos α = 5, entonces
272 5.5. Combinación lineal de vectores
x (5)3 15
= =
y −(5)7 −35
En los siguientes ejemplos tomados de [11], se muestra como un conjunto de dos vectores,
genera un plano en el espacio y como dos polinomios generan los polinomios de grado 1:
1 1
.:Ejemplo 5.36 Tomemos R3 y el conjunto S = 2 , 0 , entonces:
−1 1
1 1 x x 1 1
gen 2 , 0 = y y = α1 2 + α2 0 , α1 , α2 ∈ R
−1 1 z z −1 1
x = α1 + α2
y = 2α1
z = −α1 + α2
En forma matricial tenemos:
1 1 | x
2 0 | y
−1 1 | z
Ahora procedemos aplicar eliminación Gaussiana.
1 1 | x 1 1 x
2 0 | y f2 → f2 + (−2)f1 0 −2 −2x + y
−1 1 | z −−−−−−−−−−−−→ −1 1 z
1 1 x 1 1 x
0 −2 −2x + y f3 → f3 + f1 0 −2 −2x + y
−1 1 z −−−−−−−−−→ 0 0 −x + y + z
Luego los elementos de gen {S} deben satisfacer.
−x + y + z = 0
5. Vectores y Espacios vectoriales 273
x
Entonces gen {S} = y − x + y + z = 0 , lo que representa los puntos de R3
z
que están sobre el plano que pasa por el origen.
Tomamos:
1 0 3 x
α1 + α2 + α3 =
0 1 −2 y
Ahora, tomamos α3 = 0 y se tiene que:
1 0 3 x
α1 + α2 + (0) =
0 1 −2 y
1 0 x
α1 + α2 =
0 1 y
Quedando el sistema
α1 = x
α2 = y
x α1
Entonces = , por que se concluye que, el conjunto de vectores S genera el
y α2
espacio vectorial R2 .
.:Ejercicios 5.4
a) x2 + 4x
b) x3 + 4x − 2
c) 4x3 − 2x2 + 2
d ) −5x5 + 7x2 − x
1 4 0
3. Sean v1 = 1 , v2 = 5 , v3 = 1 . Determine (si es posible) los
2 −1 0
escalares apropiados para que los vectores generen el vector dado.
5 5
a) 3 d) 2
2 7
2 −2
b) 3 e) −1
4 −1
8 1
c) 4 f) 1
1 0
4. Dado el espacio vectorial dado, determine si los vectores generan dicho espacio
vectorial.
1 3
a) R2 con , .
0 7
2 0
b) En R ; .
6
1 1 −1
c) En R3 ; 4 , 4 , −5 .
0 9 0
1 0 7 0
d ) En R2 ; −1 , −1 , 4 , 0
1 4 2 −1
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4
5
6 d e f e s p a c i o g e n e r a d o ( ConjunV , n ) :
7 .
8 .
9 .
10 return l i s t a
k1 v1 + k2 v2 + . . . + kn vn = 0 (5.3)
k1 v1 + k2 v2 + . . . + kn vn = 0
es válida si y solamente si k1 = k2 = · · · = kn = 0.
La ecuación (5.3) puede llegar a ser cero si escogemos todos los k iguales a cero, es decir,
k1 = k2 = · · · = kn = 0. Lo interesante sería averiguar, si existe un conjunto de vectores
es L.D, el cual, no utilice constantes k distintas de cero.
1 2
.:Ejemplo 5.39 En R2 , sea A = , , determine si este conjunto de
4 3
5. Vectores y Espacios vectoriales 277
vectores es LI o LD.
c1 + 2c2 = 0
4c1 + 3c2 = 0
Al resolver el sistema, vemos que es un sistema homogéneo con solución única, de modo
que c1 = c2 = 0. Por lo tanto, el conjunto de vectores es L.I
1 2 4
.:Ejemplo 5.40 En R3 , sea A = 1 , 1 , 2 , Determine si este
−2 1 2
conjunto de vectores es LI o LD.
Solución:
c1 + 2c2 + 4c3 = 0
c1 + c2 + 2c3 = 0
−2c1 + c2 + 2c3 = 0
No es muy difícil deducir este teorema, pues al multiplicar un vector por un escalar, el
nuevo vector, es dependiente del anterior, pues fue creado a partir de este.
Cuando tenemos más columnas que filas, se genera un sistema no cuadrado, por lo tanto,
siempre tendrá múltiples soluciones. Veamos el siguiente ejemplo:
1 3 6
.:Ejemplo 5.41 Tomemos v1 = y v2 = y v3 =
0 4 1
c1 + 3c2 + 6c3 = 0
4c2 + 7c3 = 0
c1 + 5.25c3 = 0
c2 + 0.25c3 = 0
de donde deducimos que c2 = −0.25c3 y c1 = −5.25c3, luego todas las soluciones estarían
dadas por los múltiplos escalares del vector:
−5.25
c3
−0.25
Esto nos dice que el conjunto de vectores v1 , v2 y v3 son LD.
5. Vectores y Espacios vectoriales 279
.:Ejercicios 5.5
c) P1 = 5x2 − 6, P2 = 0.002x2 + 4, en P2 .
d ) P1 = 2 + 4x + 2x2 , P2 = 4 + 7x + x2 , P3 = 3 + 4x + 8x2 , en P2 .
4 8 8 0 0 0 0 1 0
e) A1 = , A2 = , A3 = , en M23 .
1 1 0 0 1 0 0 0 1
11. Sea:
a11 a12 · · · a1n
a21 a22 · · · a2n
A= .. .. ..
. . .
am1 am2 · · · amn
Demuestre que las columnas de A se consideran como vectores L.D, si y sólo si, el
sistema AX = 0 tiene soluciones no triviales.
.:Ejemplo 5.42 Los vectores e1 = (1, 0) y e2 = (0, 1) forman una base de R2 , basta con
escoger los escalares apropiados:
5 1 0
=5 + (−7)
−7 0 1
.:Ejemplo 5.43 En Pn el conjunto 1, x, x2 , . . . , xn es la base estándar para los
polinomios de grado n. Todo polinomio se puede escribir usando los elementos de esta
base. Tomemos el polinomio:
x3 + 5x + 2
x
.:Ejemplo 5.44 Sea H = y : x-y + z = 0 un subespacio de R3 . Determine una
z
base para H.
282 5.8. Dimensión de un espacio vectorial
z = −x + y
Luego los vectores deben ser de la forma:
x
y
−x + y
dim (V )
.:Ejemplo 5.46 Pn , dim (Pn ) = n + 1, pues se necesitan n elementos para las variables
y un elemento para las constantes.
.:Ejemplo 5.47 Mn×m , dim (Mn×m ) = nm, es decir, multiplicar el número de filas por
el número de columnas.
El teorema nos permite apreciar las propiedades que debe tener un subconjunto de
vectores para generar un espacio vectorial:
.:Ejercicios 5.6
284 5.8. Dimensión de un espacio vectorial
1. Determine si el conjunto de vectores forma una base para el espacio vectorial dado
(Justifique la respuesta):
N (A) = {x ∈ Rn /Ax = 0}
1 0 −1 4 2
.:Ejemplo 5.48 Sea A = 0 −5 2 1 2 . Determine N (A)
7 −3 0 4 −1
x − z + 4v + 2w = 0
−5y + 2z + v + 2w = 0
7x − 3y + 4v − w = 0
Resolvemos el sistema homogéneo
1 0 −1 4 2 1 0 −1 4 2
0 −5 2 1 2 f3 → f3 + (−7)f1 0 −5 2 1 2
7 −3 0 4 −1 −−−−−−−−−−−−→ 0 −3 7 −24 −15
1 0 −1 4 2 1 0 −1 4 2
3
0 −5 2 1 2 f3 → f3 + − f2 0 −5 2 1 2
5 29 123
0 −3 7 −24 −15 −−−−−−−−−−−−−−→ 0 0 5 − 5 − 81
5
1 0 −1 4 2 1 0 −1 4 2
0 −5 2 5
1 2 f3 → f3 0 −5 2 1 2
29 29
0 0 5 − 123
5 − 81
5 −−−−−−−−−−→ 0 0 1 − 123
29
81
− 29
7
1 0 0 − 29 − 23
29
1 0 −1 4 2
f1 → f1 + f3 275 220
0 −5 2 1 2 0 −5 0 29 29
f2 → f2 + (−2)f3
0 0 1 − 123
29
81
− 29 −−−−−−−−−−−−−−→
0 0 1 − 123
29 − 81
29
286 5.9. Subespacios asociados con una matriz
7 23
1 0 0 − 29 − 29
7
1 0 0 − 29 − 23
29
275 220
0 −5 0 29 29
f2 → − 1 f2 0
5 1 0 − 275
145
220
− 145
0 0 1 − 123 − 81 −−−−−−−−−−−→
29 29
0 0 1 − 123
29
81
− 29
Las variables libres son v y w, por lo tanto la solución sería:
7 23
7 23
29 v + 29 w 29 29
275 220
x 275 220
145 v + 145 w
145 145
y
123 81
z = v + w = v 123 + w 81
29 29 29 29
v
w
v
1
0
w 0 1
7 23
29 29
275 220
145 145
123 81
N (A) = gen 29 , 29 , v (A) = 2.
1 0
0 1
Veamos la definición de Espacio Fila y Espacio Columna:
5.9.1. Propiedades
Los siguientes teoremas, conforman las principales propiedades de los espacios asociados
a una matriz:
.:Teorema 5.15 Si A y B son matrices m×n equivalentes por filas, entonces los espacios
generados por las filas de A y de B son iguales.
.:Teorema 5.16 Sea B una matriz m × n en la forma escalonada por filas. Las columnas
de B que contienen los pivotes forman una base para C(B) y, por tanto, dim (C(B)) es
igual al número de pivotes de B.
dim (C(B)) = k
1 0 −1 4 2
A = 0 −5 2 1 2
7 −3 0 4 −1
En el ejemplo encontramos F (A), el cual tiene dimensión 2, pues tiene dos vectores :
7
23
29 29
275 220
145 145
123 81
29 ,
29
1
0
0 1
Luego ρ(A) = 2.
El siguiente teorema, muestra la relación entre los diferentes espacios y sus dimensiones.
Es decir:
ρ(A) + v(A) = n
Ahora bien, el siguiente teorema muestra la forma como se relaciona el espacio fila con el
espacio nulo de A.
.:Teorema 5.19 Sea A de tamaño n × m, entonces, cada vector del espacio fila de A,
F (A) es ortogonal a todo vector del espacio nulo de A, N (A), es decir (F (A) ⊥ N (A))
El siguiente ejemplo tomado de [11], muestra como se relacionan los diferentes espacios
asociados a una matriz:
1 −2 −3
0
1 0
gen 0 , 1
,
0
0 0 1
Entonces v(A) = 3.
Ahora bien, F (A) = gen 1, −1, 2, 3 , pues es la única fila que tiene pivote,
además es la única que no se anuló. Luego, ρ(A) = 1, y donde podemos apreciar que
v(A) + ρ(A) = 4.
Los siguientes teoremas muestran las relaciones entre una matriz y su rango:
a. v(A) = 0
b. ρ(A) = n
Si una matriz de tamaño n × n es invertible, es por que tiene n pivotes, lo que implica
que tiene n filas no nulas. El sistema homogéneo asociado a dicha matriz tendrá solución
trivial, lo que implica N (A) no tendrá elementos y por tanto v(A) = 0.
.:Ejercicios 5.7
1. Halle una base para los espacios fila, nulo y columna de la matriz dada. Encuentre
el rango y la nulidad.
a) c)
2 3 4 6 5 4 3
7 6 5 −8 6 5 1
−9 7 6
5 2 9 d)
2 1 5 7
b) 6
2 4 8
5 4 3
2 6 9 7 5
7 5
9 8 5 4
0 1 0
2. Dados los siguientes conjuntos de vectores, encuentre una base para el espacio
generado por dichos vectores.
5. Vectores y Espacios vectoriales 291
4 1
a) ,
5 −1
4 2 3
5 1 2
b)
1 −1 ,
,
1
1 2 1
a) ρ (A) = ρ (At )
b) Si A es una matriz diagonal. Demuestre que ρ (A) representa es el número de
elementos distintos de cero que aparecen en la diagonal.
c) Si A una matriz triangular n × n con ceros en la diagonal. Demuestre que
ρ (A) < n.
Transformaciones Lineales
6
6.1. Introducción
Las Transformaciones Lineales son uno de los temas más relevantes en el Álgebra lineal.
Ellas nos permiten convertir o “transformar” un elemento en otro; así por ejemplo, si un
función f se evalúa en un valor x0 , lo que obtenemos es f (x0 ), que es en sí otro valor que
resulta de evaluar x0 en f , en este caso la función f actúa como el “ente transformador”,
pues toma el valor x0 y lo transforma en otro valor al que llamamos f (x0 ).
Uno de los mejores ejemplo de una transformación lineal, son los video juegos, en ellos
se recrea un ambiente 3D en una pantalla 2D. Se requiere una transformación especial,
que tome un objeto 3D como un cubo y lo proyecte en un plano o 2D. La figura 6.1,
muestra como un cubo se muestra como un cuadrado cuando lo proyectamos sobre una
pantalla (plano 2D); esto ocurre sólo cuando estamos justo en frente del cubo. Dicha
transformación, implica tomar un vector de R3 y convertirlo en un punto en el plano R2 .
293
294 6.1. Introducción
Pantalla 2D
Objeto 3D
Observador
El concepto es muy simple, la transformación T actúa como una función f en cálculo, sólo
que en lugar de enviarle valores reales y obtener valores reales, a la transformación T , le
enviamos vectores y obtenemos como resultado otro vector. Si u ∈ Rn , al evaluarlo en la
transformación T (u) = v; obtenemos otro vector llamado v; entonces a v lo llamaremos
la imagen de u bajo la transformación T .
T (5, 7, 1) = (5, 7)
6. Transformaciones Lineales 295
Ahora bien, T (u) = (ex1 , ey1 , ez1 ) y T (v) = (ex2 , ey2 , ez2 ), luego:
6 7 8 1
A= 9 1 2 y b= 3
0 5 2 −9
Al realizar la multiplicación Ab, obtenemos un nuevo vector c de tamaño 3 × 1:
6 7 8 1 −45
9 1 2 3 = −6
0 5 2 −9 −3
La matriz A transformó el vector b en el vector c.
1
Encuentre T :
−2
1
La transformación consiste en multiplicar el vector con la matriz A:
−2
1 1 −1 1 3
T = =
−2 2 1 −2 0
Luego:
1 3
T =
−2 0
.:Ejemplo 6.6 Sean T1 (x) = A1 x y T2 (x) = A2 x, definidas por las siguientes matrices
A1 y A2 .
1 0 −1 1 7
A1 = , A2 = y x=
0 −1 0 1 −2
Núcleo (T ) = {x ∈ V | T (x) = 0}
Im (T ) = {y ∈ V | ∃x ∈ U y T (x) = y}
El Núcleo (T ) son todos aquellos vectores de un espacio vectorial U , tal que al transformar
dichos vectores, sus imágenes sólo pueden ser el vector nulo de V . La imagen de T Im (T ),
hace referencia a todos los vectores del espacio vectorial V que son ligados o relacionados
con U por medio de la transformación T .
Los siguientes teoremas, nos muestran la naturaleza del núcleo y de la imagen de una
transformación:
.:Ejemplo 6.7 Determine el núcleo y el rango del operador lineal T (x, y, z) = (x, 0, z)
Imagínese que T proyecta el vector (x, y, z) en el vector (x, 0, z) en el plano xz. Donde
T es un ejemplo de operador de proyección.
Solución:
Como la matriz A tiene forma escalonada. Los vectores renglón son linealmente
independientes.
.:Definición 6.4 Se dice que una transformación T es uno a uno si cada elemento
del rango de T corresponde exactamente a un elemento del dominio de T. Esto
significa que T es uno a uno si T (u) = T (v) implica que u = v.
Este concepto es muy similar al concepto de función uno a uno en cálculo. Los siguientes
teoremas determinan propiedades especiales de las transformaciones lineales uno a uno.
Los anteriores teoremas nos dicen que una transformación lineal, que sea uno a uno,
conservan la independencia lineal.
T :V →W
Se dice que T es sobre W si para todo w ∈ W existe al menos una v ∈ V tal que:
T (v) = w
Para determinar que T es uno a uno debemos verificar: Núcleo (T ), dim (Núcleo (T )) y
dim (Im (T )), Es fácil ver que la matriz de la transformación es:
1 1
AT =
0 1
AT tiene dos pivotes, por lo tanto el Núcleo (T ) = 0, es decir, el sistema homogéneo
asociado a dicha matriz tiene solución única y es el vector nulo; de lo anterior podemos
deducir que dim (Núcleo (T )) = 0 y dim (Im (T )) = 2, esto implica que T es uno a uno.
luego T es sobre.
Ahora bien, ¿cómo determinar cuando una transformación no es uno a uno y sobre?.
La respuesta la podemos deducir del ejemplo anterior, pues si la matriz asociada a la
transformación no es cuadrada, en particular, si tiene más columnas que filas, es decir,
cuando la dimensión del dominio (V ) es mayor que la dimensión del codominio (W ),
entonces T no es uno a uno, pero si ocurre el caso contrario, cuando la dimensión de
codominio es mayor que la dimensión del dominio, entonces podemos hallar múltiples
soluciones con dicha matriz, y por lo tanto, el núcleo de T sería diferente de 0, haciendo
que T no sea sobre.
.:Ejercicios 6.1
12. Determine el núcleo y el rango para cada una de las transformaciones siguientes:
Demuestre que Dim Núcleo (T ) + Dim Rango (T ) = Dim Dominio (T ) para cada
transformación.
a) T (x, y, z) = (x, 0, 0) de R3 → R3
b) T (x, y, z) = (x + y, z) de R3 → R2
c) T (x, y) = (x, x − y, y) de R2 → R3
13. Aplique el teorema del rango y la nulidad para calcular la dimensión del núcleo
y el rango de cada una de las transformaciones lineales definidas por las matrices
siguientes. Indique si las transformación es uno a uno.
1 8 2 1 2 3 4
a) A = 0 1 4 c) A = 1 −1 6 7
0 0 0 0 0 7 2
1 2 −3
2 7 14 −2 4 −6
d) A =
b) A = 0 9 1
0 1 −2
0 0 1 0 4 −2
6. Transformaciones Lineales 305
14. Use determinantes para decidir si las transformaciones lineales definidas por las
matrices siguientes son uno a uno.
3 5 1 7 −5 3
a) A = 0 4 4 c) A = 2 11 1
0 0 4 0 9 −8
6 4 3 2
7 6 5 −1 3 −4 14
d) A =
b) A = 4 8 6 6 5 4 5
5− 9 8 5 5 −43 8
Esta transformación, consiste en tomar un vector de R2 y hacer una reflexión sobre el eje
x o sobre el eje y.
2 2
T : R → R
x x
→
y −y
x′
Donde y ′ es el vector reflejado sobre el eje x. Aunque estamos trabajando con
1
vectores de R2 , usamos una matriz de 3 × 3, con la tercera componente fija en 1, esto
generaliza la transformación para R2 .
b
A
b
B
2 2
T : R → R
x −x
→
y y
.:Ejemplo 6.10
6. Transformaciones Lineales 307
B a A
b b
v u
Tomemos el triángulo formado por los puntos A(3, 3), B(2, 1) y C(4, 1) y apliquemos
una reflexión sobre el eje x y otra sobre el eje y:
A(3, 3):
3 1 0 0 3 3
T 3 = 0 −1 0 3 = −3
1 0 0 1 1 1
B(2, 1):
2 1 0 0 2 2
T 1 = 0 −1 0 1 = −1
1 0 0 1 1 1
C(4, 1):
4 1 0 0 4 4
T 1 = 0 −1 0 1 = −1
1 0 0 1 1 1
A(3, 3):
3 −1 0 0 3 −3
T 3 = 0 1 0 3 = 3
1 0 0 1 1 1
308 6.4. Transformaciones en el plano
B(2, 1):
2 −1 0 0 2 −2
T 1 = 0 1 0 1 = 1
1 0 0 1 1 1
C(4, 1):
4 −1 0 0 4 −4
T 1 = 0 1 0 1 = 1
1 0 0 1 1 1
m
G A
b
3 b
g h a b
2
n
I H Bb C
b b
1 b
i c
p
l j k
−5 −4 −3 −2 −1 1 2 3 4
E d F
−1 b b
−2 f e
−3 b
D
−4
Como podemos ver en la figura 6.4, el triángulo ABC se reflejó sobre el eje x, formando
el triángulo EF D, el cual, conserva la misma forma y tamaño del triángulo ABC pero
no la misma posición. De igual forma, con la reflexión sobre el eje y; en este caso se
formó el triángulo GHI, que también tiene la misma forma y tamaño pero no la misma
posición. En la figura 6.4, podemos observar que en ambas reflexiones, hubo un cambio
de cuadrante, el triángulo EF D quedó en el cuarto cuadrante, mientras que el triángulo
GHI quedó en el segundo cuadrante.
.:Algoritmo 6.1
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " T ra n s f o rm a c i o n de r e f l e x i o n : \ n"
5
6 def ReflexionEjeX (x ) :
7 MatrizRefEjeX=np . a r r a y ( [ [ 1 , 0 , 0 ] ,
8 [0 , −1 , 0 ] ,
9 [0 , 0, 1]])
10 r e t u r n MatrizRefEjeX . dot ( x . T)
11
12 def ReflexionEjeY (x ) :
13 MatrizRefEjeY=np . a r r a y ( [ [ − 1 , 0 , 0 ] ,
14 [0 ,1 ,0] ,
15 [0 ,0 ,1]])
16 r e t u r n MatrizRefEjeY . dot ( x . T)
17
18
19 Punto1=np . a r r a y ( [ 3 , 3 , 1 ] )
20 Punto2=np . a r r a y ( [ 2 , 1 , 1 ] )
21 Punto3=np . a r r a y ( [ 4 , 1 , 1 ] )
22
23 print " punto del triangulo (3 ,3) , (2 ,1) , (4 ,1) "
24 print " Punto 1 : " , Punto1
25 print " Punto 2 : " , Punto2
26 print " Punto 3 : " , Punto3
27
28 p r i n t " \n l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l e j e x son : \ n"
29
30 print " punto 1 r e f l e j a d o : \ n " , R e f l e x i o n E j e X ( Punto1 )
31
32 print " punto 2 r e f l e j a d o : \ n " , R e f l e x i o n E j e X ( Punto2 )
33
34 print " punto 3 r e f l e j a d o : \ n " , R e f l e x i o n E j e X ( Punto3 )
35
36
37 p r i n t " \n l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l e j e y son : \ n"
38
39 print " punto 1 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y ( Punto1 )
40
41 print " punto 2 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y ( Punto2 )
42
43 print " punto 3 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y ( Punto3 )
1 >>>
2 T ra n s f o rm a c i o n de r e f l e x i o n :
3
4 punto del triangulo (3 ,3) , (2 ,1) , (4 ,1)
5 Punto 1: [3 3 1]
6 Punto 2: [2 1 1]
7 Punto 3: [4 1 1]
8
9 l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l e j e x son :
10
11 punto 1 reflejado :
12 [ 3 −3 1 ]
13 punto 2 reflejado :
14 [ 2 −1 1 ]
15 punto 3 reflejado :
16 [ 4 −1 1 ]
17
18 l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l e j e y son :
19
20 punto 1 r e f l e j a d o :
21 [ −3 3 1 ]
22 punto 2 r e f l e j a d o :
23 [ −2 1 1 ]
24 punto 3 r e f l e j a d o :
25 [ −4 1 1 ]
26 >>>
2 2
T : R → R
x −x
→
y −y
2
T : R → R2
x y
→
y x
.:Ejemplo 6.11
De nuevo, tomaremos el triángulo formado por los puntos A(3, 3), B(2, 1) y C(4, 1) y
apliquemos una reflexión a lo largo de la recta y = x y otra a lados opuestos de la recta
y = x.
A(3, 3):
3 −1 0 0 3 −3
T 3 = 0 −1 0 3 = −3
1 0 0 1 1 1
312 6.4. Transformaciones en el plano
B(2, 1):
2 −1 0 0 2 −2
T 1 = 0 −1 0 1 = −1
1 0 0 1 1 1
C(4, 1):
4 −1 0 0 4 −4
T 1 = 0 −1 0 1 = −1
1 0 0 1 1 1
B(2, 1):
2 0 1 0 2 1
T 1 = 1 0 0 1 = 2
1 0 0 1 1 1
C(4, 1):
4 0 1 0 4 1
T 1 = 1 0 0 1 = 4
1 0 0 1 1 1
Como podemos ver en la figura 6.5, el triángulo ABC se reflejó a lo largo de la recta
y = x, conservando la misma forma, pero cambiando de posición, en este caso pasó del
primer cuadrante al tercero. El triángulo ABC se transformó en el triángulo F ED. En
el otro tipo de reflexión, se puede observar que la recta y = x actúa como un “espejo”
donde el triángulo ABC se refleja en el triángulo HGA, conservando la misma forma,
pero cambiando la posición.
.:Algoritmo 6.2
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " T ra n s f o rm a c i o n de r e f l e x i o n en l a r e c t a y=x : \ n"
5
6. Transformaciones Lineales 313
H
4 b
i
j A
3 b
h b
2 b
a
G
Bb C
1 b
c
y=x
−5 −4 −3 −2 −1 1 2 3 4
F e E
b b
−1
f
g −2
b
−3
D
−4
6 d e f ReflexionEjeYX( x ) :
7 MatrizRefEjeYX=np . a r r a y ( [ [ − 1 , 0 , 0 ] , [ 0 , − 1 , 0 ] , [ 0 , 0 , 1 ] ] )
8 r e t u r n MatrizRefEjeYX . dot ( x .T)
9
10 d e f ReflexionEjeXY( x ) :
11 MatrizRefEjeYX=np . a r r a y ( [ [ 0 , 1 , 0 ] , [ 1 , 0 , 0 ] , [ 0 , 0 , 1 ] ] )
12 r e t u r n MatrizRefEjeYX . dot ( x .T)
13
14 Punto1=np . a r r a y ( [ 3 , 3 , 1 ] )
15 Punto2=np . a r r a y ( [ 2 , 1 , 1 ] )
16 Punto3=np . a r r a y ( [ 4 , 1 , 1 ] )
17
18 print " p u n to s d e l triangulo (3 ,3) , (2 ,1) , (4 ,1)"
19 print " Punto 1 : " , Punto1
20 print " Punto 2 : " , Punto2
21 print " Punto 3 : " , Punto3
22
23 p r i n t " \n l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l a r e c t a y=x son : \ n"
24
25 print " punto 1 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y X ( Punto1 )
26
27 print " punto 2 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y X ( Punto2 )
314 6.4. Transformaciones en el plano
28
29 print " punto 3 r e f l e j a d o : \ n " , R e f l e x i o n E j e Y X ( Punto3 )
30
31
32 p r i n t " \n l o s nuevos p u n to s r e f l e j a d o s a l l a d o o p u e s t o de y=x son : \ n"
33
34 print " punto 1 r e f l e j a d o : \ n " , R e f l e x i o n E j e X Y ( Punto1 )
35
36 print " punto 2 r e f l e j a d o : \ n " , R e f l e x i o n E j e X Y ( Punto2 )
37
38 print " punto 3 r e f l e j a d o : \ n " , R e f l e x i o n E j e X Y ( Punto3 )
1 >>>
2 T ra n s f o rm a c i o n de r e f l e x i o n en l a r e c t a y=x :
3
4 p u n to s d e l t r i a n g u l o ( 3 , 3 ) , ( 2 , 1 ) , ( 4 , 1 )
5 Punto 1 : [ 3 3 1 ]
6 Punto 2 : [ 2 1 1 ]
7 Punto 3 : [ 4 1 1 ]
8
9 l o s nuevos p u n to s r e f l e j a d o s con r e s p e c t o a l a r e c t a y=x son :
10
11 punto 1 reflejado :
12 [ −3 −3 1 ]
13 punto 2 reflejado :
14 [ −2 −1 1 ]
15 punto 3 reflejado :
16 [ −4 −1 1 ]
17
18 l o s nuevos p u n to s r e f l e j a d o s a l l a d o o p u e s t o de y=x son :
19
20 punto 1 r e f l e j a d o :
21 [3 3 1]
22 punto 2 r e f l e j a d o :
23 [1 2 1]
24 punto 3 r e f l e j a d o :
25 [1 4 1]
26 >>>
(3, 3), (2, 1), (4, 1), los cuales quedan reflejados en (−3, −3), (−2, −1), (−4, −1) y
(3, 3), (1, 2), (1, 4).
2 2
T : R → R
′
x x
→
y y′
P ′ (x′ , y ′ )
6 b
v
3
2 b
P (x, y)
1
θ u
φ
b
−1 O 1 2 3 4 5 6
−1
Para hallar las coordenadas del punto (x′ , y ′ ) a partir de (x, y) ubicaremos ambos puntos
en el plano como se muestra en la figura 6.6. Según Pettofrezzo [24], tomamos el vector
−−→
OP y obtenemos su descomposición en forma de vectores unitarios, teniendo en cuenta
−−→
que tenemos dos ángulos: el ángulo φ comprendido entre el eje x y OP y el ángulo θ entre
−−→ −−→
los vectores OP y OP ′ . Entonces:
316 6.4. Transformaciones en el plano
−−→
OP = xi + yj
−−→ −−→
= OP cos φi + OP sin φj
−−→′ −−→
= OP cos φi + OP ′ sin φj
−−→′
OP = x′ i + y ′ j
−−→′ −−→
= OP cos (θ + φ) i + OP ′ sin (θ + φ) j
−−→′ −−→
= OP (cos θ cos φ − sin θ sin φ) i + OP ′ (sin θ cos φ + cos θ sin φ) i
x′ = x cos θ − y sin θ
y′ = x sin θ + y cos θ
.:Ejemplo 6.12
6. Transformaciones Lineales 317
Siguiendo con el ejemplo del triángulo ABC, tomaremos los puntos A(3, 3), B(2, 1) y
C(4, 1) y apliquemos una rotación con centro en el origen con un ángulo de θ = π3 .
A(3, 3):
π
π
3 cos 3 − sin 3 0 3 −1.09807621
π π
T 3 = sin 3 cos 3 0 3 = 4.09807621
1 0 0 1 1 1
B(2, 1):
π
π
2 cos 3 − sin 3 0 2 0.1339746
π π
T 1 = sin 3 cos 3 0 1 = 2.23205081
1 0 0 1 1 1
C(4, 1):
π
π
4 cos 3 − sin 3 0 4 1.1339746
π π
T 1 = sin 3 cos 3 0 1 = 3.96410162
1 0 0 1 1 1
D
b
4 b
F
A
3 b
b
E
2
B C
1 b b
b
G
−2 −1 1 2 3 4
−1
π
Figura 6.7: El triángulo ABC rotado
3
318 6.4. Transformaciones en el plano
Como podemos ver en la figura 6.7, el triángulo ABC rotó π3 (60o ) en sentido anti horario,
este nuevo triángulo lo llamaremos DF E. El triángulo DF E tiene el mismo tamaño y la
misma forma que el triángulo ABC, sólo cambia la posición.
.:Algoritmo 6.3
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " T ra n s f o rm a c i o n de r o t a c i o n : \ n"
5
6 def rotaci on (x , theta ) :
7 M a tri z R o ta c i o n =np . a r r a y ( [ [ np . c o s ( t h e t a ) , −1∗np . s i n ( t h e t a ) , 0 ] ,
8 [ np . s i n ( t h e t a ) , np . c o s ( t h e t a ) , 0 ] ,
9 [0 , 0 , 1]])
10 r e t u r n M a tri z R o ta c i o n . dot ( x )
11
12 Punto1=np . a r r a y ( [ 3 , 3 , 1 ] )
13 Punto2=np . a r r a y ( [ 2 , 1 , 1 ] )
14 Punto3=np . a r r a y ( [ 4 , 1 , 1 ] )
15
16 print " p u n to s d e l triangulo (3 ,3) , (2 ,1) , (4 ,1)"
17 print " Punto 1 : " , Punto1
18 print " Punto 2 : " , Punto2
19 print " Punto 3 : " , Punto3
20
21 p r i n t " \n l o s nuevos p u n to s Rotados : \ n"
22
23 print " punto 1 r o t a d o : \ n " , r o t a c i o n ( Punto1 , np . p i / 3 )
24
25 print " punto 2 r o t a d o : \ n " , r o t a c i o n ( Punto2 , np . p i / 3 )
26
27 print " punto 3 r o t a d o : \ n " , r o t a c i o n ( Punto3 , np . p i / 3 )
1 >>>
2 T ra n s f o rm a c i o n de r o t a c i o n :
3
4 p u n to s d e l t r i a n g u l o ( 3 , 3 ) , ( 2 , 1 ) , ( 4 , 1 )
5 Punto 1 : [ 3 3 1 ]
6 Punto 2 : [ 2 1 1 ]
7 Punto 3 : [ 4 1 1 ]
6. Transformaciones Lineales 319
8
9 l o s nuevos p u n to s Rotados :
10
11 punto 1 r o t a d o :
12 [ −1.09807621 4.09807621 1. ]
13 punto 2 r o t a d o :
14 [ 0.1339746 2.23205081 1. ]
15 punto 3 r o t a d o :
16 [ 1.1339746 3.96410162 1. ]
17 >>>
2 2
T : R → R
′
x x
→
y y′
.:Ejemplo 6.13
320 6.4. Transformaciones en el plano
3 b D
2 k
v
1 b b
A h C
u
b
B
−1 1 2 3 4 5 6 7 8
−1
Tomando triángulo ABC, con vértices A(3, 3), B(2, 1) y C(4, 1). Aplicaremos una
transformación con h = 2 y k = −3:
A(3, 3):
3 1 0 2 3 5
T 3 = 0 1 −3 3 = 0
1 0 0 1 1 1
B(2, 1):
2 1 0 2 2 4
T 1 = 0 1 −3 1 = −2
1 0 0 1 1 1
C(4, 1):
4 1 0 2 4 6
T 1 = 0 1 −3 1 = −2
1 0 0 1 1 1
.:Algoritmo 6.4
6. Transformaciones Lineales 321
A
b
a b
g
B b b
C
c
x b
D
1 2 3 4 5 6
i h
d f
E b b F
e
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " T ra n s f o rm a c i o n de t r a s l a c i o n : \ n"
5
6 def tr a sl a ci o n (x , h , k) :
7 M a t r i z T r a s l a c i o =np . a r r a y ( [ [ 1 , 0 , h ] ,
8 [ 0, 1, k] ,
9 [ 0, 0, 1]])
10 r e t u r n M a t r i z T r a s l a c i o . dot ( x )
11
12 Punto1=np . a r r a y ( [ 3 , 3 , 1 ] )
13 Punto2=np . a r r a y ( [ 2 , 1 , 1 ] )
14 Punto3=np . a r r a y ( [ 4 , 1 , 1 ] )
15
16 print " p u n to s d e l triangulo (3 ,3) , (2 ,1) , (4 ,1)"
17 print " Punto 1 : " , Punto1
18 print " Punto 2 : " , Punto2
19 print " Punto 3 : " , Punto3
20
21 p r i n t " \n l o s nuevos p u n to s t r a s l a d a d o s : \ n"
22
23 print " punto 1 r o t a d o : \ n " , t r a s l a c i o n ( Punto1 , 2 , − 3 )
24
25 print " punto 2 r o t a d o : \ n " , t r a s l a c i o n ( Punto2 , 2 , − 3 )
26
27 print " punto 3 r o t a d o : \ n " , t r a s l a c i o n ( Punto3 , 2 , − 3 )
322 6.4. Transformaciones en el plano
1 >>>
2 T ra n s f o rm a c i o n de t r a s l a c i o n :
3
4 p u n to s d e l t r i a n g u l o ( 3 , 3 ) , ( 2 , 1 ) , ( 4 , 1 )
5 Punto 1 : [ 3 3 1 ]
6 Punto 2 : [ 2 1 1 ]
7 Punto 3 : [ 4 1 1 ]
8
9 l o s nuevos p u n to s t r a s l a d a d o s :
10
11 punto 1 r o t a d o :
12 [5 0 1]
13 punto 2 r o t a d o :
14 [ 4 −2 1 ]
15 punto 3 r o t a d o :
16 [ 6 −2 1 ]
17 >>>
El Algoritmo 6.4, implementa una función llamada traslacion(x,h,k), la cual recibe como
parámetros: el vector a transformar, y dos valores llamados h y k; el primero es el
aumento en x del vector y el segundo es el aumento en y del mismo. La función, declara
la matriz de traslación en una variable llamada MatrizTraslacio. De nuevo, los puntos
(3, 3), (2, 1), (4, 1), son trasladados con los valores h = 2 y k = 3, dando como resultado:
(5, 0), (4, −2), (6, −2).
2 2
T : R → R
′
x x
→
y y′
′
x Dx 0 0 x x
T y = 0 Dy 0 y = y ′
1 0 0 1 1 1
Donde Dx es el factor de escalamiento sobre el eje x y Dy es el factor de escalamiento
sobre el eje y. En la figura 6.10, se puede ver como el punto extremo A del vector u,
se transformó en el punto extremo C del vector v. Si Dx y Dy son negativos, el vector
cambia de dirección. Si Dx y Dy se encuentran en el intervalo (0, 1), el tamaño del vector
se reduce.
4 b
C
3
v
2 b
1 u
−1 O 1 2 3 4 5 6
−1
.:Ejemplo 6.14
El triángulo ABC, con vértices A(3, 3), B(2, 1) y C(4, 1). Aplicaremos una
transformación de escalado con Dx = 2 y Dy = 2:
A(3, 3):
3 2 0 0 3 6
T 3 = 0 2 0 3 = 6
1 0 0 1 1 1
B(2, 1):
2 2 0 0 2 4
T 1 = 0 2 0 1 = 2
1 0 0 1 1 1
324 6.4. Transformaciones en el plano
C(4, 1):
4 2 0 0 4 8
T 1 = 0 2 0 1 = 2
1 0 0 1 1 1
D
b
A F
b E b b
b b
B C
x
1 2 3 4 5 6 7 8
.:Algoritmo 6.5
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " T ra n s f o rm a c i o n de e s c a l a d o : \ n"
5
6. Transformaciones Lineales 325
6 d e f e s c a l a d o ( x , Dx , Dy) :
7 M a t r i z e s c a l a d o= np . a r r a y ( [ [ Dx , 0 , 0] ,
8 [ 0, Dy , 0 ] ,
9 [ 0, 0, 1]])
10 r e t u r n M a t r i z e s c a l a d o . dot ( x )
11
12 Punto1=np . a r r a y ( [ 3 , 3 , 1 ] )
13 Punto2=np . a r r a y ( [ 2 , 1 , 1 ] )
14 Punto3=np . a r r a y ( [ 4 , 1 , 1 ] )
15
16 print " Punto del triangulo (3 ,3) , (2 ,1) , (4 ,1) "
17 print " Punto 1 : " , Punto1
18 print " Punto 2 : " , Punto2
19 print " Punto 3 : " , Punto3
20
21 p r i n t " \n l o s nuevos p u n to s E s c a l a d o s : \ n"
22
23 print " punto 1 e s c a l a d o : \ n " , e s c a l a d o ( Punto1 , 2 , 2 )
24
25 print " punto 2 e s c a l a d o : \ n " , e s c a l a d o ( Punto2 , 2 , 2 )
26
27 print " punto 3 e s c a l a d o : \ n " , e s c a l a d o ( Punto3 , 2 , 2 )
28
29 p=np . a r r a y ( [ 3 , 2 , 1 ] )
30 print escalado (p , 2 , 2)
1 >>>
2 T ra n s f o rm a c i o n de e s c a l a d o :
3
4 Punto del triangulo (3 ,3) , (2 ,1) , (4 ,1)
5 Punto 1: [3 3 1]
6 Punto 2: [2 1 1]
7 Punto 3: [4 1 1]
8
9 l o s nuevos p u n to s E s c a l a d o s :
10
11 punto 1 e s c a l a d o :
12 [6 6 1]
13 punto 2 e s c a l a d o :
14 [4 2 1]
15 punto 3 e s c a l a d o :
16 [8 2 1]
17
18 >>>
326 6.4. Transformaciones en el plano
El Algoritmo 6.5, implementa una función llamada escalado(x,Dx,Dy), la cual recibe como
parámetros: el vector a transformar, y dos valores llamados Dx y Dy, el primero representa
el valor de escalado de x del vector, el segundo hace lo mismo pero con el eje y. La
función, declara la matriz de escalado en una variable llamada Matrizescalado. De nuevo,
los puntos (3, 3), (2, 1), (4, 1), son escalados con los valores Dx = 2 y Dy = 2, dando
como resultado: (6, 6), (4, 2), (8, 2); además, el triángulo ABC al escalarse es el doble
de grande al original.
.:Ejercicios 6.2
λx
Figura 7.1: Ax = λx
329
330 7.1. Vectores y valores propios
T (x) = λx (7.1)
Si T está determinada por una matriz A de n × n, entonces se obtiene la expresión
Ax = λx (7.2)
Ahora bien, ¿cómo podemos hallar dichos valores y vectores propios?. Para encontrar el
valor de λ, es necesario hacer una especie de “despeje” de la siguiente ecuación:
Ax = λx (7.3)
Bien, si suponemos que λ es un valor propio de A, esto implica que debe existir un
vector propio x no nulo. Para hacer este despeje multiplicamos el valor de λ por la matriz
identidad, entonces la ecuación 7.3, se transforma en:
(A − λI) x = 0 (7.4)
En el producto de la ecuación 7.4, debemos tener en cuenta que x es no nulo, por lo tanto:
A − λI = 0 (7.5)
Por el teorema fundamental del Álgebra, este polinomio característico tiene n raíces, que
pueden ser reales, complejas o una combinación entre reales y complejas. El siguiente
ejemplo nos ilustra cómo obtener los valores y los vectores propios de una transformación
T.
.:Ejemplo 7.1
Sea A una matriz asociada a una transformación T . Encuentre los valores propios de T ,
si la matriz A está definida de la siguiente forma:
2 40 −6
A = 1 15 1
0 −7 3
Bien, para encontrar los valores propios, debemos encontrar el determinante:
(2 − λ) 40 −6
1 (15 − λ) 1 =0
0 −7 (3 − λ)
Expandimos el determinante:
332 7.1. Vectores y valores propios
(15 − λ) 1 1 −6 1 (15 − λ)
(2 − λ) − 40 + (−6)
−7 (3 − λ) 0 (3 − λ) 0 −7
Luego,
Ahora bien, ¿qué características tiene éste polinomio?, el siguiente teorema nos puede dar
una idea:
.:Algoritmo 7.1
1 i m p o rt numpy a s np
2 from sympy i m p o rt ∗
3 from numpy . p o l y n o m i a l i m p o rt ∗
4
5 p r i n t " P o l i n o m i o c a r a c t e r i s t i c o : \ n"
6
7 A = np . a r r a y ( [ [ 2 , 8, 6 ,] ,
8 [ 9, 5, 6 ,] ,
9 [ 1, 8, 7 , ] ] , dtype=f l o a t )
10
11 p r i n t "La m a t r i z A: \ n" , A
12
13 B=Matrix (A)
14
15 z = Symbol ( ’ x ’ )
7. Vectores y valores propios 333
16 p=Poly (B . c h a r p o l y ( z ) )
17
18 Coef = p . a l l _ c o e f f s ( )
19 p r i n t " \n La l i s t a de l o s c o e f i c i e n t e s d e l p o l i n o m i o : \ n" , Coef
20 q=np . p o l y 1 d ( Coef )
21
22 p r i n t " \ nEl p o l i n o m i o c a r a c t e r i s t i c o : \ n" , q
23
24 p r i n t " \n Los v a l o r e s p r o p i o s de A: \ n" , q . r
1 >>>
2 Polinomio c a r a c t e r i s t i c o :
3
4 La m a t r i z A:
5 [[ 2. 8. 6.]
6 [ 9. 5. 6.]
7 [ 1. 8. 7.]]
8
9 La l i s t a de l o s c o e f i c i e n t e s d e l p o l i n o m i o :
10 [ 1. 00000000000000 , −14.0000000000000 , −67.0000000000000 , 80.0000000000000]
11
12 El p o l i n o m i o c a r a c t e r i s t i c o :
13 3 2
14 1 x − 14 x − 67 x + 80
15
16 Los v a l o r e s p r o p i o s de A:
17 [ 17.55667219 −4.55667219 1. ]
18 >>>
que almacena la misma matriz, pero en el formato de Sympy. La nueva matriz B, permite
usar símbolos, en este caso la “x” del polinomio, esto se logra con el comando z =
Symbol(’x’) (línea 13). La variable z es de tipo símbolo y contiene la variable “x”.
Donde se puede ver la forma del polinomio y su dominio (en este caso los reales). Para
visualizarlo mejor, convertiremos la variable p, del formato Sympy al formato Numpy. Esto
lo hacemos con el comando Coef = p.all_coeffs(), donde la variable Coef es una lista con
los coeficientes del polinomio que se obtuvo gracias al método all_coeffs() (línea 18).
La lista se utiliza para crear el polinomio de Numpy con el comando q=np.poly1d(Coef )
(línea 20), el cual, recibe como parámetro la lista Coef con los coeficientes del polinomio.
La variable q es un polinomio de Numpy, y podemos obtener sus raíces con el comando
q.r (líneas 22 y 24).
Ahora bien, Python y Numpy, permiten obtener los valores y los vectores propios. El
siguiente algoritmo, muestra como obtener los valores propios en Python:
.:Algoritmo 7.2
1 i m p o rt numpy a s np
2 from s c i p y . l i n a l g i m p o rt ∗
3
4 p r i n t " V a l o r e s p r o p i o s : \ n"
5
6 A = np . a r r a y ( [ [ 2 , 8, 6 ,] ,
7 [ 9, 5, 6 ,] ,
8 [ 1, 8, 7 , ] ] , dtype=f l o a t )
9
10 V a l o re s P = l i n a l g . e i g v a l s (A)
11
12 print "La m a t r i z A: \ n"
13
14 print A
15 print " "
16 p r i n t " Los v a l o r e s p r o p i o s de A: \ n" , V a l o re s P
2 Para
más información sobre el Algoritmo de Berkowitz, ver la página [Link]
1/modules/[Link]
7. Vectores y valores propios 335
1 >>>
2 Valores propios :
3 La m a t r i z A:
4
5 [ [ 2. 8. 6.]
6 [ 9. 5. 6.]
7 [ 1. 8. 7.]]
8
9 Los v a l o r e s p r o p i o s de A:
10 [ 17.55667219 −4.55667219 1. ]
11 >>>
El Algoritmo 7.2, toma la matriz A y obtiene los valores propios, usando la función
[Link](A) (línea 10), la cual, recibe como parámetro la matriz en cuestión y retorna
un vector con los valores propios de A.
.:Ejemplo 7.2
2 1
Dada la matriz A = , encuentre los valores y los vectores propios de A.
6 7
Bien, primero hallamos los valores propios de la matriz, entonces debemos hallar el
determinante:
2−λ 1
=0
6 7−λ
el cual nos da el polinomio característico λ2 − 9λ + 8 = 0 que tiene como raíces λ = 1
y λ = 8. Ahora, hallamos los vectores propios, teniendo en cuenta que (A − λI)v = 0,
donde v es el vector propio que vamos a calcular.
1 1 0
6 6 0
Entonces, al hacer las operaciones elementales por fila, obtenemos el siguiente sistema:
1 1 0
0 0 0
Luego v1 + v2 =0, entonces v1 = −v2 , lo que implica que el vector propio asociado a
−1
λ = 1 es . Ahora, hacemos el mismo proceso para el segundo valor propio, en
1
este caso λ = 8.
2 1 1 0
− (8) =0
6 7 0 1
Donde el sistema homogéneo resultante es:
−6 1 0
6 1 0
Al realizar las operaciones elementales por fila, obtenemos:
−6 1 0
0 0 0
1
Donde −6v1 + v2 = 0, luego −6v1 = −v2 , de donde concluir que v1 = 6 v2 . En
podemos
1/6
conclusión, para λ = 8 el valor propio asociado es .
1
El siguiente algoritmo, calcula tanto los valores como los vectores propios de una matriz:
.:Algoritmo 7.3
1 i m p o rt numpy a s np
2 from s c i p y . l i n a l g i m p o rt ∗
3
4 p r i n t " V a l o r e s p r o p i o s : \ n"
5
6 A = np . a r r a y ( [ [ 2 , 8, 6 ,] ,
7 [ 9, 5, 6 ,] ,
8 [ 1, 8, 7 , ] ] , dtype=f l o a t )
9
10 v e c t o r e s P r o p i o s=np . l i n a l g . e i g (A)
11
12 print "La m a t r i z A: \ n" , A, " \n"
7. Vectores y valores propios 337
13
14 p r i n t " Los v a l o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 0 ] , " \n"
15
16 p r i n t " Los v e c t o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 1 ] , " \n"
1 >>>
2 Valores propios :
3
4 La m a t r i z A:
5 [[ 2. 8. 6.]
6 [ 9. 5. 6.]
7 [ 1. 8. 7.]]
8
9 Los v a l o r e s p r o p i o s son :
10 [ 17.55667219 −4.55667219 1. ]
11
12 Los v e c t o r e s p r o p i o s son :
13 [ [ − 0 . 5 4 0 1 8 3 0 9 −0.47332305 − 0 . 2 7 7 0 5 4 2 6 ]
14 [ −0.64529409 0.7429203 −0.55410852]
15 [ − 0 . 5 4 0 1 8 3 0 9 −0.47332305 0 . 7 8 4 9 8 7 0 6 ] ]
16 >>>
El Algoritmo 7.3, toma la matriz A y obtiene los valores propios, usando la función
[Link](A) (línea 10), la cual, recibe como parámetro la matriz en cuestión y retorna
una tupla, cuya primera componente es un vector con los valores propios de A; el
segundo parámetro de la tupla, es una matriz cuyas columnas son los vectores propios
correspondientes al vector de valores propios, es decir, la primera columna de la matriz, es
el vector propio asociado al primer elemento del vector de valores propios. Estos vectores
propios están normalizados con respecto a la longitud.
Si aplicamos el Algoritmo 7.3, obtendremos que los valores propios de la matriz A son 2
y 4. Los valores propios de la matriz B son 5,7 y 6 y finalmente, la matriz C tiene a 1,
5, 4 y 3 como valores propios. Esto, nos indica que en las matrices triangulares (al igual
que las diagonales) los valores de la diagonal, corresponden con los valores propios. El
siguiente teorema generaliza esta afirmación:
.:Teorema 7.3 Sea A ∈ C de tamaño n×n es una matriz triangular, entonces los valores
propios de A, contando sus multiplicidades, están dados por λ1 = a11 , λ2 = a22 , · · · , λn =
ann , donde a11 , a22 , . . . , ann son las entradas de la diagonal principal de A.
No es muy difícil demostrar este teorema, recordemos que el cálculo de los valores propios
recae en un determinante, por tanto, son sus propiedades las que debemos tener en cuenta
para demostrar éstos resultados. Veamos otros teoremas que se pueden demostrar teniendo
en cuenta las propiedades de los determinantes.
.:Ejemplo 7.3
6 3
αA =
18 21
Los valores propios de αA son λ = 3 y λ = 24, que corresponden a 3(1) y 3(8).
.:Teorema 7.6 Si A es de tamaño de n × n, entonces A−1 existe si y sólo si, sus valores
propios son todos diferentes de cero.
1. Si A−1 existe, entonces los valores propios deben ser diferentes de cero: No es muy
difícil comprobar esta afirmación, pues como vimos, toda matriz de n × n invertible
tiene n pivotes al convertirla en una matriz triangular (ver teorema 1.12), por tanto,
y por el teorema 7.3, podemos decir que los valores propios son diferentes de cero.
2. Si una matriz tiene todos sus valores propios diferentes de cero, entonces es
invertible: Al igual que en el punto anterior, sus valores propios estarán en la
diagonal de la matriz triangular equivalente. Como todos son diferentes de cero,
tendrá n pivotes diferentes de cero y por tanto será invertible.
Ahora, tomemos una matriz y su inversa y comparemos los valores propios en ambos
casos. Tomemos de nuevo la matriz A:
2 1
A=
6 7
Ahora tomamos su inversa:
0.875 −0.125
A−1 =
−0.75 0.25
Como vemos, los valores propios de la inversa de una matriz, son los inversos
multiplicativos de los valores propios de la matriz original. De igual forma, el determinante
esta relacionado con los valores propios.
.:Ejemplo 7.4
.:Ejercicios 7.1
b) La trA = λ1 + λ2 + λ3 + · · · + λn .
c) Los valores propios de At son λ1 , λ2 , λ3 , . . . , λn .
d ) αA tiene valores propios αλ1 , αλ2 , αλ3 , . . . , αλn .
e) Si A es invertible, entonces todos los valores propios de A−1 son distintos de
cero y son λ11 , λ12 , λ13 , . . . , λ1n y además, A y A−1 tienen los mismos vectores
característicos.
7 L = [1 , 3 , 5]
8
9 d e f M a t r i z V a l P r o p i o s (L) :
10 ∗
11 ∗
12 ∗
13 return M
Esto implica que |λ1 | es el mayor valor propio, a este se le conoce como radio espectral,
concepto que ya habíamos visto en la definición 3.2. Este método3 , realiza un proceso
iterativo, que se ejecuta hasta que converge al valor propio más grande. Para comenzar,
debemos tener en cuenta como deben ser los vectores propios de un matriz:
.:Teorema 7.9 Sea A una matriz de tamaño de n × n, con valores propios λ1 .λ2 , . . . , λn ,
y con v1 , v2 , . . . , vn como vectores vectores propios. Entonces, {v1 , v2 , . . . , vn } son
linealmente independientes.
3 Para una demostración del método ver [2]
7. Vectores y valores propios 343
Ahora bien, si podemos decir que el conjunto de vectores propios forman un conjunto de
vectores que son LI, entonces podemos concluir que los vectores propios forman una base
para Rn .
.:Teorema 7.10 Sea A una matriz de tamaño de n×n, con valores propios λ1 .λ2 , . . . , λn ,
y con v1 , v2 , . . . , vn como vectores propios. Entonces, {v1 , v2 , . . . , vn } forman una base para
Rn .
Con estos antecedentes, podemos tomar un vector arbitrario x ∈ Rn , y por el teorema 7.9,
podemos escribirlo como una combinación lineal de los vectores propios, es decir, existen
constantes k1 , k2 , . . . , kn tal que:
n
X
x= ki vi (7.8)
i=1
Ahora, multiplicamos a ambos lados de la ecuación 7.8 por las potencias de la matriz A,
es decir, A, A2 , A3 , . . . , Am .
n
X n
X
Ax = ki Avi = ki λi vi
i=1 i=1
Xn Xn
A2 x = ki A2 vi = ki λ2i vi
i=1 i=1
.. .. ..
. . .
n
X n
X
m m
A x = ki A vi = ki λm
i vi (7.9)
i=1 i=1
λm
Recordemos que λm 1 es el mayor valor propio de A, razón por la cual el cociente
i
λm
1
tenderá a cero cuando m tienda a infinito:
lı́m Am x = lı́m λm
1 k1 v1
m→∞ m→∞
344 7.2. Métodos numéricos para hallar los valores propios
Ahora bien, si |λ1 | < 1, la sucesión va a converger a cero, pero si |λ1 | ≥ 1 la sucesión va
a divergir.
El método de las potencias me proporciona dos sucesiones, la primera v (k) k∈N con el
(k)
vector propio asociado al mayor valor propio, el cual se obtiene de λ k∈N
. El siguiente
Algoritmo, muestra la implementación del método de la potencia en Python.
.:Algoritmo 7.4
1 i m p o rt numpy a s np
2 from numpy . p o l y n o m i a l i m p o rt ∗
3 from math i m p o rt ∗
4
5 p r i n t " Valor y v ector p ro p i o , metodo de l a p o t e n c i a : \ n"
6
7 A = np . a r r a y ( [ [ 2, 5, 2, 4] ,
8 [ 1, 5, 1, 1] ,
9 [ 0, 2, 1, 3] ,
10 [ 0, 1, 8, 5 ] ] , dtype=f l o a t )
11
12 v e c t o r e s P r o p i o s=np . l i n a l g . e i g (A)
13
14 print "La m a t r i z A: \ n" , A, " \n"
15
16 p r i n t " Los v a l o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 0 ] , " \n"
17
18 p r i n t " Los v e c t o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 1 ] , " \n"
19
20 v0=np . a r r a y ( [ 1 , 1 , 0 , 0 ] ) .T
21
22 p r i n t " El v e c t o r i n i c i a l : \ n" , v0 , " \n"
23
24 d e f medPotencia (A, v0 ) :
25 n=1000
26 t o l =0.0000000001
27 l a n =0.0
28 x=v0
29 y=(1/ np . l i n a l g . norm ( x ) ) ∗x
30 f o r i i n ra n g e ( n ) :
31 x=A. dot ( y )
32 y=(1/ np . l i n a l g . norm ( x ) ) ∗x
33 l a n c=x . dot ( y )
34 i f np . abs ( l a n −l a n c )< t o l :
35 return (y , lan )
36 l a n=l a n c
37 return (y , lan )
38
39 r e s=medPotencia (A, v0 )
40
41 p r i n t " El mayor valor propio es : " , res [ 1 ]
7. Vectores y valores propios 345
1 >>>
2 Valor y v ector p ro p i o , metodo de l a p o t e n c i a :
3
4 La m a t r i z A:
5 [[ 2. 5. 2. 4.]
6 [ 1. 5. 1. 1.]
7 [ 0. 2. 1. 3.]
8 [ 0. 1. 8. 5.]]
9
10 Los v a l o r e s p r o p i o s son :
11 [ 9.4704704 4.72204942 1.17875953 −2.37127934]
12
13 Los v e c t o r e s p r o p i o s son :
14 [[ −0.64191574 0.42963642 0 . 9 4 0 6 2 0 6 2 −0.382907 ]
15 [ −0.34797686 0 . 7 0 7 2 5 3 2 2 −0.28045874 0 . 0 4 5 5 1 3 5 3 ]
16 [ − 0 . 2 9 9 6 4 4 8 3 −0.06904846 −0.05274966 − 0 . 6 2 8 2 8 4 8 2 ]
17 [ − 0 . 6 1 4 0 5 9 6 6 −0.5571694 0.18382932 0.67569885]]
18
19 El v e c t o r i n i c i a l :
20 [1 1 0 0]
21
22 El mayor v a l o r p r o p i o e s : 9.47047039541
23 El v e c t o r propio asociado es : [ 0.64191574 0.34797686 0.29964483
0.61405966]
24 >>>
La limitación de este método, consiste en que sólo encuentra el mayor valor propio y el
vector propio asociado a este, existen algoritmos basados en el método de la potencia,
para hallar los demás valores propios. El siguiente método, encuentra todos los valores
propios de una matriz simétrica.
P −1 AP = B
Ahora bien, con el método de la factorización QR, lo que pretendemos, es encontrar una
matriz Am , que sea semejante a la matriz A original; estas dos matrices, por ser semejantes
tienen el mismo rango, el mismo determinante, y sobre todo, los mismos valores propios.
Como vimos en la sección 2.4 del capítulo 2, la factorización QR sólo se puede efectuar
sobre matrices simétricas, por lo tanto, sólo podremos hallar los valores propios con este
método a matrices simétricas de orden n. Bien, recordemos que si A = QR, la matriz
Q es una matriz ortogonal, lo que implica que sus columnas constituyen un conjunto
ortonormal de vectores, en otras palabras Qt = Q−1 . La otra matriz R, es una matriz
triangular superior.
7. Vectores y valores propios 347
.:Algoritmo 7.5
1 i m p o rt numpy a s np
2 from math i m p o rt ∗
3
4 p r i n t " V a l o r e s p r o p i o s , metodo de QR: \ n"
5
6 A = np . a r r a y ( [ [ 2, 7, 0, 0] ,
7 [ 7, 5, 2, 1] ,
8 [ 0, 2, 1, 8] ,
9 [ 0, 1, 8, 5 ] ] , dtype=f l o a t )
10
11 v e c t o r e s P r o p i o s=np . l i n a l g . e i g (A)
12
13 print "La m a t r i z A: \ n" , A, " \n"
14
15 p r i n t " Los v a l o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 0 ] , " \n"
16
17 p r i n t " Los v e c t o r e s p r o p i o s son : \ n" , v e c t o r e s P r o p i o s [ 1 ] , " \n"
18
19 tam=np . shape (A) [ 0 ]
20 Q=np . e y e ( ( tam ) , dtype=f l o a t )
21 R=np . e y e ( ( tam ) , dtype=f l o a t )
22
23 Z=np . z e r o s ( ( tam , tam ) )
24
25 l a n n=1
26 l a n =0
27 i =1
28 t o l =0.000001
29
30 while t o l <np . abs ( ( lann−l a n ) / l a n n ) :
31 l a n=l a n n
1 >>>
2 V a l o r e s p r o p i o s , metodo de QR:
3
4 La m a t r i z A:
5 [[ 2. 7. 0. 0.]
6 [ 7. 5. 2. 1.]
7 [ 0. 2. 1. 8.]
8 [ 0. 1. 8. 5.]]
9
10 Los v a l o r e s p r o p i o s son :
11 [ 12.623607 9.42466011 −3.55337118 −5.49489593]
12
13 Los v e c t o r e s p r o p i o s son :
14 [ [ 0 . 3 4 7 9 6 7 0 4 −0.53360823 0 . 7 3 6 4 2 3 7 9 − 0 . 2 2 7 7 3 0 5 4 ]
15 [ 0 . 5 2 8 0 9 5 0 1 −0.56597996 −0.58423352 0 . 2 4 3 8 3 0 9 5 ]
16 [ 0.49877434 0 . 3 5 6 8 5 0 3 8 −0.21236558 − 0 . 7 6 0 7 7 7 7 8 ]
17 [ 0.59267086 0.51728788 0.2669308 0.55668882]]
18
19 El a l g o r i t m o i t e r o 19 v e c e s
20
21 Los v a l o r e s p r o p i o s en l a d i a g o n a l de R:
22 [ 12.6232891 9.42489726 −5.49489351 −3.55337282]
23 >>>
Las variables lann y lan, se inicializan en cero y uno respectaivamente, estas almacenarán
el valor propio más pequeño. La variable i es un contador y la variable tol, me determina
la tolerancia mínima del error, al encontrar los valores propios.
.:Ejercicios 7.2
Iteración λ1 λ2 λ3 λ4
0 1.00000000 1.00000000 1.00000000 1.00000000
1 -7.28010989 5.8050076 -7.9890042 -6.880434
2 10.14517266 -5.20847243 8.73845869 -5.03088696
3 11.26338291 -6.88679564 7.11605094 -4.20846885
4 11.76947262 -8.79679595 5.82956123 -3.8488574
5 12.09278446 -9.47370225 -5.5044928 3.68371361
6 12.30530619 9.56488786 -5.46806982 -3.60946514
7 12.43810102 9.5336231 -5.47645747 -3.57715231
8 12.51747455 9.49443015 -5.48531692 -3.56337775
9 12.56355894 9.4663602 -5.49035465 -3.55756713
10 12.58985228 9.44880866 -5.49283167 -3.55512791
11 12.60470259 9.43841741 -5.49397943 -3.55410618
12 12.61304165 9.43242684 -5.49449506 -3.55367861
13 12.61770914 9.42902208 -5.49472239 -3.55349975
14 12.62031682 9.42710244 -5.49482137 -3.55342495
15 12.62177221 9.42602514 -5.49486408 -3.55339366
16 12.62258403 9.42542221 -5.49488239 -3.55338058
17 12.62303672 9.42508532 -5.49489019 -3.55337511
18 12.6232891 9.42489726 -5.49489351 -3.55337282
13 ∗
14 ∗
15 r e t u r n ValVec
Este resultado anterior, se puede usar para el cálculo de la matriz inversa de la matriz
original. Veamos el siguiente ejemplo:
.:Ejemplo 7.5
2 1
Dada la matriz A = , encuentre los valores y los vectores propios de A y evalúe
6 7
la matriz en el polinomio característico:
P (A) = A2 − 9A + 8I
2
2 1 2 1 1 0
= −9 +8
6 7 6 7 0 1
10 9 18 9 8 0
= − +
54 7 53 63 0 8
0 0
=
0 0
1
A−1 = −An−1 − an−1 An−2 − · · · − a2 A − a1 I (7.11)
a0
Donde n es el tamaño de la matriz, y a0 es el coeficiente del término independiente del
polinomio característico. Observemos que en el nuevo polinomio cambian todos signos, y
se disminuye en 1 el grado del polinomio, veamos un ejemplo:
.:Ejemplo 7.6
2 1
Dada la matriz A = , encuentre la inversa usando el polinomio característico:
6 7
7. Vectores y valores propios 353
1
A−1 = −A2−1 − (−9I)
8
1
= (−A + 9I)
8
0.875 −0.125
=
−0.75 0.25
.:Ejercicios 7.3
2. Dada una matriz invertible de tamaño n × n, demuestre que la ecuación 7.2, retorna
la inversa de la matriz dada.
354 7.4. Diagonalización
7.4. Diagonalización
Recordemos la definición 7.2, que nos dice que dos matrices A y B de tamaño n × n, son
semejantes si existe una matriz P invertible de tamaño n × n tal que P −1 AP = B. El
siguiente ejemplo tomado de [11], nos muestra un ejemplo de matrices semejantes:
.:Ejemplo 7.7
5 4 3 5.2 15 10
CB = =
0 −1 0 −4 0 4
3 2 5 4 15 10
AC = =
0 −4 0 −1 0 4
Entonces: CB = AC ⇒ A y B son semejantes, además, observemos que C −1 existe:
0.2 0.8
C −1 =
0 −1
Entonces si usamos la definición 7.2, tenemos:
C −1 AC
= B
0.2 0.8 3 2 5 4 3 5.2
=
0 −1 0 −4 0 −1 0 −4
3 5.2 3 5.2
=
0 −4 0 −4
Esto confirma que A y B son semejantes. Bien, pero ¿qué otra relación existe entre A y
B?, el siguiente teorema, muestra que otras características tienen en común dos matrices
que son semejantes:
2. A y B tienen los mismos valores propios, con las mismas multiplicidades algebráicas.
3. El detA = detB
4. tr(A)=tr(B)
5. rango(A)=rango(B)
3 2
Es fácil ver algunas de estas propiedades en las matrices A = y B =
0 −4
3 5.2
0 −4
La matriz A tiene como valores propios λ1 = −4 y λ2 = 3 y el polinomio característico
PA (λ) = λ2 + λ − 12, el detA = −12, de igual manera ocurre con la matriz B, pues tiene
λ1 = −4 y λ2 = 3 y el polinomio característico PB (λ) = λ2 + λ − 12, el detB = −12.
En los primeros capítulos de este libro, hemos visto que las matrices diagonales son
ideales para hallar el determinante, las soluciones de sistemas asociados a estas, los valores
propios, etc. El proceso de Diagonalización, consiste en encontrar una matriz diagonal,
que sea semejante a una matriz dada.
.:Ejemplo 7.8
Verifiquemos que ambas matrices sean semejantes, para ello necesitamos una matriz P
tal que P −1 AP = D, definamos P de la siguiente forma:
1 0 1
P = 0 1 0
1 0 −1
Comprobamos que A y D sean semejantes:
0.5 0 0.5
P −1 = 0 1 0
0.5 0 −0.5
Entonces:
P −1 DP
= A
0.5 0 0.5 5 0 0 1 0 1 3 0 −2
0 1 0 0 2 0 0 1 0 = 0 2 0
0.5 0 −0.5 0 0 1 1 0 −1 −2 0 3
Si C es una matriz cuyas columnas son los vectores propios linealmente independientes
de A, entonces:
D = C −1 AC
El teorema 7.13, nos dice que la matriz D es fácil de calcular, pues se construye con los
valores propios de la matriz; esto nos diría que si una matriz tiene n valores propios todos
7. Vectores y valores propios 357
An = CB n C −1 n ∈ Z +
.:Ejemplo 7.10
Calcular A3 :
Bien, recordemos que P −1 DP = A, Ahora calculamos D3 , que por ser una matriz diagonal
es posible hallar esta potencia fácilmente:
−33 0 0 −27 0 0
3
D = 0 73 0 = 0 343 0
0 0 23 0 0 8
Como P −1 DP = A, según el teorema P −1 D3 P = A3 , entonces:
A3 P −1 D3 P
=
0.5 0 0.5 −27 0 0 1 0 1
= 0 1 0 0 343 0 0 1 0
0.5 0 −0.5 0 0 8 1 0 −1
−9.5 0 −17.5
= 0 343 0
−17.5 0 −9.5
Es importante, que el lector tenga en cuenta que los algoritmos planteados en los ejercicios,
son clave para entender la dinámica de los conceptos planteados en este texto. De igual
forma, se recomienda tener presente la teoría en la ejecución de los mismos.
.:Ejercicios 7.4
3 3 6 13 3 2 0
d) 2 2 8 54 3 −2 0
f)
0 7 7 2 1 1 0
1 1 0 −1
6 −7 1 6
1 1 −1 1
e)
−1 0 −1 1
1 1 −1 0
a) An es semejante a B n , n ∈ Z +
b) detA = detB.
12 ∗
13 ∗
14 ∗
15 return i n f
361
362 BIBLIOGRAFÍA
[18] Golub, G & Van Loan, C. (1996), Matrix Computations third edition,
The Johns Hopkins University Press, Baltimore Meryland EEUU.
[21] González, R. (2011), Python para todos, Sitio web disponible en: http:
//[Link]/tutorial-python/. Consultado en abril de 2013.
[23] Bahit, E. (2012), Python para Principiantes, Sitio web disponible en: www.
[Link]/biblioteca/python-para-principiantes/. Consultado
en abril de 2013.
BIBLIOGRAFÍA 363
Introducción a Python
A
El siguiente apéndice, tiene como objetivo hacer una pequeña introducción al lenguaje de
programación Python1 . En él, encontraremos los siguientes temas:
Instalación
El lenguaje Python
La indentación
La instrucción print
Estructura de control de decisiones
Estructura de control de ciclos
Funciones
Diccionarios y listas
Programación orientada a objetos
De igual forma, veremos la metodología necesaria para realizar los programas y ejercicios
propuestos en este libro. Si el lector desea conocer a fondo el lenguaje, por favor consulte
los textos [14, 23, 21, 22, 12].
1 Toda la información sobre el lenguaje y la instalación en los diferentes sistemas operativos, puede
consultarse en [Link]
365
366 A.1. Instalación
A.1. Instalación
Dependiendo del sistema operativo en que trabajemos, podemos hacer una instalación
rápida y sencilla. Recordemos que necesitamos las librerías de SciPy para realizar los
Algoritmos propuestos.
A.1.1. Linux
En Linux, debemos tener en cuenta la distribución en la que estemos trabajando. Esta
parte puede resultar un poco compleja para el usuario sin experiencia en Linux. En este
libro, los ejemplos y algoritmos, fueron corridos en Linux Ubuntu, pero existen otras
distribuciones como OpenSuse, Redhat, etc. Ubuntu es la distribución de Linux más
común, y por muchos la indicada para usuarios con poca experiencia, además Python ya
viene preinstalado en Ubuntu, pues lo usa para algunas de sus librerías.
Estos dos comandos, instalan la versión 2.*2 , con la cual trabajaremos. Para
otras distribuciones de Linux consulta la página [Link]
Python2orPython3, Ahí encontraras la información necesaria para instalarlo.
y luego:
2 La
notación 2.*, hace referencia a cualquiera de las versiones que dependen de la versión 2, de igual
manera 3.* hace referencia a las versiones que dependen de la versión 3.
A. Introducción a Python 367
A.1.2. Windows
En Windows, es relativamente más fácil, sólo necesita bajar el instalador que
encontramos en: [Link] recordemos que para
nuestro trabajo con este texto, usaremos la versión 2.*, por eso recomendamos la versión
más actualizada. Luego de bajarlo, simplemente lo instalamos. Python trae un programa
IDE (Integrated Development Environment), que es muy primitivo, pero que servirá para
hacer los primeros pasos con Python.
La librería Scipy se puede instalar usando el programa pythonxy3 , el cual provee las
librerías necesarias, así como el IDE Spyder 2 para la implementación del código.
A.1.3. MacOS
En Mac, recomiendo la versión de Python de la empresa Continuum4 , el cual, distribuye
una versión llamada Anaconda Pyhon, que incluye: El lenguaje Python, el IDE Spyder y
la consola IPython. La instalación se hace bajando un archivo *.dmg de la página http:
//[Link]/downloads; una vez descargada, se puede usar sin hacer configuraciones
posteriores. Esta versión ya tiene las librerías SciPy instaladas.
A.2. Python
Python es un lenguaje de programación creado por Guido van Rossum en el CWI,
Centrum Wiskunde & Informatica, en los Países Bajos. Es un lenguaje de programación
3 Paramás información consultar: [Link]
4 Paramás información sobre la empresa Continuum consulte la página [Link]
5 NINJA-IDE disponible en[Link]
6 SPE disponible en [Link]
7 Spyder 2 disponible en [Link]
368 A.2. Python
Python tiene una filosofía que hace énfasis en sintaxis correcta y legible. En este momento,
se encuentra administrado por la fundación Python Software Foundation. y tiene una
licencia especial que se conoce como Python Software Foundation License, la cual, es
completamente compatible con la licencia pública general de GNU. Es usado en una
amplia gama de aplicaciones, entre ellas programas en 3D como Blender, que lo usa como
lenguaje base para sus scrips, Panda3D, es un motor de juegos desarrollado en Python
y C++. Algunos sistemas operativos como Ubuntu y Debian, lo usan como lenguaje
base de algunas de sus bibliotecas. De igual manera, para implementación de aplicaciones
científicas y como una posible alternativa a Matlab. Para manejo de páginas web y scrips,
así como el manejo de bases de datos.
La versión de Python que usaremos en este texto es la versión 2.*; Sin embargo, existen
varias versiones: La primera versión o versión 1, fue un “prototipo”, hoy en día no se usa.
La versión 2 se creó precisamente para romper con la compatibilidad de la versión 2, esta
versión es la más usada y desarrollada, actualmente está en la versión 2.7.7. La versión
3 fue lanzada en diciembre de 2008, y tenia como objetivo romper con la versión 2, pero
este objetivo no ha sido posible, debido a que los programadores se sienten cómodos con
lo que ofrece la versión 2. Por esta razón, la versión 3 se desarrolla en paralelo con la
versión 2.
Lenguaje Interpretado: Los lenguajes interpretados tienen ciertas ventajas frente a los
compilados. En primer lugar, cuando hacemos un programa en un lenguaje compilado,
se crea un archivo con una serie de comandos estáticos, que no se pueden modificar. En
un lenguaje interpretado como Python, los programas se ejecutan, esto se logra con el
Python Runtime, que es como un ejecutable “vacío”, que se llena cuando corremos nuestro
programa. Esto permite hacer cosas que con lenguajes compilados no se pueden hacer; por
ejemplo, podemos alimentar de código en tiempo de ejecución, es decir, podemos hacer
un programa, que reciba una cadena de código, y la incluya dentro de su código fuente.
Si dos líneas de código están seguidas, en el mismo bloque de código, estas tendrán la
misma indentación, por ejemplo:
.:Algoritmo A.1
1 p r i n t " h o l a mundo"
2 p r i n t " Hola como e s t a s "
1 >>>
2 h o l a mundo
3 Hola como e s t a s
4 >>>
370 A.3. La indentación en Python
.:Algoritmo A.2
1 p r i n t " h o l a mundo"
2 p r i n t " Hola como e s t a s "
1 >>>
2 p r i n t " Hola como e s t a s "
3 ^
4 I n d e n t a t i o n E r r o r : u n e x p e c te d i n d e n t
5 >>>
Este tipo de errores son muy comunes cuando se inicia en la programación en Python,
sobre todo si ya conocías otros lenguajes como C++ o Pascal. De igual manera, los
bloques de código como los ciclos y las decisiones, requieren de una indentación cada vez
que aparezca un nuevo bloque. Veamos el siguiente ejemplo:
.:Algoritmo A.3
1 >>>
2 x es p o s i t i v a
3 −5
4 x es negativa
5 4
6 >>>
Bien, el Algoritmo A.3, declara una función con la palabra reservada def. Después, aparece
el nombre de la función que en este caso es “funcion” sin tildes, esta tiene un argumento
llamado “x”, seguido de dos puntos “:”; esto le dice a Python, que una nueva función va a
comenzar. Seguidamente aparece la implementación de la función, y como podemos ver,
las líneas pertenecientes a la función, tienen una indentación de 4 espacios.
Como vemos, la indentación, hace las veces de corchetes o de Begin y end en los bloques
de código. El estudiante, debe tener cuidado con esta forma de delimitar los bloques de
código, pues el cambio de la indentación no necesariamente produce un error sintáctico,
puede generar que una linea de código se ejecute el otro bloque de código diferente, y esto
puede provocar fallas en el comportamiento de nuestros programas.
.:Algoritmo A.4
1 p r i n t " h o l a mundo"
1 >>>
2 h o l a mundo
3 >>>
Python por defecto, viene con librerías para el trabajo de funciones matemáticas,
incluyendo números reales y complejos. Además, posee una completa librería para el
trabajo de números aleatorios, también se incluye librerías para criptografía y el manejo
de archivos y archivos comprimidos en formatos zlib, gzip, bzip2 y tar. De igual forma,
el manejo de bases de datos, funciones para control de conexiones TCP/IP, web, correo
electrónico, etc; así como el acceso al sistema operativo.
.:Algoritmo A.5
1 p r i n t " h o l a mundo"
2
3 print ’ h o l a mundo ’
4
5 a=10
6 b =2.23450983
7
8 p r i n t " l a v a r i a b l e a t i e n e un a v l o r de " , a
9
10 p r i n t " l a v a r i a b l e b t i e n e un v a l o r de " , b
A. Introducción a Python 373
11
12 p r i n t " a=" , a , " \ t b=" , b , " \n"
13
14 c=a /b
15
16 p r i n t " %.3 f e s e l c o c i e n t e e n t r e %.4 f y %.5 f " % ( c , a , b )
1 >>>
2 h o l a mundo
3 h o l a mundo
4 l a v a r i a b l e a t i e n e un a v l o r de 10
5 l a v a r i a b l e b t i e n e un v a l o r de 2.23450983
6 a= 10 b= 2 . 2 3 4 5 0 9 8 3
7
8 4.475 es e l coci ente entre 10.0000 y 2.23451
9 >>>
En el Algoritmo A.5, podemos ver en las líneas 1 y 3, que se imprime la misma cadena de
caracteres, sólo que en el primero se incluye con doble comillas y el segundo con comillas
sencillas; en ambos casos, el resultado es igual.
En las líneas 5 y 6 se incluyen dos variables a y b. Con la variable a, Python infiere que
es un número entero, pues no tiene punto decimal. Con b, Python deduce que es de tipo
real, pues si tiene punto decimal. Posteriormente, en las líneas 8 y 10, se usa la instrucción
print para imprimir las dos variables, observemos que primero se imprime la cadena y
posteriormente la variable separados por una coma “,”. Esta notación, permite imprimir
varias variables a la vez, por ejemplo, podemos imprimir cuatro variables de diferentes
tipos, separadas por una coma: print a,b,c,d.
De igual forma, en la línea 12, se hace un ejercicio similar, sólo que aquí, se intercambian
cadenas y variables, cada una separada por una coma. Además, se incluye el símbolo “\n”
que equivale a un enter; razón por la cual, en la salida se ve un espacio mayor entre las
líneas. En la línea 14, hacemos el cálculo c=a/b, Python infiere que este cociente es entre
un número entero y un número real, y por lo tanto, asigna a la variable c, el valor de
dicho cociente como un número real.
La línea 16, es muy especial, en ella, observamos como podemos formatear una cadena,
para que imprima variables numéricas, con una cantidad limitada de valores decimales.
Para ello, nos valemos del símbolo que imprime el valor numérico de punto flotante, que
374 A.6. Decisiones
Estos formatos, nos permiten hacer impresiones de procesos iterativos, logrando una mejor
visualización de los resultados, y dejándolos listos, para incluirlos en nuestros libros o
informes.
Operador Descripción
+ Suma
- Resta
- Negación
* Multiplicación
** Exponente
/ División
// División entera
% Módulo
Recuerde que el usuario puede implementar sus propias funciones. Para más información
consultar [21].
A.6. Decisiones
A diferencia de los demás lenguajes de programación, Python sólo tiene un tipo de
decisión, de tipo “si - entonces” o “si - entonces - de lo contrario”. En Python no existe la
sentencia “case”. La sentencia “if” tiene la siguiente forma:
A. Introducción a Python 375
if condición :
instrucción 1
instrucción 2
.
.
.
Recordemos que las instrucciones que pertenecen al if, deben estar indentadas por lo
menos un espacio. Al igual que en otros lenguajes, si la condición es verdadera, se ejecutan
las instrucciones que están en el condicional, de lo contrario, estas no se ejecutan.
if condición :
instrucción 1
instrucción 2
.
.
.
else:
instrucción 1
instrucción 2
.
.
.
Si la condición es verdadera, se ejecutan las instrucciones que están debajo del if, pero si
la condición es falsa, se ejecutan las instrucciones que están debajo del else. Después de la
instrucción if, siempre se pone dos puntos “:” para indicarle a Python que ya se finalizó la
condición; también se debe poner después del comando else. El siguiente ejemplo ilustra
la manera de usar el condicional if.
.:Algoritmo A.6
1 from math i m p o rt ∗
2
3 p r i n t " R a i c e s de una e c u a c i o n d e segundo g ra d o "
4
5 print " ingrese los valores de l o s c o e f i c i e n t e s segun ax^2 + bx + c "
6 a=f l o a t ( raw_input ( " i n g r e s e el v a l o r de a : " ) )
7 b=f l o a t ( raw_input ( " i n g r e s e el v a l o r de b : " ) )
8 c=f l o a t ( raw_input ( " i n g r e s e el v a l o r de c : " ) )
376 A.6. Decisiones
9
10
11 d i s=b ∗∗2 − 4∗ a ∗ c
12 p r i n t " El d i s c r i m i n a t e e s : " , d i s
13
14 if d i s >= 0 :
15 p r i n t "La e c u a c i o n t i e n e r a i c e s r e a l e s : "
16 x r1=(−b . r e a l + s q r t ( d i s ) ) / (2 ∗ a . r e a l )
17 x r2=(−b . r e a l − s q r t ( d i s ) ) / (2 ∗ a . r e a l )
18 p r i n t " l a p ri m e ra s o l u c i o n x1 : " , x r1
19 p r i n t " l a segunda s o l u c i o n x1 : " , x r2
20 else :
21 p r i n t "La e c u a c i o n t i e n e r a i c e s c o m p l e j a s : "
22 xc1=(−b + s q r t ( abs ( d i s ) ) ∗1 j ) / (2 ∗ a )
23 xc2=(−b − s q r t ( abs ( d i s ) ) ∗1 j ) / (2 ∗ a )
24 p r i n t " l a p ri m e ra s o l u c i o n x1 : " , xc1
25 p r i n t " l a segunda s o l u c i o n x1 : " , xc2
1 >>>
2 R a i c e s de una e c u a c i o n d e segundo g ra d o
3 i n g r e s e l o s v a l o r e s de l o s c o e f i c i e n t e s segun ax^2 + bx + c
4 i n g r e s e e l v a l o r de a : 2
5 i n g r e s e e l v a l o r de b : 3
6 i n g r e s e e l v a l o r de c : 5
7 El d i s c r i m i n a t e e s : −31.0
8 La e c u a c i o n t i e n e r a i c e s c o m p l e j a s :
9 l a p ri m e ra s o l u c i o n x1 : ( −0.75+1.39194 10 9 07 1 j )
10 l a segunda s o l u c i o n x1 : ( −0.75 −1.39194109071 j )
11 >>>
3. float: Como la función raw_input devuelve una variable de tipo texto, debemos
convertir estos valores a variables reales, así que usamos la función float, que
convierte una variable a un valor real, independientemente de que sea un entero
o una cadena.
Teniendo los coeficientes a, b y c de una ecuación de segundo grado de la forma ax2 +bx+c,
podemos calcular el discriminante, el cual, me indica si la ecuación tiene raíces reales o
complejas. En la línea 11 calculamos dicho discriminante en la variable dis.
Si la variable dis es menor que cero, entonces las líneas 15 a 19 no se ejecutan, en su lugar
se ejecutan las líneas 21 a 25, que me permiten calcular las raíces complejas, multiplicando
la raíz cuadrada del valor absoluto del discriminante por 1j, que es la unidad imaginaria
usada por Python, esto le dice al compilador, que las variables xc1 y xc2 son de tipo
complejas y no reales. En el Algoritmo A.6, usamos los coeficientes 2, 3 y 5, que equivalen a
la ecuación 2x2 +3x+5 = 0, dicha ecuación tiene como soluciones a -0.75+1.39194109071j
y -0.75-1.39194109071j. Si cambiamos estos coeficientes por 1, 3 y 1, es decir, la ecuación
x2 + 3x + 1 = 0, obtendremos -0.38196601125 y -2.61803398875 como soluciones.
El cuadro A.2, muestra los operadores relacionales que se usan en los condicionales:
Este esquema de condicional, permite resumir en una línea de código, una decisión que
tomaría cerca de cuatro líneas. En este caso, todo recae en una variable, a la que se le
asigna el valor de P si la condición es verdadera, y Q si la condición es falsa. Veamos el
siguiente Algoritmo:
.:Algoritmo A.7
378 A.6. Decisiones
Operador Descripción
x == y ¿x es igual a y?
x! = y ¿x es diferente de y?
x>y ¿x es mayor que y?
x >= ¿x es mayor o igual que y?
x<y ¿x es menor que y?
x <= y ¿x es menor o igual que y?
x and y La sentencia es verdadera si x y
y es verdadera, en caso contrario
es falsa.
x or y La sentencia es verdadera si x
es verdadero o y es verdadera, si
ambas son falsas, la sentencia es
falsa
not x Cambia el sentido a la variable x;
si es verdadera, la convierte en
falsa, si es falsa la convierte en
verdadera.
1 from math i m p o rt ∗
2
3 p r i n t " Valor ob s ol u to "
4
5 a=f l o a t ( raw_input ( " i n g r e s a un v a l o r : " ) )
6
7 k = a i f a>= 0 e l s e −1∗a
8
9 p r i n t " El v a l o r a b s o l u t o de tu numero e s : " , k
1 >>>
2 Valor ob s ol u to
3 i n g r e s a un v a l o r : −5
4 El v a l o r a b s o l u t o de tu numero e s : 5.0
5 >>>
A. Introducción a Python 379
if condición 1:
instrucción 1
instrucción 2
instrucción 3
.
.
.
elif condición 2:
instrucción 1
instrucción 2
instrucción 3
.
.
.
elif condición 2:
instrucción 1
instrucción 2
instrucción 3
.
.
.
else:
instrucción 1
instrucción 2
instrucción 3
.
.
.
Si la condición inicial no se cumple, se pasa al primer elif, si la condición de este no se
cumple, se pasa al segundo elif, de esa forma hasta terminar; si no se cumple ninguna
condición, se ejecutan las instrucciones que están en el else, pero este es opcional. Veamos
380 A.7. Listas
el siguiente ejemplo:
.:Algoritmo A.8
1 from random i m p o rt ∗
2
3 a=round (1 0 ∗ random ( ) )
4
5 if a==0:
6 print " El numero e s c e r o "
7 e l i f a<=9 and a >8:
8 print " El numero e s t a e n t r e 8 y 9 "
9 e l i f a<=8 and a >7:
10 print " El numero e s t a e n t r e 8 y 7 "
11 else :
12 print " El numero e s menor que 7 "
1 >>>
2 El numero e s menor que 7
3 >>>
El comando from random import * importa la librería random, que permite obtener
números aleatorios. La función random() de la línea 3, retorna un número aleatorio entre
cero y uno, que al ser multiplicado por 10, amplía su rango de cero a 10. La función round
redondea dicho número para eliminar la parte decimal.
A.7. Listas
Esta sección, rompe con el esquema planteado que hemos utilizado para describir las
sentencias de control. Esta pausa, la hemos hecho para describir una de las ventajas más
representativas de Python. Generalmente, los lenguajes de tipo declarativo como Lisp,
Haskell o Mozat-OZ, ya tienen un manejador de listas, pero en los lenguajes imperativos
como C++ y Pascal, no es común tener este tipo de datos. Python, propone una manejo
A. Introducción a Python 381
de listas claro y muy eficiente, con una sintaxis que es muy simple y fácil de entender.
Una Lista en Python, es un arreglo “de cualquier tamaño”, que puede albergar variables de
cualquier tipo, inclusive, si creamos tipos u objetos propios. Las listas en Python pueden
ser de uno o varios tipos. Las listas se inicializan con corchetes y los elementos se separan
con comas. Veamos el siguiente ejemplo:
.:Algoritmo A.9
1 >>>
2 Manejo de l i s t a s
3 [ 4 , 5 . 6 , ’ h o l a mundo ’ ]
4 >>>
1 >>> l [ 0 ]
2 4
382 A.7. Listas
3 >>> l [ 1 ]
4 5.6
5 >>> l [ 2 ]
6 ’ h o l a mundo ’
7 >>> l [ 3 ]
8 Traceback ( most r e c e n t c a l l l a s t ) :
9 F i l e "<s t d i n >" , l i n e 1 , i n <module>
10 I n d e x E r r o r : l i s t i n d e x out o f ra n g e
Las listas en Python comienzan en cero, por eso al teclear l[0], obtenemos el primer valor
de la lista. Como la lista tiene sólo tres elementos, por tanto al teclear l[3] obtenemos un
error “IndexError: list index out of range”.
También podemos hacer sublistas, las cuales se logran definiendo el índice inicial y el final
dentro de la lista principal:
.:Algoritmo A.10
1 >>>
2 Manejo de l i s t a s
3 [ ’ a ’ , ’b ’ , ’ c ’ , 2 , 5.6 , 9]
4 [ ’ c ’ , 2]
5 [ ’ a ’ , ’b ’ , ’ c ’ , 2]
6 9
7 5.6
8 a
A. Introducción a Python 383
9 >>>
Cuando invocamos el comando l[2:4], obtenemos una sublista que comienza en el índice
2 y termina en el índice 3, es decir, termina en el elemento anterior. Los índices negativos
son otra de las ventajas de Python, en los cuales, sin importar el tamaño de la lista, el
elemento con índice -1 es el elemento final, el -2 es el penúltimo y así sucesivamente; si
nuestra lista tiene seis elementos, al invocar l[-6] obtendremos el primer elemento de la
lista. Tenga en cuenta que li = li−T (l) , donde T (l) es el tamaño de la lista.
.:Algoritmo A.11
29
30 k=l 1 . i n d e x ( " c " )
31 p r i n t " Imprime e l i n d i c e c o r r e s p o n d i e n t e a l e l e m e n to c : " , k
32
33 p r i n t " Imprime l a c a n t i d a d de e l e m e n t o s p r e s e n t e s en l a l i s t a " , l 1 . count ( "
h o l a de nuevo " )
34
35 l 1 . append ( [ " h o l a " , "mundo" ] )
36
37 p r i n t " Agregamos una s u b l i s t a a l a l i s t a " , l 1
38
39 l 1 . e x te n d ( [ " a d i o s " , " a t o d o s " ] )
40 p r i n t " Agregamos una s u b l i s t a con e l comando e x te n d " , l1
41
42 l 1 . pop ( )
43 p r i n t " Eliminamos e l u l t i m o e l e m e n to con l a f u n c i o n pop " , l 1
44
45 l1 . reverse ()
46 p r i n t " Imprimimos l a l i s t a a l r e v e s " , l 1
47
48 l1 . sort ()
49 p r i n t "La l i s t a ordenada : " , l 1
50
51 cadena= ’Me e n c a n ta Python e s muy f a c i l ’ . s p l i t ( )
52
53 p r i n t cadena
1 >>>
2 Manejo de l i s t a s
3
4 l a p ri m e ra l i s t a [ ’ a ’ , ’b ’ , ’ c ’ ]
5
6 l a segunda l i s t a [ 3 , 5 , 8 , 1 , ’ hola ’ ]
7
8 l a u n i o n de l 1 y l 2 [ ’ a ’ , ’b ’ , ’ c ’ , 3 , 5 , 8 , 1 , ’ hola ’ ]
9
10 Agregando un nuevo e l e m e n to [ ’ a ’ , ’ b ’ , ’ c ’ , 3 , 5 , 8 , 1 , ’ h o l a ’ , ’ nuevo
e l e m e n to ’ ]
11
12 R e p e t i c i o n de l i s t a s [ ’a ’ , ’b ’ , ’ c ’ , ’a ’ , ’b ’ , ’ c ’ , ’a ’ , ’b ’ , ’ c ’ ]
13
14 Agregando v a l o r e s a l a l i s t a [ ’ a ’ , ’ b ’ , ’ c ’ , ’ h o l a de nuevo ’ ]
15
16 Agregar un e l e m n to a l a l i s t a con i n s e r t [ ’ a ’ , ’ b ’ , ’ s o y nuevo ’ , ’ c ’ , ’ h o l a
de nuevo ’ ]
17
18 Eliminando e l e m e n t o s de l a l i s t a [ ’ b ’ , ’ s o y nuevo ’ , ’ c ’ , ’ h o l a de nuevo ’ ]
19
20 Imprime e l i n d i c e c o r r e s p o n d i e n t e a l e l e m e n to c : 2
A. Introducción a Python 385
21
22 Imprime l a c a n t i d a d de e l e m e n t o s p r e s e n t e s en l a l i s t a 1
23
24 Agregamos una s u b l i s t a a l a l i s t a [ ’ b ’ , ’ s o y nuevo ’ , ’ c ’ , ’ h o l a de nuevo ’ ,
[ ’ h o l a ’ , ’ mundo ’ ] ]
25
26 Agregamos una s u b l i s t a con e l comando e x te n d [ ’ b ’ , ’ s o y nuevo ’ , ’ c ’ , ’
h o l a de nuevo ’ , [ ’ h o l a ’ , ’ mundo ’ ] , ’ a d i o s ’ , ’ a t o d o s ’ ]
27
28 Eliminamos e l u l t i m o e l e m e n to con l a f u n c i o n pop [ ’ b ’ , ’ s o y nuevo ’ , ’ c ’ , ’
h o l a de nuevo ’ , [ ’ h o l a ’ , ’ mundo ’ ] , ’ a d i o s ’ ]
29
30 Imprimimos l a l i s t a a l r e v e s [ ’ a d i o s ’ , [ ’ h o l a ’ , ’ mundo ’ ] , ’ h o l a de nuevo ’ ,
’ c ’ , ’ s o y nuevo ’ , ’ b ’ ]
31
32 La l i s t a ordenada : [ [ ’ h o l a ’ , ’ mundo ’ ] , ’ a d i o s ’ , ’ b ’ , ’ c ’ , ’ h o l a de nuevo ’ ,
’ s o y nuevo ’ ]
33
34 [ ’Me ’ , ’ e n c a n ta ’ , ’ Python ’ , ’ e s ’ , ’muy ’ , ’ f a c i l ’ ]
35 >>>
A.8. Ciclos
Python sólo maneja dos tipos de ciclos, el primero es el tipo for, que se usa cuando
sabemos exactamente cuántas veces se va a ejecutar el ciclo. El otro tipo, es el while, el
cual, se usa cuando no conocemos cuantas veces se va a ejecutar el ciclo.
instrucción 1
instrucción 2
instrucción 3
.
.
.
Este tipo de ciclo, es diferente a los demás ciclos for de otros lenguajes. En primer lugar,
los for se ejecutan sobre los componentes de una lista o cadena. La primera vez que se
ejecuta, la variable toma el valor de la primera componente de la lista, la segunda vez que
se ejecuta, toma el valor del segundo componente de la lista y así sucesivamente, hasta
terminar con el último componente. Esto implica, que el for se ejecuta tantas veces como
elementos tenga la lista.
.:Algoritmo A.12
1 from random i m p o rt ∗
2
3 n=i n t (1 0 ∗ random ( ) )
4
5 f o r i i n ra n g e ( n ) :
6 print i
7
8 p r i n t " ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ \ n"
9
10 f o r i in " hola " :
11 print i
12
13 p r i n t " ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ \ n"
14
15 f o r i in [ 1 , 2 , 4. 6 , " hola " , [ 3 , 5 ] ] :
16 print i
1 >>>
2 0
3 1
4 2
5 3
388 A.8. Ciclos
6 4
7 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
8
9 h
10 o
11 l
12 a
13 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
14
15 1
16 2
17 4.6
18 hola
19 [3 , 5]
20 >>>
En el Algoritmo A.12, vemos tres for, el primero (línea 5), usa la función range(5), que
genera una lista con números enteros de 0 a 4, el ciclo imprime la variable del for. El
segundo (línea 10), actúa sobre una cadena, en este caso, la variable i asume cada letra
de la cadena. En la línea 15, el for actúa sobre una lista de 4 elementos, que está compuesta
por dos enteros, un real y una sublista, en cuyo caso, la variable i asumirá cada tipo.
while condición:
instrucción 1
instrucción 2
instrucción 3
.
.
.
Recordemos que las instrucciones del while deben estar indentadas. Cuando la condición
sea falsa, entonces el ciclo se detiene. El siguiente ejemplo muestra la funcionalidad del
ciclo while:
.:Algoritmo A.13
A. Introducción a Python 389
1 from random i m p o rt ∗
2
3 n=4
4 w h i l e n <7:
5 n=i n t (1 0 ∗ random ( ) )
6 p r i n t "n= " , n
7
8 p r i n t " ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ \ n"
9
10 i = 1.0
11 w h i l e i <= 1 0 :
12 p r i n t " %.5 f \ t %.5 f \ t %.5 f " % (1 / i , 1/ i ∗ ∗ 2 , 1/ i ∗ ∗ 3 )
13 i = i + 1
14
15 k = f l o a t ( raw_input ( "Dame un numero e n t r e 0 y 9 : " ) )
16 w h i l e not ( k>=0 and k <= 9 ) :
17 p r i n t ( " Numero f u e r a d e l rango , i n t e n t a l o de nuevo : " )
18 k = f l o a t ( raw_input ( "Dame un numero e n t r e 0 y 9 : " ) )
19 p r i n t ( "Hemos te rm i n a d o " )
1 >>>
2 n= 6
3 n= 1
4 n= 1
5 n= 6
6 n= 6
7 n= 2
8 n= 4
9 n= 9
10 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
11
12 1.00000 1.00000 1.00000
13 0.50000 0.25000 0.12500
14 0.33333 0.11111 0.03704
15 0.25000 0.06250 0.01562
16 0.20000 0.04000 0.00800
17 0.16667 0.02778 0.00463
18 0.14286 0.02041 0.00292
19 0.12500 0.01562 0.00195
20 0.11111 0.01235 0.00137
21 0.10000 0.01000 0.00100
22
23 Dame un numero e n t r e 0 y 9 : 33
24 Numero f u e r a d e l rango , i n t e n t a l o de nuevo :
25
26 Dame un numero e n t r e 0 y 9 : 44
27 Numero f u e r a d e l rango , i n t e n t a l o de nuevo :
28
390 A.9. Funciones
29 Dame un numero e n t r e 0 y 9 : 66
30 Numero f u e r a d e l rango , i n t e n t a l o de nuevo :
31
32 Dame un numero e n t r e 0 y 9 : 2
33 Hemos te rm i n a d o
34
35 >>>
2. En el segundo while (línea 11), se inicia una variable i=1.0 previamente. En el print
se formatea una cadena con 5 cifras decimales, que imprimirán los recíprocos de las
potencias de la variable i. Recordemos que el caracter “\n” equivale a la tecla enter y
el caracter “\t” equivale a la tecla tab, así que imprimimos los resultados separados
por una tecla tab.
Existen otras formas de terminar un ciclo, la instrucción break rompe un ciclo bien sea un
for o un while. Sin embargo, debemos tener cuidado de donde ubicamos esta instrucción,
pues puede detener el ciclo antes de que el programa haya alcanzado su objetivo.
A.9. Funciones
Las funciones en Python, son bloques de código que se ejecutan en el momento en que
las invoquemos. Estas se declaran con la instrucción del de la siguiente forma:
instrucción 2
instrucción 3
.
.
.
.:Algoritmo A.14
1 from random i m p o rt ∗
2 from math i m p o rt ∗
3
4 d e f C a rte A p o l a r ( x , y ) :
5 r=s q r t ( x ∗∗2 + y ∗ ∗ 2 )
6 t=atan ( y/ f l o a t ( x ) )
7 return ( r , t )
8
9 d e f PolarACarte ( r , t ) :
10 x=r ∗ c o s ( t )
11 y=r ∗ s i n ( t )
12 return (x , y)
13
14
15
16 p r i n t " El punto ( 3 , 4 ) en c a t e s i a n a s e q u i v a l e a " , C a rte A p o l a r ( 3 , 4 ) , " en
p o l a r e s \n"
17
18 p r i n t " El punto ( 3 , p i ) en p o l a r e s e q u i v a l e a " , PolarACarte ( 3 , p i ) , " en
cartesianas"
1 >>>
2 El punto ( 3 , 4 ) en c a t e s i a n a s e q u i v a l e a ( 5 . 0 , 0 . 9 2 7 2 9 5 2 1 8 0 0 1 6 1 2 2 ) en
polares
3
4 El punto ( 3 , p i ) en p o l a r e s e q u i v a l e a ( − 3 . 0 , 3 . 6 7 3 9 4 0 3 9 7 4 4 2 0 5 9 4 e −16) en
cartesianas
5 >>>
392 A.9. Funciones
.:Algoritmo A.15
1 from random i m p o rt ∗
2 from math i m p o rt ∗
3
4 d e f promedio (∗ a rg ) :
5 n=f l o a t ( l e n ( a rg ) )
6 suma=0.0
7 f o r i i n a rg :
8 suma = suma + i
9 r e t u r n suma/n
10
11
12 p r i n t " El promedio de 1 , 2 , 3 , 4 , 5 e s " , promedio ( 1 , 2 , 3 , 4 , 5 )
13 p r i n t " El promedio de 2 . 3 , 5 . 6 , 7 . 1 e s " , promedio ( 2 . 3 , 5 . 6 , 7 . 1 )
1 >>>
2 El promedio de 1 , 2 , 3 , 4 , 5 es 3.0
A. Introducción a Python 393
3 El promedio de 2 . 3 , 5 . 6 , 7 . 1 es 5.0
4 >>>
.:Algoritmo A.16
1 semana = { " l u n e s " : " 1 " , " m a rte s " : " 2 " , " m i e r c o l e s " : " 3 " , " j u e v e s " : " 4 " }
2
3 p r i n t semana [ " l u n e s " ]
4
5 semana [ " v i e r n e s "]= " 5 "
6
7 p r i n t semana
8
9 p r i n t semana . i t e m s ( )
10
11 p r i n t semana . has_key ( " m a rte s " )
12
13 p r i n t semana . g e t ( " domingo " , " E s te v a l o r no e s t a " )
14
15 p r i n t semana . k e y s ( )
16
17 p r i n t semana . v a l u e s ( )
18
19 p r i n t semana . pop ( " j u e v e s " )
20 p r i n t semana
21
22 semana . c l e a r ( )
23
24 p r i n t semana
394 A.10. Manejo de Diccionarios
1 >>>
2 1
3 { ’ l u n e s ’ : ’ 1 ’ , ’ j u e v e s ’ : ’ 4 ’ , ’ m i e r c o l e s ’ : ’ 3 ’ , ’ m a rte s ’ : ’ 2 ’ , ’ v i e r n e s ’ : ’
5 ’}
4 [ ( ’ l u n e s ’ , ’ 1 ’ ) , ( ’ j u e v e s ’ , ’ 4 ’ ) , ( ’ m i e r c o l e s ’ , ’ 3 ’ ) , ( ’ m a rte s ’ , ’ 2 ’ ) , ( ’
viernes ’ , ’ 5 ’ ) ]
5 True
6 E s te v a l o r no e s t a
7 [ ’ l u n e s ’ , ’ j u e v e s ’ , ’ m i e r c o l e s ’ , ’ m a rte s ’ , ’ v i e r n e s ’ ]
8 [ ’1 ’ , ’4 ’ , ’3 ’ , ’2 ’ , ’5 ’ ]
9 4
10 { ’ l u n e s ’ : ’ 1 ’ , ’ m i e r c o l e s ’ : ’ 3 ’ , ’ m a rte s ’ : ’ 2 ’ , ’ v i e r n e s ’ : ’ 5 ’ }
11 None
12 {}
13 >>>
El Algoritmo A.16, muestra el diccionario semana, el cual tiene sólo cuatro días. Como
podemos observar, al día lunes le corresponde la clave 1, a la clave martes le corresponde
el valor 2, etc. Esto permite obtener valores en una búsqueda, mucho más rápido en una
lista normal.
retorna el tamaño de la lista hasta antes de que se eliminara dicho item (ver línea 19 y
línea 9 de la salida). La función [Link](), elimina todos los item del diccionario,
dejando un diccionario vacío.
Atributo: Un atributo es una propiedad de cada objeto, por ejemplo el color, el tamaño,
la raza.
Método: Un método es una función o procedimiento que tiene cada objeto, por ejemplo
la función comer en los perros; si tuviéramos la clase Alumno, tendría un
procedimiento llamado calcularNota.
Herencia: Esta característica es una de las más importantes en POO, pues permite crear
subclases que “heredan” atributos y métodos a nuevas subclases, a las cuales
se les puede agregar nuevas características.
En Python una clase se crea con la palabra reservada class, con la siguiente forma:
class nombre_de_la_clase(Clase_Padre):
atributo 1
9 Este concepto de clase, se debe al profesor Julián Esteban Gutierrez de la Universidad del Quindío.
396 A.11. Programación orientada a objetos
atributo 2
atributo 3
.
.
.
Método 1
Método 2
Método 3
Método 4
.
.
.
El siguiente ejemplo muestra la implementación de dos clases, la clase punto y la clase
punto medio:
.:Algoritmo A.17
1 from math i m p o rt ∗
2
3 c l a s s Punto :
4 x =0.0
5 y =0.0
6
7 d e f __init__ ( s e l f , x0 , y0 ) :
8 s e l f . x=f l o a t ( x0 )
9 s e l f . y=f l o a t ( y0 )
10
11 d e f __str__ ( s e l f ) :
12 cadena=" ( "+ s t r ( s e l f . x ) + ’ , ’ + s t r ( s e l f . y ) + " ) "
13 r e t u r n cadena
14
15 def cuadrante ( s e l f ) :
16 i f s e l f . x>=0 and s e l f . y>=0:
17 return " I "
18 elif s e l f . x<=0 and s e l f . y>=0:
19 return " II "
20 elif s e l f . x<=0 and s e l f . y<=0:
21 return " I I I "
22 elif s e l f . x>=0 and s e l f . y<=0:
23 r e t u r n "IV"
24 else :
25 r e t u r n " In d e te rm i n a d o , r e v i s e l a s c o rd e n a d a s d e l punto "
26
27 d e f d i s t a n c i a ( s e l f , p2 ) :
28 r=s q r t ( ( p2 . x − s e l f . x ) ∗∗2 + ( p2 . y − s e l f . y ) ∗ ∗ 2 )
29 return r
30
31 d e f PuntoMedio ( s e l f , p2 ) :
A. Introducción a Python 397
32 x r =(p2 . x + s e l f . x ) / 2 . 0
33 y r =(p2 . y + s e l f . y ) / 2 . 0
34 r e t u r n ( xr , y r )
35
36
37
38 c l a s s PuntoMedio ( Punto ) :
39
40 d e f __init__ ( s e l f , p1 , p2 ) :
41 s e l f . x , s e l f . y = p1 . PuntoMedio ( p2 )
42
43
44
45 p1=Punto ( −3 , −6)
46 p2=Punto ( 5 , 7 )
47
48 p r i n t " El p ri m e r punto " , p1 , " Esta en e l c u a d r a n t e " , p1 . c u a d r a n t e ( )
49
50 p r i n t " El segundo punto " , p2 , " Esta en e l c u a d r a n t e " , p2 . c u a d r a n t e ( )
51
52 p r i n t "La d i s t a n c i a e n t r e p1 y p2 e s " , p1 . d i s t a n c i a ( p2 )
53
54 p3=PuntoMedio ( p1 , p2 )
55
56 p r i n t " El punto medio e s " , p3 , " que e s t a en e l c u a d r n a t e " , p3 .
cuadrante ()
1 >>>
2 El p ri m e r punto ( − 3 . 0 , − 6 . 0 ) Esta en e l c u a d r a n t e III
3 El segundo punto (5.0 ,7.0) Esta en e l c u a d r a n t e I
4 La d i s t a n c i a e n t r e p1 y p2 e s 15.2643375225
5 El punto medio e s ( 1 . 0 , 0 . 5 ) que e s t a en e l c u a d r n a t e I
6 >>>
El Algoritmo A.17, crea dos clases, la primera clase se inicia en la línea 3, y en las líneas
4 y 5 se crean dos atributos, que son dos variables de tipo real x y y que corresponden a
las coordenadas.
En la línea 7 se crea el método def __init__(self, x0,y0), este método tiene 3 parámetros,
el primero es self, que hace referencia a la clase en sí misma, x0 y y0 son los parámetros de
construcción, es decir las coordenadas iniciales del punto. Este método es conocido como
el constructor, el cual se ejecuta en el momento en que se crea el objeto. Esta función lo
398 A.11. Programación orientada a objetos
El método def __str__(self ): en la línea 11, nos permite implementar la impresión del
objeto, es decir, cuando imprimimos nuestro objeto con la instrucción print, en nuestro
caso, tomamos la variable cadena e imprimimos en ella las coordenadas del punto entre
paréntesis. cadena="("+ str(self.x) + ’,’ + str(self.y) + ")". Finalmente, se retorna dicha
variable cadena; esta variable es la que aparece cuando imprimimos un objeto de esta clase.
En la línea 31, se define el método PuntoMedio(self, p2), este recibe otro objeto del mismo
tipo, con el nuevo punto se calculan las coordenadas del punto medio, el cual se retorna
en una tupla.
La segunda clase, que está en la línea 38, implementa la clase PuntoMedio, la cual,
es heredada del la clase Punto, cuando declaramos la nueva clase escribimos class
PuntoMedio(Punto), el parámetro en el nombre de la clase es la clase padre. Al ser
PuntoMedio “hijo” de la clase Punto, hereda todas sus atributos y métodos, sólo que
en el método def __init__(self, p1,p2) , recibe como parámetros dos puntos, y con
estos, se calculan las nuevas coordenadas del punto medio. Finalmente, en las líneas 45
y 46 se crean dos objetos de tipo Punto: p1=Punto(-3,-6) y p2=Punto(5,7), con ellos
imprimimos sus coordenadas, sus cuadrantes y sobre todo, creamos el objeto p3, el cual
es de tipo PuntoMedio (línea 54) e imprimimos en que cuadrante esta.
“Mejor es el fin de un asunto que su comienzo; mejor es la
paciencia de espíritu que la altivez de espíritu.”
Eclesiastés 7: 8
La matriz A
5.3337e+02, 1.2217e+00, 9.9866e+00, 7.4055e+00, 1.0348e+00, 9.4815e+00, 1.3381e+00, 5.9059e+00,
2.6787e+00, 6.5635e+00, 3.0136e+00, 2.0218e-01, 3.8869e+00, 4.6438e+00, 7.7213e+00, 9.5082e+00,
2.7991e-01, 3.2537e+00, 2.8685e+00, 3.0649e+00, 8.1308e+00, 2.2563e+00, 1.1933e+00, 1.2126e+00,
8.6279e+00, 7.4192e+00, 1.0246e+00, 2.6924e+00, 5.8971e-01, 3.7989e+00, 8.2521e+00, 7.3946e+00,
5.3726e+00, 6.7438e+00, 6.9977e+00, 1.1485e+00, 8.1436e+00, 5.6497e+00, 4.2210e+00, 7.9502e+00,
7.6378e+00, 9.5064e+00, 2.9510e-01, 7.8217e+00, 5.0417e+00, 7.1064e+00, 6.4018e+00, 2.7274e+00,
3.3122e+00, 4.0626e+00, 9.6308e+00, 5.9688e+00, 2.1467e+00, 4.2461e+00, 8.8840e+00, 8.5333e+00,
4.4624e+00, 5.4204e+00, 6.0144e+00, 1.3248e+00, 5.1277e+00, 8.9558e+00, 6.3782e+00, 9.0739e+00,
6.7431e+00, 9.1566e+00, 9.2799e+00, 3.7359e+00, 8.3458e+00, 4.3977e-01, 4.6581e+00, 2.1294e+00,
3.0848e-01, 2.4772e+00, 5.6401e-01, 3.4921e+00, 4.1684e+00, 9.4537e+00, 9.9839e+00, 9.8218e+00,
6.0538e+00, 7.3704e+00, 8.5746e+00, 7.9014e+00, 5.3993e+00, 6.0975e+00, 7.1798e+00, 4.3838e+00,
9.5566e+00, 5.7614e+00, 6.3829e+00, 6.5769e+00, 1.1392e+00, 4.6730e+00, 5.3197e-01, 4.6627e+00,
7.3951e+00, 5.5511e+00, 7.4967e+00, 4.2316e+00
399
400
El vector b
3.9883e+00, 8.3918e+00, 7.3085e+00, 7.9395e+00, 6.9006e+00, 3.9995e+00, 2.3199e+00, 7.9788e+00,
9.1522e+00, 4.3516e+00, 4.9582e+00, 1.7959e-01, 5.6824e+00, 9.5615e-02, 8.7813e-01, 8.9330e+00,
1.9399e+00, 6.6889e+00, 4.5454e+00, 4.2547e+00, 5.9681e+00, 4.5071e+00, 1.4208e+00, 2.0792e+00,
5.4719e+00, 7.3070e-01, 7.3122e+00, 7.9204e+00, 4.3406e+00, 5.3251e+00, 1.7368e+00, 9.6574e+00,
8.8184e+00, 5.6251e+00, 8.6343e+00, 2.9901e-01, 8.5646e+00, 6.8159e+00, 7.1281e+00, 3.2268e+00,
6.8272e+00, 9.8007e+00, 9.2260e+00, 3.5654e+00, 3.2667e+00, 5.7109e+00, 9.4963e+00, 1.0304e+00,
8.3271e+00, 6.9781e+00, 3.6753e+00, 6.4877e+00, 2.5678e+00, 1.5513e+00, 8.1309e+00, 2.1603e+00,
2.5111e+00, 6.8004e+00, 8.8764e+00, 4.9282e+00, 1.7159e-01, 3.2296e+00, 2.0493e+00, 6.3628e+00,
9.1188e+00, 9.1875e+00, 3.6106e+00, 7.6349e+00, 3.9624e+00, 4.7984e+00, 5.2613e+00, 9.0690e+00,
8.4360e+00, 8.9805e+00, 5.9285e+00, 6.0135e+00, 7.0730e+00, 4.5674e+00, 6.7777e-01, 9.9249e+00,
2.3213e+00, 4.3524e+00, 7.7956e+00, 9.7492e+00, 7.1948e-01, 9.4016e+00, 3.8358e+00, 3.4170e-01,
5.0414e+00, 2.9079e-01, 2.0012e+00, 6.7348e+00, 4.5013e-01, 5.0262e+00, 3.3813e+00, 1.5413e+00,
8.0818e+00, 1.9462e+00, 7.0508e+00, 2.2783e+00
El vector solución x
1.8421e-03, 1.0913e-02, 9.2353e-03, 1.1225e-02, 7.9705e-03, 2.9558e-03, 1.4763e-04, 1.1339e-02, 1.5070e-02,
4.0788e-03, 4.9883e-03, -4.8756e-03, 7.1773e-03, -5.7848e-03, -3.8065e-03, 1.4082e-02, -1.3384e-03, 8.5507e-
03, 3.0508e-03, 3.3224e-03, 7.4889e-03, 5.1686e-03 -2.2844e-03, -1.1785e-03, 5.0829e-03, -4.3071e-03,
9.5409e-03, 1.1260e-02, 3.9320e-03, 4.9269e-03, -1.8973e-03, 1.3230e-02, 1.2536e-02, 7.0799e-03 1.2103e-
02, -4.7731e-03, 9.6019e-03, 9.2571e-03, 1.0643e-02, 1.0339e-03, 9.1834e-03, 1.4453e-02, 1.2401e-02,
1.0355e-03, 1.2090e-03, 5.4473e-03 1.4326e-02, -2.5990e-03, 1.4620e-02, 7.6018e-03, 1.6223e-03, 8.3686e-
03, 3.7217e-04, -2.1186e-03, 1.2077e-02, -5.1583e-04, -2.6419e-04, 7.0966e-03, 1.3396e-02, 4.8172e-03, -
5.7489e-03, 1.6665e-03, -7.6401e-04, 7.5880e-03, 1.4438e-02, 1.3142e-02, 2.1616e-03, 1.0299e-02, 3.8299e-
03, 3.9461e-03, 4.6347e-03, 1.1911e-02, 1.2606e-02, 1.2199e-02, 6.1183e-03, 6.5915e-03, 8.3796e-03, 4.1362e-
03, -4.0602e-03, 1.5682e-02, 4.9327e-04, 2.9932e-03, 1.0990e-02, 1.5433e-02, -3.6687e-03, 1.2520e-02,
3.7853e-03, -4.0243e-03, 4.2688e-03, -4.7906e-03, -1.4052e-03, 8.0160e-03, -3.9345e-03, 5.5113e-03, 1.9564e-
03 -2.6441e-03 1.0916e-02, -1.2655e-03, 9.3117e-03, -1.3498e-03
Índice alfabético
427
428 ÍNDICE ALFABÉTICO
V
Vector - Definición de, 211
Vector proyección, 225
Vector proyector en R3 , 239
Vector unitario, 221
Vector unitario en Rn , 235
vectores en R2 , 209
Vectores en Rn , 230
vectores fila y columna, 16
Vectores ortogonales, 224
Vectores y Espacios vectoriale, 209
Vectores y valores propios, 329
Ventajas de usar Python, 368
W
Windows, 367