Minicurso de Python para Matemáticas Ayuda a mantener el sitio libre, gratuito y sin publicidad. ¡Colabora!
4.2 Elementos del álgebra lineal
El numpy cuenta con un módulo de álgebra lineal , usualmente importado con
1 import numpy . linalg as npla
4.2.1 Vectores
Un vector puede asignarse usando un numpy.array de un eje (dimensión) . Por ejemplo,
x = ( 2 , − 1 ) ,
(4.12)
y = ( 3,1 , π )
(4.13)
podem ser alocados com
1 x = np . array ([2,-1])
2 print ( x )
1 y = np . array ([3, 1, np . pi ])
2 print ( y )
Ejercicio 4.2.1.1.
Asigne cada uno de los siguientes vectores como un numpy.array :
a)
c)
Respuesta
1 import numpy as np
2
3 x = np . array ([1.2, -3.1, 4])
4 print ( 'x = ' , x )
5
6 z = np . array ([ np . pi , np . sqrt (2.), np . exp (-2)])
7 print ( 'z = ' , z )
4.2.2 Producto escalar y norma
Dados dos vectores
x = ( x 0 , x 1 , … , x n − 1 ) ,
(4.14)
y = ( y 0 , y 1 , … , y n − 1 ) ,
(4.15)
define-se el producto escalar por
x ⋅ y = x 0 y 0 + x 1 y 1 + ⋯ + x n − 1 y n − 1 .
(4.16)
Con el NumPy , podemos calcularlo con la función numpy.dot . Por ejemplo,
1 x = np . array ([-1, 0, 2])
2 y = np . array ([0, 1, 1])
3 d = np . dot ( x , y )
4 print ( d )
La norma l 2 de un vector se define por
El NumPy cuenta con el método numpy.linalg.norm para calcularla. Por ejemplo,
1 nrm = npla . norm ( y )
2 print ( nrm )
Ejercicio 4.2.2.1.
Haga un código para calcular el producto escalar x ⋅ y siendo
x = ( 1.2 , ln ( 2 ) ,4 ) ,
(4.18)
y = ( π 2 , 3 , e )
(4.19)
Respuesta
1 import numpy as np
2 x = np . array ([1.2, np . log (2), 4])
3 y = np . array ([ np . pi **2, np . sqrt (3), np . e ])
4 d = np . dot ( x , y )
4.2.3 Matrices
Una matriz puede asignarse como un numpy.array de dos ejes (dimensiones) . Por ejemplo, las matrices
A = [ 2 − 1 7 3 1 0 ] ,
(4.20)
B = [ 4 0 2 1 − 8 6 ]
(4.21)
podem ser alocadas como segue
1 A = np . array ([[2,-1,7],
2 [3,1,0]])
3 print ( A )
1 B = np . array ([[4,0],
2 [2,1],
3 [-8,6]])
4 print ( B )
Como ya hemos visto, el NumPy cuenta con operadores elemento-a-elemento que pueden utilizarse en el álgebra involucrando arrays , luego también aplicables a matrices (consulte la Subsección 4.1.3 ). A continuación, vamos a introducir otras operaciones propias de este tipo de objeto.
Ejercicio 4.2.3.1.
Asigne cada una de las siguientes matrices como un numpy.array :
a)
b)
Respuesta
1 import numpy as np
2 A = np . array ([[-1, 2],
3 [2, -4],
4 [6, 0]])
5
6 B = A . transpose ()
Ejercicio 4.2.3.2.
1 A = np . array ([[2,1],[1,1],[-3,-2]])
Determine el formato (shape ) de los siguientes arrays :
a)
b)
c)
d)
e)
Respuesta
1 import numpy as np
2
3 A = np . array ([[2, 1],
4 [1, 1],
5 [-3, -2]])
6 print ( 'a)' , A [:,0]. shape )
7 print ( 'b)' , A [:,0:1]. shape )
8 print ( 'c)' , A [1:3,0]. shape )
9 print ( 'd)' , A [1:3,0:1]. shape )
10 print ( 'e)' , A [1:3,0:2]. shape )
4.2.4 Inicialización de matrices
Además de las inicializaciones de arrays ya estudiadas en la Subsección 4.1.1 , tenemos algunas más que son particularmente útiles en el caso de matrices.
numpy.eye (n) : retorna la matriz identidad n × n .
[[1. 0. 0.],
[0. 1. 0.],
[0. 0. 1.]]
1 D = np . diag ([1,2,3])
2 print ( D )
[[1, 0, 0],
[0, 2, 0],
[0, 0, 3]]
Ejercicio 4.2.4.1.
Asigne la matriz de los coeficientes y el vector de los términos constantes del siguiente sistema de ecuaciones
x 1 = 0
(4.23)
− x i − 1 + 2 x i − x i + 1 = h 2 f i
(4.24)
x n = 0
(4.25)
donde f i = π 2 sin ( π x i ) , x i = ( i − 1 ) h , h = 1 / ( n − 1 ) , n=5.
Respuesta
1 import numpy as np
2 n = 5
3 h = 1./( n -1)
4 x = np . linspace (0., 1., n )
5 b = np . pi **2* np . sin ( np . pi * x )
6 A = np . diag (2* np . ones ( n )) + \
7 np . diag (- np . ones ( n -1), k =-1) + \
8 np . diag (- np . ones ( n -1), k =1)
9 A [0,0] = 1.
10 A [0,1] = 0.
11 A [ n -1, n -2] = 0.
12 A [ n -1, n -1] = 1.
13 print ( 'A = \n' , A )
14 print ( 'b = \n' , b )
4.2.5 Multiplicación de matrices
La multiplicación de la matriz A = [ a i j ] i , j = 0 n − 1 , l − 1 por la matriz B = [ b i j ] i , j = 0 l − 1 , m − 1 es la matriz C = A B = [ c i j ] i , j = 0 n − 1 , m − 1 tal que
c i j = ∑ k = 0 l − 1 a i k b k , j
(4.26)
El numpy tiene la función numpy.matmul para calcular la multiplicación de matrices . Por ejemplo, la multiplicación de las matrices dadas en (4.20 ) y (4.21 ), calculamos
1 C = np . matmul ( A , B )
2 print ( C )
Observación 4.2.5.1.(matmul , * , @ )
Es importante notar que numpy.matmul (A,B) es la multiplicación de matrices, mientras que * consiste en la multiplicación elemento a elemento. Alternativamente a numpy.matmul (A,B) puede-se usar A @ B .
Ejercicio 4.2.5.1.
Asigne las matrices
C = [ 1 2 − 1 3 2 1 0 − 2 − 3 ]
(4.27)
D = [ 2 3 1 − 1 6 4 ]
(4.28)
E = [ 1 2 1 0 − 1 3 ]
(4.29)
Entonces, si existen, calcule y proporcione las dimensiones de las siguientes matrices
a)
b)
c)
d)
Respuesta
1 import numpy as np
2 C = np . array ([[1, 2, -1],
3 [3, 2, 1],
4 [0, -2, -3]])
5 D = np . array ([[2, 3],
6 [1, -1],
7 [6, 4]])
8 E = np . array ([[1, 2, 1],
9 [0, -1, 3]])
10 print ( 'a) CD = \n' , C@D )
11 print ( "no existe D'E" )
12 print ( "c) D'C = \n" , C . T@C )
13 print ( "d) DE = \n" , D@E )
4.2.6 Traza y determinante de una matriz
El numpy tiene la función numpy.ndarray.trace para calcular la traza de una matriz (suma de los elementos de su diagonal). Por ejemplo,
1 A = np . array ([[-1,2,0],[2,3,1],[1,2,-3]])
2 print ( 'tr(A) = ' , A . trace ())
Ya, el determinante es proporcionado en el módulo numpy.linalg . Por ejemplo,
1 A = np . array ([[-1,2,0],[2,3,1],[1,2,-3]])
2 print ( 'det(A) = ' , npla . det ( A ))
det ( A ) = 25.000000000000007
Ejercicio 4.2.6.1.
Calcule la solución del siguiente sistema de ecuaciones
x 1 − x 2 + x 3 = − 2
(4.30)
2 x 1 + 2 x 2 + x 3 = 5
(4.31)
− x 1 − x 2 + 2 x 3 = − 5
(4.32)
por el método de Cramer.
Respuesta
1 import numpy as np
2 import numpy . linalg as npla
3
4 A = np . array ([[1, -1, 1],
5 [2, 2, 1],
6 [-1, -1, 2]])
7
8 b = np . array ([-2, 5, -5])
9
10 A1 = A . copy ()
11 A1 [:,0] = b
12
13 x1 = npla . det ( A1 )/ npla . det ( A )
14 print ( 'x1 = ' , x1 )
15
16 A2 = A . copy ()
17 A2 [:,1] = b
18
19 x2 = npla . det ( A2 )/ npla . det ( A )
20 print ( 'x2 = ' , x2 )
21
22 A3 = A . copy ()
23 A3 [:,2] = b
24
25 x3 = npla . det ( A3 )/ npla . det ( A )
26 print ( 'x3 = ' , x3 )
4.2.7 Rango e inversa de una matriz
El rango (rank ) de una matriz es el número de filas o columnas linealmente independientes. El numpy cuenta con la función numpy.linalg.matrix_rank para calcularla. Por ejemplo,
1 npla . matrix_rank ( np . eye (3))
1 A = np . array ([[1,2,3],[-1,1,-1],[0,3,2]])
2 npla . matrix_rank ( A )
El método numpy.linalg.inv puede usarse para calcular la inversa de una matriz full rank . Por ejemplo,
1 A = np . array ([[1, 2, 3],
2 [-1, 1, -1],
3 [1, 3, 2]])
4 Ainv = np . linalg . inv ( A )
5 print ( 'Ainv @ A = \n' , Ainv @ A )
Ainv @ A =
[[ 1.00000000 e +00 -2.22044605 e -16 -8.88178420 e -16]
[ 0.00000000 e +00 1.00000000 e +00 0.00000000 e +00]
[ 0.00000000 e +00 -2.22044605 e -16 1.00000000 e +00]]
Ejercicio 4.2.7.1.
Calcule, si es posible, la matriz inversa de cada una de las siguientes matrices
B = [ 2 − 1 − 2 1 ]
(4.33)
C = [ − 2 0 1 3 1 − 1 2 1 0 ]
(4.34)
Verifique sus respuestas.
Respuesta
1 import numpy as np
2 import numpy . linalg as npla
3
4 def inv ( A ):
5 if ( npla . matrix_rank ( A ) == A . shape [1]):
6 return npla . inv ( A )
7 else :
8 print ( 'Matriz no invertible.' )
9 return None
10
11 B = np . array ([[2, -1],
12 [-2, 1]])
13 print ( 'inv(B) = \n' , inv ( B ))
14
15 A = np . array ([[-2, 0, 1],
16 [3, 1, -1],
17 [2, 1, 0]])
18 print ( 'inv(A) = \n' , inv ( A ))
4.2.8 Autovalores y autovectores de una Matriz
Un auto-par ( λ , v ) de una matriz A , λ un escalar llamado autovalor y v ≠ 0 es un vector llamado autovector , es tal que
El numpy tiene la función numpy.linalg.eig para calcular los auto-pares de una matriz. Por ejemplo,
1 lmbda , v = npla . eig ( np . eye (3))
2 print ( 'autovalores = \n' , lmbda )
3 print ( 'autovetores = \n' , v )
autovalores =
[1. 1. 1.]
autovetores =
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
Observamos que la función retorna un tuple de numpy.arrays , siendo que el primero contiene los autovalores (repetidos conforme sus multiplicidades) y el segundo ítem es la matriz de los autovectores (dispuestos en las columnas).
Ejercicio 4.2.8.1.
Calcule los auto-pares de la matriz
Entonces, verifique si, de hecho, A v = λ v para cada auto-par ( λ , v ) calculado.
Respuesta
1 import numpy as np
2 import numpy . linalg as npla
3 A = np . array ([[1, 3, 2],
4 [3, 2, -1],
5 [2, -1, 1]])
6 lmbda , v = np . linalg . eig ( A )
7
8 print ( npla . norm ( A @ v [:, 0] - lmbda [0] * v [:, 0]) < 1 e -10)
9 print ( npla . norm ( A @ v [:, 1] - lmbda [1] * v [:, 1]) < 1 e -10)
10 print ( npla . norm ( A @ v [:, 2] - lmbda [2] * v [:, 2]) < 1 e -10)
Envía tu comentarioAprovecho para agradecer a todas/os que de forma asidua o esporádica contribuyen enviando correcciones, sugerencias y críticas.
Este texto se publica bajo los términos de la Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional . Los íconos y elementos gráficos pueden estar sujetos a condiciones adicionales.