| | | | |

3.3 Métodos de Jacobi e de Gauss-Seidel

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Nesta seção, estudamos os métodos iterativos de Jacobi3636endnote: 36Carl Gustav Jakob Jacobi, 1804 - 1851, matemático alemão. Fonte: Wikipédia: Carl Gustav Jakob Jacobi. e de Gauss3737endnote: 37Johann Carl Friedrich Gauss, 1777 - 1855, matemático alemão. Fonte: Wikipédia: Carl Friedrich Gauss.-Seidel3838endnote: 38Philipp Ludwig von Seidel, 1821 - 1896, matemático alemão. Fonte: Wikipédia: Philipp Ludwig von Seidel. para a aproximação da solução de sistemas lineares

A𝒙=𝒃, (3.307)

onde A=[ai,j]i,j=1n,n, n1, é uma dada matriz dos coeficientes, 𝒙=(x1,x2,,xn) é o vetor das incógnitas e 𝒃=(b1,b2,,bn) é um dado vetor dos termos constantes.

Métodos iterativos para sistemas lineares têm a forma

𝒙(0)=aprox. inicial, (3.308)
𝒙(k+1)=T𝒙(k)+𝒄, (3.309)

onde T=[ti,j]i,j=1n,n é a matriz de iteração e 𝒄=(c1,c2,,cn) é o vetor de iteração.

3.3.1 Método de Jacobi

Consideramos a seguinte decomposição da matriz A=L+D+U:

A =[a11a12a13a1na21a22a23a2na31a32a33a3nan1an2an3ann] (3.315)
=[0000a21000a31a3200an1an2an30]L (3.321)
+[a110000a220000a330000ann]D (3.327)
+[0a12a13a1n00a23a2n00a33a3n000ann]U. (3.333)

Isto é, a matriz A decomposta como a soma de sua parte triangular inferior L, de sua diagonal D e de sua parte triangular superior U.

Desta forma, podemos reescrever o sistema como segue:

A𝒙 =𝒃 (3.334)
(L+D+U)𝒙 =𝒃 (3.335)
(L+U)𝒙+D𝒙 =𝒃 (3.336)
D𝒙 =(L+U)𝒙+𝒃 (3.337)
𝒙 =D1(L+U)𝒙+D1𝒃. (3.338)

Ou seja, resolver o sistema A𝒙=𝒃 é equivalente a resolver o problema de ponto fixo

𝒙=TJ𝒙+𝒄J, (3.339)

onde TJ=D1(L+U) é chamada de matriz de Jacobi e 𝒄J=D1𝒃 é chamado de vetor de Jacobi.

Exemplo 3.3.1.

Consideramos o sistema linear A𝒙=𝒃 com

A =[421252113], (3.340)
𝒃 =[1170].

Este sistema tem solução 𝒙=(2,1,1). Neste caso, temos a decomposição A=L+D+U com

L =[000200110], (3.344)
D =[400050003], (3.348)
U =[021002000]. (3.352)

Ainda, observamos que

TJ𝒙+𝒄J =D1(L+U)𝒙+D1𝒃 (3.353)
=[01/21/42/502/51/31/30]TJ[211]𝒙+[11/47/50]𝒄J (3.363)
=[211]𝒙. (3.367)

conforme esperado.

1import numpy as np
2import numpy.linalg as npla
3
4# sistema
5A = np.array([[-4., 2., -1.],
6              [-2., 5., 2.],
7              [1., -1., -3.]])
8b = np.array([-11., -7., 0.])
9
10# A = L + D + U
11L = np.tril(A, -1)
12D = np.diag(np.diag(A))
13U = np.triu(A, 1)
14
15# matriz de Jacobi
16T = -npla.inv(D) @ (L + U)
17# vetor de Jacobi
18c = npla.inv(D) @ b

A forma matricial das iterações de Jacobi consiste em

𝒙(0) =aprox. inicial, (3.368)
𝒙(k+1) =TJ𝒙(k)+𝒄J,

onde 𝒙(k)=(x1(k),x2(k),,xn(k)) é a k-ésima aproximação da solução do sistema, k=0,1,2,.

Equivalentemente, tem-se a forma algébrica das iterações de Jacobi

xi(k+1)=bijij=1naijxj(k)aii, (3.369)

com i=1,2,,n. Por não requerer as computações da matriz TJ e vetor 𝒄J, esta é a forma mais usada em implementações computacionais.

Exemplo 3.3.2.

Consideramos o sistema A𝒙=𝒃 com

A =[421252113], (3.370)
𝒃 =[1170].

Aplicando o método de Jacobi com aproximação inicial 𝒙(1)=(0,0,0) obtemos os resultados da Tabela 3.1.

k 𝒙(k) A𝒙(k)𝒃
0 (0,0,0) 2.4e+1
1 (2.75,1.4,0) 7.4e+0
2 (2.05,0.3,1.38) 4.6e+0
3 (2.25,1.13,0.78) 2.2e+0
4 (1.99,0.81,1.13) 1.4e+0
5 (2.06,1.06,0.93) 6.9e1
29 (2,1,1) 5.7e7
Tabela 3.1: Resultados referentes ao Exemplo 3.3.2.
Código 8: jacobi.py
1import numpy as np
2import numpy.linalg as npla
3
4def jacobi(A, b, x0, maxiter = 100,
5           tol=4.9e-8, atol=4.9e-8):
6
7  n = b.size
8  info = -1
9
10  x = np.empty_like(x0)
11  nres = npla.norm(A@x - b)
12  print(f'\n{0}: {x0}, {nres:.1e}')
13
14  # iterações
15  for k in range(maxiter):
16    for i in  range(n):
17      x[i] = b[i]
18      # x[i] -= np.dot(A[i,:i], x0[:i])
19      for j in range(i):
20          x[i] -= A[i,j]*x0[j]
21      # x[i] -= np.dot(A[i,i+1:], x0[i+1:])
22      for j in range(i+1,n):
23          x[i] -= A[i,j]*x0[j]
24      x[i] /= A[i,i]
25    # critério de parada
26    nres = npla.norm(A@x - b)
27    print(f'{k+1}: {x}, {nres:.1e}')
28    if (nres <= max(tol*npla.norm(b), atol)):
29      info = 0
30      break
31    x0 = x.copy()
32
33  return x, info

A aplicação de Jacobi pode, então, ser feita como segue:

1# sistema
2A = np.array([[-4., 2., -1.],
3              [-2., 5., 2.],
4              [1., -1., -3.]])
5
6b = np.array([-11., -7., 0.])
7
8x0 = np.zeros_like(b)
9x, info = jacobi(A, b, x0)

3.3.2 Método de Gauss-Seidel

Como acima, começamos considerando um sistema linear A𝒙=𝒃 e a decomposição A=L+D+U, onde L é a parte triangular inferior de A, D é sua parte diagonal e U sua parte triangular superior. Então, observamos que

A𝒙 =𝒃 (3.371)
(L+D+U)𝒙 =𝒃 (3.372)
(L+D)𝒙 =U𝒙+𝒃 (3.373)
𝒙 =(L+D)1U𝒙+(L+D)1𝒃. (3.374)

Isto nos leva a forma matricial iteração de Gauss-Seidel

𝒙(1) =aprox. inicial, (3.375)
𝒙(k+1) =TG𝒙(k)+𝒄G,

onde

TG =(L+D)1U, (3.376)
𝒄G =(L+D)1𝒃, (3.377)

são a matriz e o vetor de Gauss-Seidel.

Equivalentemente e mais adequada para implementação computacional, temos a forma algébrica da iteração de Gauss-Seidel

xi(k+1)=bij=1i1aijxj(k+1)j=i+1naijxj(k)aii, (3.378)

para i=1,2,,n.

Exemplo 3.3.3.

Consideramos o sistema A𝒙=𝒃 com

A =[421252113], (3.382)
𝒃 =[1170]. (3.386)

Aplicando o método de Gauss-Seidel com aproximação inicial 𝒙(1)=(0,0,0) obtemos os resultados da Tabela 3.2.

Tabela 3.2: Resultados referentes ao Exemplo 3.3.3.
k 𝒙(k) A𝒙(k)𝒃
0 (0,0,0) 2.4e+1
1 (2.75,0.3,1.02) 2.6e+0
2 (2.35,0.87,1.07) 1.2e+0
3 (2.05,1.01,1.02) 2.5e1
4 (1.99,1.01,1) 4.0e2
5 (1.99,1,1) 2.0e2
13 (2,1,1) 2.3e7
Código 9: gs.py
1import numpy as np
2import numpy.linalg as npla
3
4def gs(A, b, x0, maxiter = 100,
5       tol=4.9e-8, atol=4.9e-8):
6
7  n = b.size
8  info = -1
9
10  x = np.empty_like(x0)
11  nres = npla.norm(A@x - b)
12  print(f'\n{0}: {x0}, {nres:.1e}')
13
14  # iterações
15  for k in range(maxiter):
16    for i in  range(n):
17      x[i] = b[i]
18      # x[i] -= np.dot(A[i,:i], x[:i])
19      for j in range(i):
20          x[i] -= A[i,j]*x[j]
21      # x[i] -= np.dot(A[i,i+1:], x0[i+1:])
22      for j in range(i+1,n):
23          x[i] -= A[i,j]*x0[j]
24      x[i] /= A[i,i]
25    # critério de parada
26    nres = npla.norm(A@x - b)
27    print(f'{k+1}: {x}, {nres:.1e}')
28    if (nres <= max(tol*npla.norm(b), atol)):
29      info = 0
30      break
31    x0 = x.copy()
32
33  return x, info

3.3.3 Análise Numérica

Observamos que ambos os métodos de Jacobi e de Gauss-Seidel consistem de iterações da forma

𝒙(k+1)=T𝒙(k)+𝒄, (3.387)

para k=1,2,, com x(0) uma aproximação inicial dada, T e c a matriz e o vetor de iteração, respectivamente. O seguinte teorema nos fornece uma condição suficiente e necessária para a convergência de tais métodos.

Teorema 3.3.1.

Para qualquer 𝐱(0)n, temos que a sequência {𝐱(k)}k=0 dada por

𝒙(k+1)=T𝒙(k)+𝒄, (3.388)

converge para a solução única de 𝐱=T𝐱+𝐜 se, e somente se, ρ(T)<13939endnote: 39ρ(T) é o raio espectral da matriz T, i.e. o máximo dos módulos dos autovalores de T..

Demonstração.

Veja [2, Cap. 7, Sec. 7.3]. ∎

Observação 3.3.1.

((Taxa de convergência.)) Para uma iteração da forma (3.387), temos a seguinte estimativa

𝒙(k)𝒙ρ(T)k+1𝒙(0)𝒙𝟏, (3.389)

onde 𝒙 é a solução de 𝒙=T𝒙+𝒄.

Exemplo 3.3.4.

Consideramos o sistema A𝒙=𝒃 com

A =[421252113], (3.393)
𝒃 =[1170]. (3.397)

Nos Exemplos 3.3.2 e 3.3.3 vimos que ambos os métodos de Jacobi e de Gauss-Seidel são convergentes para este sistema. Este convergiu aproximadamente duas vezes mais rápido que esse. Isto é confirmado pelos raios espectrais das respectivas matrizes de iteração

ρ(TJ) 0.56, (3.398)
ρ(TG) 0.26. (3.399)
1import numpy as np
2import numpy.linalg as npla
3
4# matriz dos coefs
5A = np.array([[-4., 2., -1.],
6              [-2., 5., 2.],
7              [1., -1., -3.]])
8
9# A = L + D + U
10L = np.tril(A, -1)
11D = np.diag(np.diag(A))
12U = np.triu(A, 1)
13
14# matriz de Jacobi
15TJ = -npla.inv(D) @ (L + U)
16rho_TJ = max(np.abs(npla.eigvals(TJ)))
17print(f'rho(T_J) = {rho_TJ:.2f}')
18
19# matriz de Gauss-Seidel
20TG = -npla.inv(L+D) @ U
21rho_TG = max(np.abs(npla.eigvals(TG)))
22print(f'rho(T_G) = {rho_TG:.2f}')
Observação 3.3.2.

(Matriz estritamente diagonal dominante.) Pode-se mostrar que se A é uma matriz estritamente diagonal dominante, i.e. se

|aii|>jij=1n|aij|, (3.400)

para todo i=1,2,,n, então ambos os métodos de Jacobi e de Gauss-Seidel são convergentes.

3.3.4 Exercícios

E. 3.3.1.

Considere o seguinte sistema linear

4x1+x2+x3x4 =1 (3.401)
5x2x3+2x4 =3 (3.402)
x1+4x32x4 =2 (3.403)
x1x25x4 =1 (3.404)

Compute a aproximação 𝒙(5) obtida da aplicação do Método de Jacobi com aproximação inicial 𝒙(0)=(1,1,1,1). Também, compute A𝒙(5)b.

Resposta.

𝒙(5)=(0.325164,0.593096,0.546128,0.253043); A𝒙(5)b=7.2e3

E. 3.3.2.

Considere o sistema linear do Exercício . Compute a aproximação 𝒙(5) obtida da aplicação do Método de Gauss-Seidel com aproximação inicial 𝒙(0)=(1,1,1,1). Também, compute A𝒙(5)b.

Resposta.

𝒙(5)=(0.325208,0.592417,0.545397,0.253442); A𝒙(5)b=7.1e4

E. 3.3.3.

Verifique que o Método de Jacobi, com 𝒙(0)=𝟎, é divergente para o sistema A𝒙=𝒃 com

A =[3011114002100115], (3.409)
b =[211219] (3.414)

Então, escreva um sistema equivalente para o qual o Método de Jacobi seja convergente para qualquer escolha de aproximação inicial.

Resposta.
A =[3011021011400115], (3.419)
b =[221119] (3.424)
E. 3.3.4.

Considere o sistema linear

x1+2x22x3 =6 (3.425)
3x14x2+x3 =11
x15x2+3x3 =10.

Empregando a aproximação inicial 𝒙(0)=𝟎, compute a solução com o:

  1. a)

    Método de Jacobi.

  2. b)

    Método de Gauss-Seidel.

Resposta.

a) divergente. b) (2,1,1)

E. 3.3.5.

Considere o sistema linear A𝒙=𝒃 com

A =[1000012100012100012100001], (3.431)
b =[00.50.50.50]. (3.437)

Compute a solução empregando o:

  1. a)

    Método de Jacobi.

  2. b)

    Método de Gauss-Seidel.

Resposta.

𝒙=(0,0.75,1,0.75,0)

E. 3.3.6.

Considere o seguinte sistema de equações

2.1x1x2+0.9x3 =1.3 (3.438)
2x1+2x2+2.1x3 =2.1
1.2x1x2+2x3 =π

Usando a aproximação inicial 𝒙(0)=𝟎, verifique que o método de Jacobi não converge para sua solução, enquanto que o método de Gauss-Seidel converge. Por quê?

Resposta.

ρ(TJ)=1.12e+0>1, ρ(TG)=5.48e1<1.

E. 3.3.7.

Considere o seguinte sistema de equações

1.1x1+2x21.9x3 =1.3 (3.439)
x1+x2+x3 =2.1
2.1x1+1.9x2+x3 =π

Usando a aproximação inicial 𝒙(0)=𝟎, verifique que o método de Jacobi converge para sua solução, enquanto que o método de Gauss-Seidel não converge. Por quê?

Resposta.

ρ(TJ)=8.5e1<1, ρ(TG)=1.95e+0>1.


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!