Introdução à Programação Aula 18 Método de eliminação de...
Transcript of Introdução à Programação Aula 18 Método de eliminação de...
Introdução à ProgramaçãoAula 18 — Método de eliminação de Gauss
Pedro Vasconcelos
DCC/FCUP
2015
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 1 / 23
Nesta aula
1 Sistemas de equações lineares
2 Método de eliminação de GaussResolução de um sistema linearImplementação
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 2 / 23
Sistemas de equações lineares
Um sistema de equações lineares:2x + y − z = 8 (L1)
−3x − y + 2z = −11 (L2)−2x + y + 2z = −3 (L3)
3 equações (L1), (L2), (L3)3 incógnitas x , y , z
Em geral: pode ter zero, uma ou infinitas soluções.
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 4 / 23
Operações elementares
As seguintes operações transformam um sistema de equaçõeslineares noutro equivalente:
1 trocar a ordem das equações;2 somar uma equação com outra;3 multiplicar uma equação por uma constante diferente de zero.
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 5 / 23
Trocar equações
Podemos trocar a ordem das equações:2x + y − z = 8
−3x − y + 2z = −11−2x + y + 2z = −3
⇐⇒
−3x − y + 2z = −11
2x + y − z = 8−2x + y + 2z = −3
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 6 / 23
Somar equações
Podemos substituir uma equação pela sua soma com outra equação:2x + y − z = 8
−3x − y + 2z = −11−2x + y + 2z = −3
⇐⇒
−x + 0y + z = −3−3x − y + 2z = −11−2x + y + 2z = −3
2x +y −z = 8+ −3x −y +2z = −11−x +0y +z = −3
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 7 / 23
Multiplicar por uma constante
Podemos multiplicar uma equação por uma constante diferente dezero:
2x + y − z = 8−3x − y + 2z = −11−2x + y + 2z = −3
⇐⇒
x + 1
2y − 12z = 4
−3x − y + 2z = −11−2x + y + 2z = −3
(12×) 2x +y −z = 8
x +12y −1
2z = 4
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 8 / 23
Método de eliminação de Gauss
Resolver um sistema pelo método de eliminação de Gauss:eliminamos uma incógnita usando operações elementaresrepetimos o processo até obter sistema um sistema triangularsuperiorno fim: obtemos as soluções por substituições para trás
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 10 / 23
Resolução usando eliminação de Gauss
2x +y −z = 8 (L1)−3x −y +2z = −11 (L2)−2x +y +2z = −3 (L3)
Eliminar x em (L2) usando (L1):
(32×) 2x +y −z = 8+ −3x −y +2z = −11
0x +12y +1
2z = 1
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 11 / 23
Resolução usando eliminação de Gauss
2x +y −z = 8 (L1)
+12y +1
2z = 1 (L2)−2x +y +2z = −3 (L3)
Eliminar x em (L3) usando (L1):
(1×) 2x +y −z = 8+ −2x +y +2z = −3
0x +2y +z = 5
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 12 / 23
Resolução usando eliminação de Gauss
2x +y −z = 8 (L1)
12y +1
2z = 1 (L2)2y +z = 5 (L3)
Eliminar y em (L3) usando (L2):
(−4×) 12y +1
2z = 1+ 2y +z = 5
0y −z = 1
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 13 / 23
Resolução usando eliminação de Gauss
Ficamos com um sistema triangular superior:2x +y −z = 8 (L1)
12y +1
2z = 1 (L2)−z = 1 (L3)
Podemos obter a solução por substituição:
z = 1/(−1) = −1
y =(1− 1
2z)/(1
2
)= 3
x = (8− y + z)/2 = 2
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 14 / 23
Implementar o método de eliminação de Gauss
Representamos um sistema com n equações a n incógnitas por umamatriz de n linhas e n + 1 colunas (coeficientes e termosindependentes).
2x +y −z = 8−3x −y +2z = −11−2x +y +2z = −3
−→
2 1 −1 8−3 −1 2 −11−2 1 2 −3
Em Python: uma lista de listas.
[[2.0, 1.0, -1.0, 8.0],[-3.0, -1.0, 2.0, -11.0],[-2.0, 1.0, 2.0, -3.0]]
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 15 / 23
Eliminação de uma incógnita
A0,0 . . . A0,i . . . A0,n−1 A0,n
. . ....
......
Ai,i . . . Ai,n−1 Ai,n...
......
An−1,i . . . An−1,n−1 An−1,n
Para j de i + 1 até n − 1:
nova linha j = linha j −Aj,i
Ai,i× linha i
Ai,i designa-se por elemento pivot.
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 16 / 23
Substituição num sistema triangular
A0,0 . . . . . . . . . A0,n−1 A0,n
. . .Ai,i . . . Ai,n−1 Ai,n
. . ....
An−1,n−1 An−1,n
Para i de n − 1 até 0:
xi =(
Ai,n −∑n−1
j=i+1 Ai,j xj
)/Ai,i
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 17 / 23
Implementação em Python
def resolve(A):triangular(A)x = substitui(A)return x
Duas funções auxiliares:triangular(A) transforma a matriz de coeficientes em triangular
superior;substitui(A) efectua substituições para obter o vetor solução.
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 18 / 23
Transformar sistema em triangular superior
def triangular(A):"Transforma matriz A em triangular superior."n = len(A) # n equações e incógnitasfor i in range(n):
# eliminar incógnita ipivot = A[i][i]for j in range(i+1, n): # linhas
m = -A[j][i]/pivotfor k in range(i, n+1): # colunas
A[j][k] += m*A[i][k]
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 19 / 23
Substituições
def substitui(A):"Substuições duma matriz triangular superior."n = len(A) # n equações e incógnitasx = n*[0] # vector de n zerosfor i in range(n-1, -1, -1):
# substituir incógnita is = sum([A[i][j]*x[j]
for j in range(i+1,n)])x[i] = (A[i][n] - s)/A[i][i]
return x
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 20 / 23
Exemplo de execução
>>> coefs = [[2.0,1.0,-1.0,8.0],[-3.0,-1.0,2.0,-11.0],[-2.0,1.0,2.0,-3.0]]
>>> resolve(coefs)[2.0, 3.0, -1.0]
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 21 / 23
Quando o pivot é zero
>>> coefs = [[2.,1.,-1.,8.],[-3.,-1.5,2.,-11.],[-2.,1.,2.,-3.]]
>>> resolve(coefs)ZeroDivisionError
Trocando a 2a e 3a linhas:
>>> coefs = [[2.,1.,-1.,8.],[-2.,1.,2.,-3.],[-3.,-1.5,2.,-11.]]
>>> resolve(coefs)[4.25, 1.5, 2.0]
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 22 / 23
Sumário
Implementação direta do método de eliminação de GaussAlgoritmo imperativo: modifica a matriz de coeficientesPode não encontrar a solução (falta a escolha de pivot)Exercícios (folha prática):
1 efectuar a escolha de pivot2 detectar se não existe solução (sistema indeterminado ou
impossível)3 calcular o determinante4 calcular a inversa duma matriz
Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 18 — Método de eliminação de Gauss 2015 23 / 23