Escolar Documentos
Profissional Documentos
Cultura Documentos
MODELAGEM MATEMÁTICA
Apresentação
Na aula passada, começamos a tratar do estudo de sistemas de equações lineares algébricas (SELA), com base nos
métodos diretos. Como vimos, tais sistemas são muito úteis em tarefas diversas, como a análise de circuitos elétricos
(Engenharia Elétrica), do comportamento variante no tempo de sistemas de comunicações sem fio (Engenharia de
Telecomunicações), de sistemas mecânicos (Engenharia Mecânica) e da distribuição de forças em estruturas (Engenharia
Civil), dentre outros.
No entanto, nem sempre é possível determinar de forma direta a solução de tais sistemas. Desta forma, faz-se necessário
o emprego de métodos que permitem, via repetição de procedimentos, a identificação da solução ou, ao menos, de
valores aproximados à solução do problema. Tais métodos são os denominados métodos iterativos, bastante utilizados
na resolução de sistemas de equações lineares.
Assim, o objetivo desta aula é continuar os estudos de sistemas de equações lineares, mas agora com foco nos métodos
iterativos. Em primeiro lugar, você aprenderá o método de Gauss-Jacobi. Em seguida, você estudará o método Gauss-
Seidel. Ao final, você será capaz de aplicar os métodos estudados, por meio da implementação computacional de
programas em Python.
Objetivos
Identificar os principais métodos iterativos de resolução de sistemas de equações lineares: Gauss-Jacobi e Gauss-
Seidel.
Tais expressões são obtidas a partir do isolamento de cada uma das variáveis, obtidas a partir de cada uma das equações do
SELA. Depois disso, com base em valores previamente atribuídos às variáveis, são realizadas diversas iterações para avaliação
dos novos valores obtidos, até que o critério de convergência seja alcançado.
O primeiro dos métodos que estudaremos na aula de hoje é o denominado Método de Gauss-Jacobi. Vamos considerar o
sistema linear apresentado a seguir:
Dadas as expressões que vimos, você pode isolar as incógnitas em cada equação. Desta forma, obtemos as seguintes
expressões:
1
x1 = (b1 − a12 x2 − a13 x3 − . . . − a1n xn )
a11
1
x2 = (b2 − a21 x1 − a23 x3 − . . . − a2n xn )
a22
1
x3 = (b3 − a31 x1 − a32 x2 − . . . − a3n xn )
a33
. . .
1
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n xn−1 )
ann
Agora, basta você apresentar uma estimativa ou aproximação inicial para cada uma das variáveis acima para obter a solução.
Ou seja, você deve escolher um conjunto de valores {x1 (0) , x2 (0) , x3 (0) , . . . , xn (0) } para iniciar a solução do SELA, com
emprego do método de Gauss-Jacobi.
Com isso, como resultado da primeira iteração, obtém-se o conjunto de valores {x1 (1) , x2 (1) , x3 (1) , . . . , xn (1) }, de tal
maneira que:
. . .
(1) 1 (0) (0) (0)
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n x n−1 )
ann
E assim devemos proceder sucessivamente. Por exemplo, o conjunto de valores obtido na k-ésima iteração (ou seja, {
x1
(k)
, x2
(k)
, x3
(k)
, . . . , xn
(k)
}) é expresso a partir dos valores obtidos na iteração anterior (k-1). Veja, a seguir, como ficam
os cálculos nesta etapa da resolução:
. . .
(k) 1 (k−1) (k−1) (k−1)
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n x n−1 )
ann
Assim, imaginamos que você já tenha entendido a ideia principal do Método de Gauss-Jacobi. Neste método, cada coordenada
do vetor correspondente à nova aproximação é calculada a partir da respectiva equação do sistema, utilizando-se as demais
coordenadas do vetor aproximação da iteração anterior.
Por fim, é importante destacar que o processo é finalizado ao se atingir uma precisão preestabelecida, calculada a partir do
valor máximo de desvio para as incógnitas entre iterações sucessivas – exatamente como fizemos no caso do método de
Gauss-Jacobi. De igual modo, também pode ser finalizado ao se atingir um número máximo preestabelecido de iterações, com
vantagens semelhantes.
No entanto, você pode estar se perguntando: quando é que chegamos ao final destes cálculos? Simples: o processo é
finalizado ao se atingir uma precisão preestabelecida, calculada a partir do valor máximo de desvio para as incógnitas entre
iterações sucessivas.
Comentário
De modo alternativo, pode-se interromper o processo ao se atingir um número máximo preestabelecido de iterações. Essa última
estratégia de finalização do processo traz como vantagem a facilidade em determinar o tempo máximo de processamento
numérico em um computador para cálculo da solução.
Fim-Se
bi
xi← aii
− soma
Fim-Para
diff ← |x1 - y1|
Para i de 2 até n faça
Se (|xi – yi| >diff)
Entãodiff ← |xi – yi|
Fim-Se
Fim-Para
i←i+1
Fim-Enquanto
Fim-GaussJacobi
Como exemplo de aplicação, considere as matrizes A e b conforme descrito em Moura (2017):
2 −3 1 0
⎡ ⎤ ⎡ ⎤
A = ⎢ −1 1 −5 ⎥; b = ⎢ −3 ⎥
⎣ ⎦ ⎣ ⎦
3 2 −1 −1
Assim, a título de ilustração, considere-se como palpite inicial os valores de x(1) = x(2) = x(3) = 1, com uma tolerância de erro na
aproximação no valor de 0, 001 ou inferior. De acordo com o emprego previsto da técnica iterativa de Gauss-Jacobi para
resolução de SELA, tem-se que:
b(2) − A(2,1) × (1) − A(2,3) × (3) (−3) − (−1).(1) − (−5).1 3
x (2) = = = = 3
A(2,2) 1 1
b(3) − A(3,1) × (1) − A(3,2) × (2) −1 − (3).(1) − (2).1 −6
x (3) = = = = 6
A(3,3) −1 −1
Veja que, depois da 1a iteração, os novos valores de teste são x(1) = 1, x(2) = 3 e x(3) = 6. Como a maior diferença (5, para a
variável x(3)) excede a tolerância especificada, você precisa realizar uma nova iteração. Veja só como fica esta segunda rodada:
b(1) − A(1,2) × (2) − A(1,3) × (3) 0 − (−3) .(3) − 1.6 3
x (1) = = = = 1, 5
A(1,1) 2 2
b(2) − A(2,1) × (1) − A(2,3) × (3) (−3) − (−1).(1) − (−5).6 28
x (2) = = = = 28
A(2,2) 1 1
Após a 2a iteração, temos que os novos valores de teste são x(1) = 1,5, x(2) = 28 e x(3) = 10. Como a maior diferença (25, para a
variável x(2)) também excede a tolerância especificada, você precisa realizar uma terceira iteração e, assim, sucessivamente.
Comentário
Creio que agora você tenha entendido como funciona o método de Gauss-Jacobi. Este é o método iterativo básico para resolução
de sistemas de equações lineares. No entanto, não é o de convergência mais rápida. Existem alternativas que, com sutis
diferenças, permitem determinar mais rapidamente a solução de um sistema de equações lineares. Dentre estes, destaca-se o
método de Gauss-Seidel, que veremos na próxima seção desta aula.
Método de Gauss-Seidel
De modo semelhante ao exposto na seção anterior, tem-se que a resolução de um SELA por meio do Método de Gauss-Seidel
considera, em princípio, um sistema linear como o descrito a seguir:
Tal qual feito para o método de Gauss-Jacobi, nós podemos isolar as incógnitas em cada uma das equações:
1
x1 = (b1 − a12 x2 − a13 x3 − . . . − a1n xn )
a11
1
x2 = (b2 − a21 x1 − a23 x3 − . . . − a2n xn )
a22
1
x3 = (b3 − a31 x1 − a32 x2 − . . . − a3n xn )
a33
. . .
1
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n xn−1 )
ann
Ainda de acordo com o que fizemos no método anterior, você deve estipular uma estimativa inicial para cada uma das
incógnitas destacadas nas equações que acabamos de ver – ou seja, um conjunto de valores {x1(0), x2(0), x3(0), ..., xn(0)} para
iniciar a solução do SELA.
No entanto, conforme destacado em Moura (2017), a partir daqui nós temos a diferença em relação ao método anterior. Aqui,
no Método de Gauss-Seidel, cada coordenada do vetor correspondente à nova aproximação é calculada a partir da respectiva
equação do sistema, utilizando-se as coordenadas do vetor aproximação da iteração anterior, quando essas ainda não foram
calculadas na iteração corrente, e as coordenadas do vetor aproximação da iteração corrente, no caso contrário.
Com isso, como resultado da primeira iteração, obtém-se o conjunto de valores {x1 (1) , x2 (1) , x3 (1) , . . . , xn (1) } tal que:
. . .
(1) 1 (1) (1) (1)
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n x n−1 )
ann
Veja que na segunda equação nós utilizamos o novo valor de x1 (ou seja, x1 (1) , e não x1 (0) , como aconteceu no método de
Gauss-Jacobi. De igual modo, na terceira equação, além do novo valor de x1 , nós utilizamos x2 (1) no lugar de x2 (0) . Assim,
seguimos até a última equação, que naturalmente utiliza todas as novas estimativas para as variáveis anteriormente
calculadas.
Desta forma, podemos ver o caso geral a partir das expressões das equações na k-ésima iteração - {
{x1 (k), x2 (k), x3 (k), . . . , xn (k) }). Veja, a seguir, como ficam os cálculos nesta etapa da resolução:
. . .
(k) 1 (k) (k) (k)
xn = (bn − an1 x1 − an2 x2 − . . . − an−1.n x n−1 )
ann
Uma dúvida relevante que você pode se fazer é: será que sempre dá certo o emprego deste método? Infelizmente, não.
Conforme destacado em Moura (2017), a iteração do método de Gauss-Seidel convergirá se, no determinante característico,
cada termo da diagonal principal for maior (em valor absoluto) do que a soma dos valores absolutos de todos os outros termos
n
na mesma linha ou coluna. Isto é, teremos garantido a convergência se |aii | > ∑
j=1,j≠i
|aji | e
n
|aii | > ∑ |aji |, i = 1, 2, . . . , n
j=1,j≠i
aii
xi←
Fim-Para
diff ← |x1 - y1|
Para i de 2 até n faça
Se (|xi – yi| >diff)
Entãodiff ← |xi – yi|
Fim-Se
Fim-Para
i←i+1
Fim-Enquanto
Fim-GaussSeidel
Considere novamente as matrizes A e b, conforme descrito a seguir:
2 −3 1 0
⎡ ⎤ ⎡ ⎤
A = ⎢ −1 1 −5 ⎥; b = ⎢ −3 ⎥
⎣ ⎦ ⎣ ⎦
3 2 −1 −1
Assim, a título de ilustração, considere-se como palpite inicial os valores de x(1) = x(2) = x(3) = 1, com uma tolerância de erro na
aproximação no valor de 0, 001 ou inferior. De acordo com o emprego previsto da técnica iterativa de Gauss-Jacobi para
resolução de SELA, tem-se que:
b(2) − A(2,1) × (1) − A(2,3) × (3) (−3) − (−1).(1) − (−5).1 3
x (2) = = = = 3
A(2,2) 1 1
Você pode ver que, após a 1a iteração, os novos valores de teste são x(1) = 1, x(2) = 3 e x(3) = 10. Como a maior diferença (9,
para a variável x(3)) excede a tolerância especificada, faz-se necessária uma nova iteração:
b(1) − A(1,2) × (2) − A(1,3) × (3) 0 − (−3) .(3) − 1.10 −1
x (1) = = = = − 0, 5
A(1,1) 2 2
Após realizar a 2a iteração, vemos que os novos valores de teste são x(1) = -0,5, x(2) = 46,5 e x(3) = 92,5. Como a maior
diferença (82,5, para a variável x(3)) também excede a tolerância especificada, faz-se necessária uma terceira iteração, e assim
sucessivamente.
import numpy as np
from numpy import linalg
def jacobi(A,b,x0,tol,N):
#preliminares
A = A.astype(’double’)
b = b.astype(’double’)
x0 = x0.astype(’double’)
n=np.shape(A)[0]
x = np.zeros(n)
it = 0
#iteracoes
while (it < N):
it = it+1
#iteracao de Jacobi
for i in np.arange(n):
x[i] = b[i]
for j in np.concatenate((np.arange(
0,i),np.arange(i+1,n))):
x[i] -= A[i,j]*x0[j]
x[i] /= A[i,i]
#tolerancia
if (np.linalg.norm(x-x0,np.inf) < tol):
return x
#prepara nova iteracao
x0 = np.copy(x)
raise NameError(’num. max. de iteracoes excedido.’)
Já quanto ao método de Gauss-Seidel, podemos utilizar a implementação disponível em UFRGS (2019). Veja a seguir:
from __future__ import division
import numpy as np
from numpy import linalg
def gauss_seidel(A,b,x0,tol,N):
#preliminares
A = A.astype(’double’)
b = b.astype(’double’)
x0 = x0.astype(’double’)
n=np.shape(A)[0]
x = np.copy(x0)
it = 0
#iteracoes
while (it < N):
it = it+1
#iteracao de Jacobi
for i in np.arange(n):
x[i] = b[i]
for j in np.concatenate((np.arange(
0,i),np.arange(i+1,n))):
x[i] -= A[i,j]*x[j]
x[i] /= A[i,i]
print(x[i],A[i,i])
#tolerancia
if (np.linalg.norm(x-x0,np.inf) < tol):
return x
#prepara nova iteracao
x0 = np.copy(x)
raise NameError(’num. max. de iteracoes excedido.’)
Atividade
1. Assinale a única alternativa que apresenta a solução para o sistema de equações lineares
a)12
b)22
c)10
d)17
e) nenhuma das alternativas anteriores.
3. Assinale a única alternativa que apresenta a solução para o sistema de equações lineares
a) 12
b) 35
c) 25
d) 40
e) nenhuma das alternativas anteriores.
5. Assinale a única alternativa que apresenta a solução para o sistema de equações lineares
Notas
escolha
Por exemplo, utilize o compilador online disponível em: https://www.onlinegdb.com/online_python_compiler, acesso em 16 OUT
19.
Referências
MOURA, D. F. C, Cálculo Numérico. Rio de Janeiro: SESES, 2017. 144 p.
UFRGS (colaborativo). Cálculo Numérico: Um Livro Colaborativo Versão Python. Porto Alegre: UFRGS, 2019.
Próxima aula
O método de Lagrange;
O método de Newton;
Explore mais
Segue uma lista de sites na Internet para que você os consulte depois:
Prof. Rex Medeiros. Método de Jacobi – Resolução de Sistemas Lineares. Disponível em:
https://www.youtube.com/watch?v=ksGH52MMy4Iacesso em 24 de outubro de 2019.
Código Exato. Resolução de sistemas lineares utilizando Python. Disponível em: https://www.youtube.com/watch?
v=14N89iDBflQacesso em 24 de outubro de 2019.