Minicurso de Python para Matemática Material disponível para compra: e-book livro . Consulte outras formas de colaboração aqui !
4.2 Elementos da álgebra linear
O numpy conta com um módulo de álgebra linear , usualmente importado com
1 import numpy . linalg as npla
4.2.1 Vetores
Um vetor podem ser alocado usando um numpy.array de um eixo (dimensão) . Por exemplo,
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 )
E. 4.2.1.
Aloque cada um dos seguintes vetores como um numpy.array :
a)
c)
Resposta
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 Produto escalar e norma
Dados dois vetores
x = ( x 0 , x 1 , … , x n − 1 ) ,
(4.14)
y = ( y 0 , y 1 , … , y n − 1 ) ,
(4.15)
define-se o produto escalar por
x ⋅ y = x 0 y 0 + x 1 y 1 + ⋯ + x n − 1 y n − 1 .
(4.16)
Com o NumPy , podemos computá-lo com a função hlnumpy.dot . Por exemplo,
1 x = np . array ([-1, 0, 2])
2 y = np . array ([0, 1, 1])
3 d = np . dot ( x , y )
4 print ( d )
A norma l 2 de um vetor é definida por
O NumPy conta com o método numpy.linalg.norm para computá-la. Por exemplo,
1 nrm = npla . norm ( y )
2 print ( nrm )
E. 4.2.2.
Faça um código para computar o produto escalar x ⋅ y sendo
x = ( 1.2 , ln ( 2 ) ,4 ) ,
(4.18)
y = ( π 2 , 3 , e )
(4.19)
Resposta
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 Matrizes
Uma matriz pode ser alocada como um numpy.array de dois eixos (dimensões) . Por exemplo, as matrizes
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 já vimos, o NumPy conta com operadores elemento-a-elemento que podem ser utilizados na álgebra envolvendo arrays , logo também aplicáveis a matrizes (consulte a Subseção 4.1.3 ). Na sequência, vamos introduzir outras operações próprias deste tipo de objeto.
E. 4.2.3.
Aloque cada uma das seguintes matrizes como um numpy.array :
a)
b)
Resposta
1 import numpy as np
2
3 A = np . array ([[-1, 2],
4 [2, -4],
5 [6, 0]])
6
7 B = A . transpose ()
E. 4.2.4.
1 A = np . array ([[2,1],[1,1],[-3,-2]])
Determine o formato (shape ) dos seguintes arrays :
a)
b)
c)
d)
e)
Resposta
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 Inicialização de matrizes
Além das inicializações de arrays já estudadas na Subseção 4.1.1 , temos mais algumas que são particularmente úteis no caso de matrizes.
•
numpy.eye (n) : retorna a matriz identidade 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]]
E. 4.2.5.
Aloque a matriz dos coeficientes e o vetor dos termos constantes do seguinte sistema de equações
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)
onde f i = π 2 sin ( π x i ) , x i = ( i − 1 ) h , h = 1 / ( n − 1 ) , n=5.
Resposta
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 Multiplicação de matrizes
A multiplicação da matriz A = [ a i j ] i , j = 0 n − 1 , l − 1 pela matriz B = [ b i j ] i , j = 0 l − 1 , m − 1 é a 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)
O numpy tem a função numpy.matmul para computar a multiplicação de matrizes . Por exemplo, a multiplicação das matrizes dadas em (4.20 ) e (4.21 ), computamos
1 C = np . matmul ( A , B )
2 print ( C )
Observação 4.2.1.(matmul , * , @ )
É importante notar que numpy.matmul (A,B) é a multiplicação de matrizes, enquanto que * consiste na multiplicação elemento a elemento. Alternativamente a numpy.matmul (A,B) pode-se usar A @ B .
E. 4.2.6.
Aloque as matrizes
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)
Então, se existirem, compute e forneça as dimensões das seguintes matrizes
a)
b)
c)
d)
Resposta
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 ( "b) nã o existe D'E" )
12 print ( "c) D'C = \n" , C . T@C )
13 print ( "d) DE = \n" , D@E )
4.2.6 Traço e determinante de uma matriz
O numpy tem a função numpy.ndarray.trace para computar o traço de uma matriz (soma dos elementos de sua diagonal). Por exemplo,
1 A = np . array ([[-1,2,0],[2,3,1],[1,2,-3]])
2 print ( 'tr(A) = ' , A . trace ())
Já, o determinante é fornecido no módulo numpy.linalg . Por exemplo,
1 A = np . array ([[-1,2,0],[2,3,1],[1,2,-3]])
2 print ( 'det(A) = ' , npla . det ( A ))
det ( A ) = 25.000000000000007
E. 4.2.7.
Compute a solução do seguinte sistema de equações
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)
pelo método de Cramer.
Resposta
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 Posto e inversa de uma matriz
O posto (rank ) de uma matriz é o número de linhas ou colunas linearmente independentes. O numpy conta com a função numpy.linalg.matrix_rank para computá-lo. Por exemplo,
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 )
O método numpy.linalg.inv pode ser usado para computar a inversa de uma matriz full rank . Por exemplo,
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]]
E. 4.2.8.
Compute, se possível, a matriz inversa de cada uma das seguintes matrizes
B = [ 2 − 1 − 2 1 ]
(4.33)
C = [ − 2 0 1 3 1 − 1 2 1 0 ]
(4.34)
Verifique suas respostas.
Resposta
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 nã o invertí vel.' )
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 e autovetores de uma Matriz
Um auto-par ( λ , v ) de uma matriz A , λ um escalar chamado de autovalor e v ≠ 0 é um vetor chamado de autovetor , é tal que
O numpy tem a função numpy.linalg.eig para computar os auto-pares de uma matriz. Por exemplo,
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 a função retorna um tuple de numpy.arrays , sendo que o primeiro contém os autovalores (repetidos conforme suas multiplicidades) e o segundo item é a matriz dos autovetores (dispostos nas colunas).
E. 4.2.9.
Compute os auto-pares da matriz
Então, verifique se, de fato, A v = λ v para cada auto-par ( λ , v ) computado.
Resposta
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)
Envie seu comentárioAproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional . Ícones e elementos gráficos podem estar sujeitos a condições adicionais.