Você está na página 1de 28

5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Àlgebra Linear com Python: uma breve


introdução
Autor: Ronisson Lucas Calmon da Conceição

Introdução

Este notebook objetiva demonstrar a resolução de problemas comuns da Álgebra Linear utilizando NumPy e
SymPy.

Primeiro iremos importar as bibliotecas que iremos utilizar no decorrer deste notebook:

In [1]:

import numpy as np
import sympy
from sympy.matrices import zeros,eye,ones

Definição

Da Álgebra linear sabemos que uma matriz A sobre um corpo K ou, simplesmente, uma matriz A (quando K
estiver subentendido) é uma tabela retangular de escalares, costumeiramente representada no formato que
segue:

[ ]
a 11 … a 1n
a 21 … a 2n
A=
⋮ ⋱ ⋮
a m1 … a mn

Dizemos que uma matriz com m linhas e n colunas é uma matriz m × n . O par de números m e n é dito o
tamanho da matriz.

Tipos especiais de matrizes

Consideremos uma matriz com m linhas e n colunas que denotaremos por A m × n. Apresentaremos
brevemente algumas matrizes importantes em Álgebra Linear. Utilizaremos o construtor Matrix() da
biblioteca SymPy para definir as matrizes.

1. Matriz Quadrada: matriz em que o número de linhas é igual ao número de colunas (m = n).

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 1/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [2]:

A = sympy.Matrix(2,2,[-1, 2, 4, 5])
A

Out[2]:

[ ] −1
4
2
5

1. Matriz Nula: matriz em que todos os elementos são nulos, ou seja, a ij = 0 para todo i e j.

In [3]:

B = sympy.zeros(2,3)
B

Out[3]:

[ 0
0
0
0
0
0 ]
1. Matriz-Coluna:matriz que possui uma única coluna (A m × 1).

In [4]:

C = sympy.Matrix(4,1, [-1, 2, 10, 5])


C

Out[4]:

[]
−1
2
10
5

1. Matriz-Linha: matriz com uma única linha (A 1 × n)

In [5]:

x,y,z = sympy.symbols(['x','y','z']) #transform string em símbolos

In [6]:

D = sympy.Matrix(1,3, [x,y,z])
D

Out[6]:

[x y z]

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 2/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

1. Matriz diagonal: matriz quadrada em que qualquer elemento fora da diagonal principal é nulo, isto é,
a ij = 0 para i ≠ j.

Assim, dizemos que uma matriz quadrada S = [s ij] é diagonal se todos os seus elementos fora da diagonal
principal forem nulos. Às vezes, denotamos uma tal matriz por S = diag s 11, s 22, . . . , s nn onde alguns s ii, ou
todos, podem ser nulos.

In [7]:

E = sympy.diag(1, -2, -7, 4)


E

Out[7]:

[ ]
1 0 0 0
0 −2 0 0
0 0 −7 0
0 0 0 4

1. Matriz identidade: matriz em que a ij = 1 , ∀i = j e a ij = 0, ∀i ≠ j. Assim, a matriz identidade, ou matriz


unitária, de ordem n, denotada por I n ou, simplesmente, por I, é a matriz quadrada com 1 na diagonal
principal e 0 em todas as demais entradas. A matriz identidade I é análoga ao escalar 1, pois, dada
qualquer matriz A m × n, temos que AI = IA = A. Para uma matriz B n × 1, verifica-se IB = B

In [8]:

I = sympy.eye(4)
I

Out[8]:

[ ]
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

1. Matriz triangular superior: matriz quadrada em que todos os elementos abaixo da diagonal principal são
nulos, ou seja, a ij = 0 se i > j.

In [9]:

D = sympy.Matrix(np.triu([2,-1,4],k=0))
D

Out[9]:

[ ]
2 −1 4
0 −1 4
0 0 4

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 3/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

1. Matriz triangular inferior: matriz quadrada em que todos os elementos acima da diagonal principal são
nulos, ou seja, a ij = 0, ∀i < j.

In [10]:

F = sympy.Matrix(np.tril([[2,1,1],[1,-1,1], [1,1,2]]))
F

Out[10]:

[ ]
2 0 0
1 −1 0
1 1 2

1. Matriz simétrica: matriz quadrada em que a ij = a ji para quaisquer i, j e A T = A.

In [11]:

G = sympy.Matrix(3, 3, [4, 3, -1, 3, 2, 0, -1, 0, 5])


G

Out[11]:

[ ]
4 3 −1
3 2 0
−1 0 5

1. Matriz Idempotente: matriz quadrada em que A ⋅ A = A .

In [12]:

H = sympy.Matrix(2, 2, [5, -5, 4, -4])


H

Out[12]:

[ ] 5
4
−5
−4

In [13]:

H*H

Out[13]:

[ ] 5
4
−5
−4

1. Matriz Ortogonal: toda matriz em que A − 1 = A T.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 4/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Operações com matrizes

Adição e multiplicação por escalar

Sejam A = a ij e B = b ij duas matrizes de mesmo tamanho, digamos, m × n . A soma de A e B, denotada


por A + B, é a matriz obtida pela soma de elementos correspondentes de A e B, ou seja

[ ]
a 11 + b 11 … a 1n + b 1n
a 21 + b 21 … a 2n + b 2n
A+B=
⋮ ⋱ ⋮
a m1 + b m1 … a mn + b mn

O múltiplo da matriz A pelo escalar k, denotado por simplesmente kA, é a matriz obtida pelo produto de cada
elemento de A por k, ou seja,

[ ]
ka 11 … ka 1n
ka 21 … ka 2n
kA =
⋮ ⋱ ⋮
ka m1 … ka mn

Vejamos uma implementação da soma de duas matrizes utilizando o NumPy.

Seja A =
[ 1
4
2 3
5 6 ] [ 2
eB= 1
4
3
6
5 ] iremos encontrar a matriz C, dada por A + B. Iremos simplesmente

definir A e B e posteriormente usar o operador + .

In [14]:

A = np.array([[1,2,3], [4,5,6]])
B = np.array([[2,4,6],[1,3,5]])
C = A+B

In [15]:

Out[15]:

array([[ 3, 6, 9],
[ 5, 8, 11]])

Encontrada a matriz C, iremos encontrar a matriz D, dada por kC, onde k = -2.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 5/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [16]:

C = np.array ([[3,6,9], [5,8,11]])


k = -2
D = k*C

In [17]:

Out[17]:

array([[ -6, -12, -18],


[-10, -16, -22]])

Poderíamos resolver este mesmo problema usando a função np.dot() - utilizada para efetuar o produto
matricial:

In [18]:

D = np.dot(k,C)

In [19]:

Out[19]:

array([[ -6, -12, -18],


[-10, -16, -22]])

Propriedades da soma de matrizes


Considerando as matrizes A,B e C de mesma ordem mxn temos que:

1. A + B = B + A (comutatividade)
2. A + (B + C) = (A + B) + C (associatividade)
3. A + 0 = A

Iremos demonstrar a validade de tais propriedades usando funções de Álgebra Linear do SymPy.Para tanto,
definiremos três matrizes quadradas genéricas de ordem 2.

In [20]:

a11, a12, a21, a22 = sympy.symbols('a_11, a_12, a_21, a_22')


b11, b12, b21, b22 = sympy.symbols('b_11, b_12, b_21, b_22')
c11, c12, c21, c22 = sympy.symbols('c_11, c_12, c_21, c_22')
A = sympy.Matrix(2, 2, [a11, a12, a21, a22])
B = sympy.Matrix(2, 2, [b11, b12, b21, b22])
C = sympy.Matrix(2, 2, [c11, c12, c21, c22])

Vejamos as matrizes definidas:

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 6/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [21]:

Out[21]:

[ a 11
a 21
a 12
a 22 ]
In [22]:

Out[22]:

[ b 11
b 21
b 12
b 22 ]
In [23]:

Out[23]:

[ c 11
c 21
c 12
c 22 ]
Da propriedade 1 temos que:

In [24]:

A+B

Out[24]:

[ a 11 + b 11
a 21 + b 21
a 12 + b 12
a 22 + b 22 ]
In [25]:

B+A

Out[25]:

[ a 11 + b 11
a 21 + b 21
a 12 + b 12
a 22 + b 22 ]
Então:

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 7/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [26]:

(A+B) == (B+A)

Out[26]:

True

Da propriedade 2 temos que:

In [27]:

A+(B+C)

Out[27]:

[ a 11 + b 11 + c 11
a 21 + b 21 + c 21
a 12 + b 12 + c 12
a 22 + b 22 + c 22 ]
In [28]:

(A+B)+C

Out[28]:

[ a 11 + b 11 + c 11
a 21 + b 21 + c 21
a 12 + b 12 + c 12
a 22 + b 22 + c 22 ]
In [29]:

A+(B+C) == (A+B)+C

Out[29]:

True

Por fim, precisaremos criar uma matriz nula para verificar a última propriedade.

In [30]:

from sympy.matrices import zeros

In [31]:

zero = zeros(2,2)

In [32]:

zero

Out[32]:

[ ] 0
0
0
0

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 8/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Desta forma, podemos verificar que:

In [33]:

A+zero == A

Out[33]:

True

Propriedades da multiplicação por escalar


Sejam as matrizes A e B de mesma ordem e as constantes reais k, k 1, k 2, temos que:

1. k(A + B) = kA + kB
2. (k 1 + k 2)A = k 1A + k 2A
3. kA = 0, em que k=0

Voltando para as matrizes... Observe que ambas, A + B e kA, são matrizes m × n . Podemos definir –A =
(–1)A e A − B = A + (–B). Dizemos que –A é a matriz simétrica de A e que A − B é a matriz diferença de
A e B. Não se define a soma de matrizes de tamanhos distintos.

Seja A =
[ 1
4
2 3
5 6 ] encontremos a matriz simétrica de A. Definiremos a matriz A e seguidamente

obteremos sua matriz simétrica.

In [34]:

A = np.array([[1,2,3],[4,5, 6]])

In [35]:

-A

Out[35]:

array([[-1, -2, -3],


[-4, -5, -6]])

Poderíamos também ter obtido a matriz simétrica de A como segue.

In [36]:

k=-1
A_simetrica = np.dot(k,A)

In [37]:

A_simetrica

Out[37]:

array([[-1, -2, -3],


[-4, -5, -6]])

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 9/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Vamos recuperar a matriz B definida anteriormente e calcular A − B.

In [38]:

B = np.array([[2,4,6],[1,3,5]])

In [39]:

A-B

Out[39]:

array([[-1, -2, -3],


[ 3, 2, 1]])

[ ] [ ]
1 2 3 11 0 0
Dadas as matrizes H = 4 −2 −9 eG= 41 − 21 0 encontraremos a matriz J dada por J = H+G.
0 − 12 − 29 0 −1 −2

Utilizando NumPy obtemos o seguinte resultado:

In [40]:

H = np.array([[1, 2, 3], [4, -2, -9], [0, -12, -29]])


G = np.array([[11, 0, 0], [41, -21, 0], [0, -1, -2]])
J = H+G

In [41]:

Out[41]:

array([[ 12, 2, 3],


[ 45, -23, -9],
[ 0, -13, -31]])

Podemos resolver o mesmo problema com SymPy. Usaremos a função Matrix para construir as matrizes H e
G. Informaremos a ordem das respectivas matrizes e passaremos uma lista contendo seus elementos.

In [42]:

H = sympy.Matrix(3, 3, [1, 2, 3, 4, -2, -9, 0, -12, -29])


G = sympy.Matrix(3, 3, [11, 0, 0, 41, -21, 0, 0, -1, -2])
J = G+H

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 10/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [43]:

Out[43]:

[ ]
12 2 3
45 − 23 −9
0 − 13 − 31

Transposta de uma matriz

A transposta de uma matriz A, denotada por A T ou A ′ , é a matriz obtida escrevendo as colunas de A, na


mesma ordem, como linhas.

Propriedades

1. Uma matriz é simétrica se, e somente se ela é igual à sua transposta, ou seja, A = A ′ .
2. A ″ = A.
3. (A + B) ′ = A ′ + B ′ .
4. (kA) ′ = kA ′ , em que k é um escalar.

[ ]
2 0

Seja, I =
−4
5
6
11
T
− 2 então I =
0
[ 2
0
−4
11
5
−2
6
]
0 . Em linhas gerais, a linha de uma matriz passa a ser

coluna e a coluna se torna linha.

[ ]
−1 0 0
−4 11 1
T
Dada a matriz K = 5 −2 − 9 , encontremos sua matriz transposta K utilizando o NumPy.
6 0 7

In [44]:

K = np.array([[-1, 0, 0], [-4, 11, 1], [5, -2, -9], [6, 0, 7]])

In [45]:

Out[45]:

array([[-1, 0, 0],
[-4, 11, 1],
[ 5, -2, -9],
[ 6, 0, 7]])

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 11/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Assim, a transposta de K é obtida como segue:

In [46]:

np.transpose(K)

Out[46]:

array([[-1, -4, 5, 6],


[ 0, 11, -2, 0],
[ 0, 1, -9, 7]])

Ou

In [47]:

K.T

Out[47]:

array([[-1, -4, 5, 6],


[ 0, 11, -2, 0],
[ 0, 1, -9, 7]])

[ ]
0 1 0
−4 11 1
Dada a matriz L = 5 −2 −9 encontremos L + L T utilizando NumPy.
6 0 7
36 10 57

In [48]:

L = np.array([[0, 1, 0], [-4, 11, 1], [5, -2, -9], [6, 0, 7], [36, 10, 57]])
L

Out[48]:

array([[ 0, 1, 0],
[-4, 11, 1],
[ 5, -2, -9],
[ 6, 0, 7],
[36, 10, 57]])

In [49]:

np.transpose(L)

Out[49]:

array([[ 0, -4, 5, 6, 36],


[ 1, 11, -2, 0, 10],
[ 0, 1, -9, 7, 57]])

Neste caso, não poderemos obter L + L T, pois L T não apresenta a mesma ordem de L.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 12/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [50]:

np.transpose(L).shape, np.shape(L)

Out[50]:

((3, 5), (5, 3))

Multiplicação de matrizes

O produto das matrizes A e B é denotado por AB. Particularmente, iremos começar com um caso especial. O
produto AB de uma matriz linha A = [a i] e uma matriz coluna B = [b j] com o mesmo número de elementos
é definido como o escalar (ou a matriz ) obtido pela soma dos produtos das entradas correspondentes, ou

[]
b1
b2
[
seja, AB= a 1, a 2, ..., an ] ...
= a 1b 1+a 2b 2 + ... + a nb n.

bn

Enfatizamos que, nesse caso, AB é um escalar (ou, então, uma matriz 1 × 1). Não definimos o produto AB se
a matriz linha A e a matriz coluna B possuírem um número distinto de elementos. Esta definição é
particularmente importante para definição de um problema de regressão linear múltipla.

[]
3
Dadas as matrizes M = [ 7, − 4, 5] e N = 2 encontremos a matriz O = M ⋅ N.
−1

In [51]:

M = np.array([[7, -4, 5]])


N = np.array([[3],[2],[-1]])

In [52]:

Out[52]:

array([[ 7, -4, 5]])

In [53]:

Out[53]:

array([[ 3],
[ 2],
[-1]])

Para realizar a multiplicação das matrizes é necessário encontrar o número de linhas e colunas da matriz.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 13/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [54]:

M.shape
Out[54]:

(1, 3)

Acima vemos que nossa matriz M possui uma linha e três colunas.

In [55]:

N.shape

Out[55]:

(3, 1)

Acima vemos que nossa matriz N possui três linhas e uma coluna. Assim, para efetuar o produto matricial o
número de colunas da primeira matriz, deve ser igual ao número de linhas da segunda matriz. Assim, a
matriz O, será :

In [56]:

O = np.dot(M,N)
O

Out[56]:

array([[8]])

[]
4
−9
Dadas as matrizes Q = [ 6, − 1, 8 3]eS= encontraremos a matriz P fruto de QS.
−2
5

In [57]:

Q = np.array([[6, -1, 8, 3]])


S = np.array ([[4], [-9], [-2], [5]])

Verificaremos se o número de colunas de Q é igual ao número de linhas de S:

In [58]:

Q.shape[1] == S.shape[0]

Out[58]:

True

Então a matriz P é obtida da seguinte forma:

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 14/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [59]:

P = np.dot(Q,S)
P

Out[59]:

array([[32]])

De um modo geral, dadas A = [a ik] e B = [b kj] duas matrizes tais que o número de colunas de A seja igual
ao número de linhas de B, digamos p, supomos assim que A seja uma matriz m × n e B uma matriz p × n.
Então o produto AB de A e B é a matriz m × n cuja ij-ésima entrada é dada pelo produto da i-ésima linha de
A com a j-ésima coluna de B. Assim,

[ ][ ]
a 11 ... a 1p b 11 ... b ij ... b 1n
. ... . . ... . ... .
a i1 ... a 1p . ... . ... . onde c ij = a i1b ij+a i2b j2 + ... + a ipb pj.
. ... . . ... . ... .
a m1 ... a mp b p1 ... b pj ... b pn

Não definimos o produto AB quando A é uma matriz m × p e B é uma matriz com q × n com p ≠ q.

Propriedades da Multiplicação de Matrizes

1. Em geral AB ≠ BA.
2. AI = IA = A (o que justifica o nome da matriz identidade)
3. A(B + C) = AB + AC (distributividade à esquerda da multiplicação)
4. (A + B)C = AC + BC (distributividade à direita da multiplicação)
5. (AB)C = A(BC) (associatividade)
6. (AB) ′ = B ′ A ′
7. 0⋅A=0eA⋅0=0

Demonstremos algumas destas propriedades utilizando matrizes genéricas.

In [60]:

from sympy.matrices import eye


a11, a12, a21, a22 = sympy.symbols('a_11, a_12, a_21, a_22')
b11, b12, b21, b22 = sympy.symbols('b_11, b_12, b_21, b_22')
c11, c12, c21, c22 = sympy.symbols('c_11, c_12, c_21, c_22')
A = sympy.Matrix(2, 2, [a11, a12, a21, a22])
B = sympy.Matrix(2, 2, [b11, b12, b21, b22])
C = sympy.Matrix(2, 2, [c11, c12, c21, c22])
I = eye(2)
zero = zeros(2)

Respectivamente temos as matrizes A,B,C,I e a matriz nula:

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 15/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [61]:

display(A)
display(B)
display(C)
display(I)
display(zero)

[ a 11
a 21
a 12
a 22 ]
[ b 11
b 21
b 12
b 22 ]
[ c 11
c 21
c 12
c 22 ]
[ ] 1
0
0
1

[ ] 0
0
0
0

1. AI = IA = I

In [62]:

A*I == I*A

Out[62]:

True

1. A(B + C) = AB + AC

In [63]:

A*(B+C)

Out[63]:

( ) ( ) ( ) ( )
[ ]
a 11 b 11 + c 11 + a 12 b 21 + c 21 a 11 b 12 + c 12 + a 12 b 22 + c 22

a 21 (b 11 + c 11 ) + a 22 ( b 21 + c 21 ) a 21 (b 12 + c 12 ) + a 22 (b 22 + c 22 )

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 16/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [64]:

A*B+A*C

Out[64]:

[ a 11b 11 + a 11c 11 + a 12b 21 + a 12c 21


a 21b 11 + a 21c 11 + a 22b 21 + a 22c 21
a 11b 12 + a 11c 12 + a 12b 22 + a 12c 22
a 21b 12 + a 21c 12 + a 22b 22 + a 22c 22 ]
In [65]:

sympy.expand(A*(B+C)) == A*B+A*C

Out[65]:

True

1. (A + B)C = AC + BC

In [66]:

(A+B)*C

Out[66]:

( ) ( ) ( ) ( )
[ ]
c 11 a 11 + b 11 + c 21 a 12 + b 12 c 12 a 11 + b 11 + c 22 a 12 + b 12

c 11 (a 21 + b 21 ) + c 21 (a 22 + b 22 ) c 12 (a 21 + b 21 ) + c 22 (a 22 + b 22 )

In [67]:

A*C+B*C

Out[67]:

[ a 11c 11 + a 12c 21 + b 11c 11 + b 12c 21


a 21c 11 + a 22c 21 + b 21c 11 + b 22c 21
a 11c 12 + a 12c 22 + b 11c 12 + b 12c 22
a 21c 12 + a 22c 22 + b 21c 12 + b 22c 22 ]
In [68]:

sympy.expand((A+B)*C) == A*C+B*C

Out[68]:

True

1. (AB)C = A(BC)

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 17/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [69]:

(A*B)*C

Out[69]:

( ) ( ) ( ) ( )
[ ]
c 11 a 11b 11 + a 12b 21 + c 21 a 11b 12 + a 12b 22 c 12 a 11b 11 + a 12b 21 + c 22 a 11b 12 + a 12b 22

c 11 (a 21b 11 + a 22b 21 ) + c 21 (a 21b 12 + a 22b 22 ) c 12 (a 21b 11 + a 22b 21 ) + c 22 (a 21b 12 + a 22b 22 )

In [70]:

A*(B*C)

Out[70]:

( ) ( ) ( ) ( )
[ ]
a 11 b 11c 11 + b 12c 21 + a 12 b 21c 11 + b 22c 21 a 11 b 11c 12 + b 12c 22 + a 12 b 21c 12 + b 22c 22

a 21 (b 11c 11 + b 12c 21 ) + a 22 (b 21c 11 + b 22c 21 ) a 21 (b 11c 12 + b 12c 22 ) + a 22 (b 21c 12 + b 22c 22 )

In [71]:

sympy.expand((A*B)*C) == sympy.expand(A*(B*C))

Out[71]:

True

1. (AB) ′ = B ′ A ′

In [72]:

(A*B).transpose() == B.transpose()*A.transpose()

Out[72]:

True

1. 0 ⋅ A = 0

In [73]:

zero*A

Out[73]:

[ ] 0
0
0
0

Iremos abordar outros exemplos numéricos de multiplicação de matrizes utilizando o NumPy.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 18/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Encontraremos XY sendo X =
[ ] [
1
2
3
−1 eY=
2
5
0
−2
−4
6 ]
Devemos inicialmente verificar a condição do produto matricial.

In [74]:

X = np.array([[1, 3], [2, -1]])


Y = np.array([[2, 0, -4], [5, -2, 6]])
X.shape[1] == Y.shape[0]

Out[74]:

True

In [75]:

np.dot(X,Y)

Out[75]:

array([[ 17, -6, 14],


[ -1, 2, -14]])

Traço de uma matriz

O traço de uma matriz quadrada A, denotado por tr(A), é a soma dos elementos da diagonal principal, a
saber, tr(A) = a 11 + a 22 + a 33 + . . . + a nn

Propriedades

1. tr(A + B) = tr(B + A)
2. tr(α ⋅ A) = α ⋅ tr(A), com α ∈ R
3. tr(A) = tr(A ′ )
4. tr(I n) = n
5. tr(AB) = tr(BA)

A partir das matrizes definidas a seguir, calcularemos o traço utilizando SymPy e NumPy. Nosso primeiro
exemplo será com uma matriz Identidade I 2. Para construir uma matriz identidade no NumPy podemos
utilizar o comando: np.eye(). Por exemplo, a matriz

In [76]:

F = np.eye(2)
F

Out[76]:

array([[1., 0.],
[0., 1.]])

O traço da matriz F é dado pela função np.trace(). Assim,

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 19/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [77]:

np.trace(F)

Out[77]:

2.0

Ou,

In [78]:

F.trace()

Out[78]:

2.0

Definiremos uma matriz identidade 10 × 10 e calcularemos seu traço.

In [79]:

O = np.eye(10)

In [80]:

Out[80]:

array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

In [81]:

np.trace(O)

Out[81]:

10.0

Definiremos uma matriz diagonal e em seguida obteremos seu traço utilizando o NumPy

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 20/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [82]:

P = np.diag(np.arange(1,6))
P

Out[82]:

array([[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5]])

In [83]:

P.trace()

Out[83]:

15

Para recuperar a diagonal principal podemos utilizar o método np.diagonal() .

In [84]:

np.diagonal(P)

Out[84]:

array([1, 2, 3, 4, 5])

Ou ainda, acessando como um método do objeto criado:

In [85]:

P.diagonal()

Out[85]:

array([1, 2, 3, 4, 5])

Para encontra a diagonal secundária, podemos utilizar o método: np.flipl().

In [86]:

np.diagonal(np.fliplr(P))

Out[86]:

array([0, 0, 3, 0, 0])

Definiremos agora duas matrizes genéricas A e B utilizando o SymPy, em seguida calcularemos o traço
associado a cada matriz.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 21/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [87]:

from sympy.abc import a, b, c, d,e,f,g,h


A = sympy.Matrix(2, 2, [a, b, c, d])
B = sympy.Matrix(2, 2, [e, f, g, h])

In [88]:

Out[88]:

[ ] a
c
b
d

In [89]:

Out[89]:

[ ] e
g
f
h

Traço de A:

In [90]:

sympy.trace(A)

Out[90]:

a+d

Traço de B:

In [91]:

sympy.trace(B)

Out[91]:

e+h

Vamos verificar as propriedade (1), (3) e (5) definidas anteriormente.

tr(A + B) = tr(B + A)

In [92]:

sympy.trace(A+B)

Out[92]:

a+d+e+h

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 22/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [93]:

sympy.trace(B+A)

Out[93]:

a+d+e+h

tr(A) = tr(A ′ )

In [94]:

sympy.trace(A) == sympy.trace(A.transpose())

Out[94]:

True

tr(AB) = tr(BA)

Temos que AB:

In [95]:

A*B

Out[95]:

[ ae + bg
ce + dg
af + bh
cf + dh ]
In [96]:

B*A

Out[96]:

[ ae + cf
ag + ch
be + df
bg + dh ]
In [97]:

sympy.trace(A*B) == sympy.trace(B*A)

Out[97]:

True

Determinante

Podemos pensar no determinante como um número associado a uma matriz quadrada A m × n. Denotamos
det A.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 23/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

| |
a 11 a 12 … a 1n
a 21 a 22 … a 2n
⋮ ⋮ ⋱ ⋮
a n1 a n2 … a nn

Calculemos o determinante de uma matriz usando o NumPy.

[ ]
1 2 3 4
4 3 2 1
Dada a matriz V = encontremos det (V).
0 2 4 6
5 7 9 11

Basta utilizar a função np.linalg.det()

In [98]:

V=np.array([[1, 2, 3, 4], [4, 3, 1, 1], [0, 2, 4, 6], [5, 7, 9, 1]])

In [99]:

round (np.linalg.det(V))

Out[99]:

-20

Matrizes invertiveis ou não singulares

Uma matriz quadrada A é dita invertível, ou não singular, se existir uma matriz B tal que AB = BA = I onde I é
a matriz identidade. Uma tal matriz B é única.

Dizemos que uma tal matriz B é a inversa de A e a denotamos por A − 1.Observe que a relação que define a
inversa é simétrica; ou seja, se B for a inversa de A, então A será a inversa de B.

Suponha que A =
[ ] [
2 5
1 3 eB=
3
−1
−5
]
2 , verifiquemos se estas matrizes admitem inversa.

In [100]:

A= np.array ([[2,5],[1,3]])
B = np.array ([[3,-5], [-1,2]])

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 24/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

In [101]:

np.dot(A,B)

Out[101]:

array([[1, 0],
[0, 1]])

In [102]:

np.dot(B,A)

Out[102]:

array([[1, 0],
[0, 1]])

Assim, B é inversa de A e A é inversa de B.

Determinemos a inversa da matriz Z =


[ ]
3
1
4
0

In [103]:

Z = np.array([[3,4],[1,0]])

In [104]:

np.linalg.inv(Z)

Out[104]:

array([[ 0. , 1. ],
[ 0.25, -0.75]])

Sistemas Lineares

De uma maneira geral, denomina-se sistema linear de m equações e n incógnitas x 1, x 2, . . . , x n a todo

{
a 11x 1 + a 12x 2 + . . . + a 1nx n = b 1
a 21x 1 + a 22x 2 + . . . + a 2nx n = b 2
sistema linear da forma : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . em que a 11, a 12, . . . , a 1n, b 1, b 2, . . . , b m são
a m1x 1 + a m2x 2 + . . . + a mnx n = b m

números reais.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 25/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Matriz associadas a um sistema linear:

{
a 11x 1 + a 12x 2 + . . . + a 1nx n = b 1
a 21x 1 + a 22x 2 + . . . + a 2nx n = b 2
Seja o sistema linear de m equações e n incógnitas ..............................
a m1x 1 + a m2x 2 + . . . + a mnx n = b m

Desse sistema, destacamos as seguintes matrizes:

[ ]
a 11 a 12 ... a 1n b1
a 21 a 22 ... a 2n b2
matriz completa do sistema
... ... ... ... ....
a n1 a n2 ... a nn b 1m

[ ]
a 11 a 12 ... a 1n
a 21 a 22 ... a 2n
matriz incompleta do sistema
... ... ... ...
a n1 a n2 ... a nn

[] []
x1 b1
x2 b2
Consideremos ainda as seguintes matrizes-colunas assosciadas ao sistema: X = ,B=
⋮ ⋮
xn bm

Multiplicando - se a matriz incompleta pela matriz das incognitas, obtemos a matriz dos temos
independentes:

[ ][ ] [ ]
a 11 a 12 ... a 1n x1 b1
a 21 a 22 ... a 2n x2 b2
⋅ =
... ... ... ... ⋮ ⋮
a n1 a n2 ... a nn xn bm

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 26/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

Denominamos então que o modelo acima é a forma matricial do sistema linear. Em notação simplificada
temos: A ⋅ X = B. Se a matriz incompleta do sistema for uma matriz quadrada, o seu determinante D A é dito
determinante do sistema. Se D A ≠ 0 então a matriz A é invertivel, isto é, existe A − 1, inversa de A. Se D A
≠ 0, o sistema admite solução única e , portanto, é possível e determinado.

Representemos o sistema
{ 3a − 7b = 1
5a + 2b = 4 na forma matricial e encontremos sua solução.

In [105]:

A = np.array ([[3, -7], [5, 2]])


B = np.array([[1], [4]])

In [106]:

X = (np.linalg.solve(A, B))

In [107]:

X #solução do sistema

Out[107]:

array([[0.73170732],
[0.17073171]])

Exercícios

[ ] [ ]
1 3 0 20 2 0
2 −1 10 13 −4 11
1. Encontre WI sendo W = eI=
3 4 10 0 5 −2
4 9 −1 0 6 0

1. Construa uma matriz 5 × 5 e encontre traço, diagonal principal e secundária.

1. Crie uma matriz 2 × 2 somente com elementos pares e calcule seu determinante.

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 27/28
5/28/2021 Algebra_Linear-Introducao(SymPy-NumPy)

1. Represente os sistemas abaixo na forma matricial e encontre as respectivas soluções.

{
2x + y = 5
a) x − 3y = 0

{
2a + b + c = − 1
b) a + c = 0
− 3a + 5b − c = 2

{
x+y+z+t=2
x − y − 2z − 3t = 5
c) 2x + y − 3z + t = − 9
3x − y − z + t = 6

1. Determine a inversa das matrizes:

a) H = [ ]
1
3
0
0

[ ]
1 0 0
b) I = 1 3 1
1 2 0

*Todos os conceitos, proposições e teoremas aqui apresentados foram retirados do livro cujo autor
é Seymour Lipschutz e/ou Simon e Blume

file:///home/lucas/Downloads/Algebra_Linear-Introducao(SymPy-NumPy).html 28/28

Você também pode gostar