Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Caderno 8

Objetivos de aprendizagem

  • Compreender os fundamentos dos métodos iterativos para a resolução de sistemas lineares;

  • Aplicar os métodos de Jacobi e Gauss-Seidel para resolver sistemas lineares;

  • Analisar critérios de convergência e recursos para condicionamento de sistemas;

  • Implementar algoritmos e resolver sistemas computacionalmente;

Sistemas Lineares na Prática Computacional: Métodos Iterativos

Processo iterativo multidimensional

Diferentemente da abordagem dos métodos diretos, a resolução de sistemas lineares por métodos iterativos dá-se por meio de aproximações sucessivas, nos mesmos moldes daquilo que estudamos para uma dimensão. A diferença, no caso do Rn\mathbb{R}^n, é que os elementos da sequência são vetores que devem convergir para o vetor que soluciona o sistema dentro de uma margem de erro desejada.

De forma similar ao caso unidimensional, um processo iterativo a várias variáveis pode ser descrito por:

x(k)=ϕ(x(k1)),  k=1,,n<\mathbf{x}^{({k})} = \mathbf{\phi}(\mathbf{x}^{(k-1)}), \ \ k = 1, \ldots, n < \infty
x(0)=x0,\mathbf{x}^{(0)} = \mathbf{x}_0,

Acima, ϕ\mathbf{\phi} é uma função de iteração vetorial e x0\mathbf{x}_0 o vetor de estimativa inicial. Nesta notação, x(k)\mathbf{x}^{(k)} é a kk-ésima iterada de uma sequência numérica discreta de vetores.

No espaço de nn dimensões, como o objetivo é encontrar o vetor-solução x\mathbf{x} que soluciona a equação matricial

Ax=b,\mathbf{A}\mathbf{x} = \mathbf{b},

para An×n\mathbf{A}_{n \times n} (condições internas) e bn×1\mathbf{b}_{n \times 1} (condições externas) previamente conhecidos, a estratégia a ser seguida é decompor a matriz A\mathbf{A} de forma a facilitar a solução. De uma maneira geral, este procedimento, chamado de splitting, pode ser realizado da seguinte forma:

  • devemos escolher duas matrizes M\mathbf{M} e N\mathbf{N}, tais que A=MN\mathbf{A} = \mathbf{M} - \mathbf{N};

  • M\mathbf{M} deve ser uma matriz facilmente inversível(p.ex. diagonal ou triangular).

  • N\mathbf{N}, por sua vez, seja a parcela restante.

Por substituição direta da decomposição da matriz principal na equação, vemos que

Ax=b(MN)x=bMx=Nx+bx=M1Nx+M1b.\mathbf{A}\mathbf{x} = \mathbf{b} \Rightarrow (\mathbf{M} - \mathbf{N}) \mathbf{x} = \mathbf{b} \Rightarrow \mathbf{M} \mathbf{x} = \mathbf{N} \mathbf{x} + \mathbf{b} \Rightarrow \mathbf{x} = \mathbf{M}^{-1}\mathbf{N} \mathbf{x} + \mathbf{M}^{-1}\mathbf{b}.

Uma vez que M1\mathbf{M}^{-1} é supostamente fácil de ser calculada, a última equação descreve o processo iterativo

x(k)=M1Nx(k1)+M1b=Bx(k1)+c,\mathbf{x}^{({k})} = \mathbf{M}^{-1}\mathbf{N} \mathbf{x}^{(k-1)} + \mathbf{M}^{-1}\mathbf{b} = \mathbf{B} \mathbf{x}^{(k-1)} + \mathbf{c},

com B=M1N\mathbf{B} = \mathbf{M}^{-1}\mathbf{N} e c=M1b\mathbf{c} = \mathbf{M}^{-1}\mathbf{b}. Em outras palavras,

x(k)=ϕ(x(k1))=Cx(k1)+g,\mathbf{x}^{({k})} = \mathbf{\phi}(\mathbf{x}^{(k-1)}) = \mathbf{C} \mathbf{x}^{(k-1)} + \mathbf{g},

e a função de iteração estabelecida é, em síntese, uma sucessão de operações algébricas que resulta em um produto matriz-vetor seguido de uma adição. Geometricamente, este processo equivale a subsequentes modificações do vetor inicial no espaço de nn dimensões, acompanhadas de um deslocamento.

Os diferentes métodos de solução para a equação original passam a existir, portanto, quando C\mathbf{C} e g\mathbf{g} assumem formas distintas em decorrência da escolha do M\mathbf{M} e N\mathbf{N}. Neste capítulo, estudaremos dois procedimentos de splitting: o método de Jacobi-Richardson e o método de Gauss-Seidel, que é uma derivação do primeiro. Entretanto, o método de Gauss-Seidel é computacionalmente mais eficiente e deve ser priorizado para utilidade. A tabela abaixo resume essas escolhas.

MétodoEscolha de M\mathbf{M}Escolha de N\mathbf{N}Resumo do Método
Jacobi-RichardsonM=D\mathbf{M} = \mathbf{D} (matriz diagonal de A\mathbf{A})N=L+U\mathbf{N} = \mathbf{L} + \mathbf{U} (triangular inferior + superior estrita)Atualiza todas as variáveis simultaneamente usando apenas a diagonal de A\mathbf{A}.
Gauss-SeidelM=DL\mathbf{M} = \mathbf{D} - \mathbf{L} (diagonal + triangular inferior estrita)N=U\mathbf{N} = \mathbf{U} (triangular superior estrita)Atualiza as variáveis sequencialmente, usando valores mais recentes na mesma iteração.

Método de Jacobi-Richardson

Suponha um sistema linear nas incógnitas x1,x2,,xnx_1, x_2, \dots, x_n da seguinte forma:

a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bna_{11} x_{1} + a_{12} x_{2} + \dots + a_{1n} x_{n} = b_1 \\ a_{21} x_{1} + a_{22} x_{2} + \dots + a_{2n} x_{n} = b_2 \\ \vdots \\ a_{n1} x_{1} + a_{n2} x_{2} + \dots + a_{nn} x_{n} = b_n

Suponha também que todos os termos aiia_{ii} (diagonal) sejam diferentes de zero. Se não for o caso, isso pode, geralmente, ser resolvido permutando equações.

Inicialmente, o método sugere que as variáveis sejam isoladas em cada equação (passagem de M=D\mathbf{M} = \mathbf{D} à esquerda seguida da aplicação da inversa). Assim, escrevemos

x1=1a11[b1a12x2a13x3a1nxn]x2=1a22[b2a21x1a23x3a2nxn]xn=1ann[bnan1x1an2x2an n1xn1]x_1 = \dfrac{1}{a_{11}} [b_1 - a_{12} x_{2} - a_{13} x_{3} - \dots - a_{1n} x_{n}] \\ x_2 = \dfrac{1}{a_{22}} [b_2 - a_{21} x_{1} - a_{23} x_{3} - \dots - a_{2n} x_{n}] \\ \vdots \\ x_n = \dfrac{1}{a_{nn}} [b_n - a_{n1} x_{1} - a_{n2} x_{2} - \dots - a_{n \ n-1} x_{n-1}]

A partir dessas equações “isoladas” e do vetor de estimativa inicial x(0)=[x1(0)  x2(0)    xn(0)]T\mathbf{x}^{(0)} = [x^{(0)}_1 \ \ x^{(0)}_2 \ \ \dots \ \ x^{(0)}_n]^T, criamos o processo iterativo inserindo o contador kk:

x1(k+1)=1a11[b1a12x2(k)a13x3(k)a1nxn(k)]x2(k+1)=1a22[b2a21x1(k)a23x3(k)a2nxn(k)]xn(k+1)=1ann[bnan1x1(k)an2x2(k)an n1xn1(k)]x^{(k+1)}_1 = \dfrac{1}{a_{11}} [b_1 - a_{12} x^{(k)}_{2} - a_{13} x^{(k)}_{3} - \dots - a_{1n} x^{(k)}_{n}] \\ x^{(k+1)}_2 = \dfrac{1}{a_{22}} [b_2 - a_{21} x^{(k)}_{1} - a_{23} x^{(k)}_{3} - \dots - a_{2n} x^{(k)}_{n}] \\ \vdots \\ x^{(k+1)}_n = \dfrac{1}{a_{nn}} [b_n - a_{n1} x^{(k)}_{1} - a_{n2} x^{(k)}_{2} - \dots - a_{n \ n-1} x^{(k)}_{n-1}]

Logo, para todo i=1,2,,ni = 1, 2, \dots , n, esperamos que a sequência de vetores {x(k)}k=1N\{ \mathbf{x}^{(k)} \}_{k=1}^N convirja para o vetor solução x{\bf x}^{*} do sistema original.

De outra forma, basta notar que o processo iterativo descrito acima por componente pode ser representado pela equação matricial:

x(k+1)=D1(L+U)x(k)+D1b,\mathbf{x}^{(k+1)} = \mathbf{D}^{-1} (\mathbf{L} + \mathbf{U}) \mathbf{x}^{(k)} + \mathbf{D}^{-1} b,

pois

D=[a11000a22000ann],L=[000a2100an1an20],U=[0a12a1n00a2n000].D = \begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ 0 & a_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_{nn} \end{bmatrix}, \quad L = \begin{bmatrix} 0 & 0 & \cdots & 0 \\ -a_{21} & 0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ -a_{n1} & -a_{n2} & \cdots & 0 \end{bmatrix}, \quad U = \begin{bmatrix} 0 & -a_{12} & \cdots & -a_{1n} \\ 0 & 0 & \cdots & -a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 0 \end{bmatrix}.

Ou, explícita e compactamente,

x(k)=[0a12a11a1na11a21a220a2na22an1annan2ann0]x(k1)+[b1a11b2a22bnann].\mathbf{x}^{(k)} = \begin{bmatrix} 0 & -\frac{a_{12}}{a_{11}} & \cdots & -\frac{a_{1n}}{a_{11}} \\ -\frac{a_{21}}{a_{22}} & 0 & \cdots & -\frac{a_{2n}}{a_{22}} \\ \vdots & \vdots & \ddots & \vdots \\ -\frac{a_{n1}}{a_{nn}} & -\frac{a_{n2}}{a_{nn}} & \cdots & 0 \end{bmatrix} \mathbf{x}^{(k-1)} + \begin{bmatrix} \frac{b_1}{a_{11}} \\ \frac{b_2}{a_{22}} \\ \vdots \\ \frac{b_n}{a_{nn}} \end{bmatrix}.

No Método de Jacobi-Richardson (MJR), a matriz de iteração

C=[0a12a11a1na11a21a220a2na22an1annan2ann0]\mathbf{C} = \begin{bmatrix} 0 & -\frac{a_{12}}{a_{11}} & \cdots & -\frac{a_{1n}}{a_{11}} \\ -\frac{a_{21}}{a_{22}} & 0 & \cdots & -\frac{a_{2n}}{a_{22}} \\ \vdots & \vdots & \ddots & \vdots \\ -\frac{a_{n1}}{a_{nn}} & -\frac{a_{n2}}{a_{nn}} & \cdots & 0 \end{bmatrix}

torna-se o “motor” responsável pela progressão do método. Ela transforma os vetores da sequência buscando uma trajetória “espiral” que deve estacionar em um ponto fixo do espaço Rn\mathbb{R}^n, identificando-se com o vetor-solução. Como veremos adiante, existem condições a serem atendidas para que B\mathbf{B} produza uma sequência convergente. Mas, de maneira geral, se A\mathbf{A} for uma matriz diagonalmente dominante, as componentes de B\mathbf{B} terão valores menores do que 1 e o efeito geométrico de B\mathbf{B} sobre qualquer vetor será de uma contração.

Matrizes diagonalmente dominantes

Matrizes diagonalmente dominantes são aquelas em que o valor absoluto do termo diagonal de sua ii-ésima linha é maior ou igual à soma dos valores absolutos de todos os outros termos na mesma linha. Esta condição é refletida no critério das linhas, que deve atender à sequinte desigualdade:

j=1jinaij<aii,\sum_{\substack{j = 1 \\ j \neq i}} ^n |a_{ij}| < |a_{ii}|,

para cada linha i=1,2,,ni = 1, 2, \dots, n. Se satisfeitas as inequações acima, a matriz A{\bf A} é (estritamente) diagonalmente dominante (sinal <<). É importante observar que o critério das linhas pode deixar de ser satisfeito se houver permutações na matriz. Todavia, uma permutação cuidadosa pode fazer com que o sistema passe a satisfazer o critério. Por teorema, admite-se que se a matriz do sistema linear satisfaz o critério das linhas, então o algoritmo de Jacobi-Richardson converge para uma solução aproximada.

Por exemplo, a matriz

A=[422131224]\mathbf{A} = \begin{bmatrix} 4 & 2 & 2 \\ 1 & 3 & 1 \\ -2 & -2 & 4 \end{bmatrix}

é diagonalmente dominante (não estrita), pois

  • na linha 1: 2+2=4=4=4|2| + |2| = 4 = |4| = 4,

  • na linha 2: 1+1=2<3=3|1| + |1| = 2 < |3| = 3 e

  • na linha 3: 2+2=4=4=4|-2| + |-2| = 4 = |4| = 4.

Por outro lado, a matriz

B=[511141016]\mathbf{B} = \begin{bmatrix} 5 & 1 & 1 \\ 1 & 4 & 1 \\ 0 & 1 & 6 \end{bmatrix}

é estritamente diagonalmente dominante, porque

  • na linha 1: 1+1=2<5=5|1| + |1| = 2 < |5| = 5,

  • na linha 2: 1+1=2<4=4|1| + |1| = 2 < |4| = 4 e

  • na linha 3: 0+1=2<6=6|0| + |1| = 2 < |6| = 6.

Implementação computacional

A função abaixo é uma implementação simples do método de Jacobi.

def jacobi(A, b, x0, nit):    
    """ Método de Jacobi para solução do sistema Ax=b.

    x = jacobi(A, b, x0, nit)

    Entradas:
        - A: matriz n x n (tipo: lista de listas)
        - b: vetor n x 1 (tipo: lista)
        - x0: vetor n x 1, ponto de partida (tipo: lista)
        - nit: número de iterações
    
    Saídas:
        - x:  matriz n x nit, contendo a sequência de vetores
        - c:  norma da matriz de iteração
    """ 
    
    import numpy as np    
    
    f = lambda obj: isinstance(obj,list)     
    if not all([f(A),f(b),f(x0)]):
        raise TypeError('A, b e x0 devem ser do tipo list.')
    else:
        A = np.asarray(A)
        b = np.asarray(b)
        x0 = np.asarray(x0)
            
    n = np.size(b)
    x = np.zeros((n, nit),dtype=float)
    x[:,0] = x0
        
    P = np.diag(np.diag(A))
    Q = P - A # elementos de fora da diagonal
    C = np.linalg.solve(P,Q) # matriz da função de iteração
    g = np.linalg.solve(P,b) # vetor da função de iteração
    c = np.linalg.norm(C) 
    
    #processo iterativo
    X = x0[:]    
    j = 1
    for j in range(1,nit):        
        X = C.dot(X) + g        
        x[:,j] = X
        
    print(f"Vetor solução:{x[:,-1]}")                
    print(f"||C|| = {c:.4f}")                
        
    return x, c

Este código simples aplicado ao sistema Bx=b\mathbf{B}\mathbf{x} = \mathbf{b}, onde B\mathbf{B} é a matriz de exemplo acima e b=[7  8  6]T\mathbf{b} = [ 7 \ \ -8 \ \ 6]^T, converge para a solução aproximada em 15 passos com a norma do resíduo da ordem de 10-6.

import numpy as np

B = [[5,1,1],[1,4,1],[0,1,6]]
b = [7,-8,6]
x0 = [1,1,1]
nit = 8

_, c = jacobi(B, b, x0, nit)

# vetor-solução
x = _[:,-1]

# norma do resíduo
r = np.sqrt(np.dot(B @ x - b, B @ x - b))
print(f"||r|| = {r:e}")

_
Vetor solução:[ 1.6630191  -2.78234057  1.46321132]
||C|| = 0.4825
||r|| = 5.959925e-03
array([[ 1. , 1. , 1.73333333, 1.60833333, 1.67555556, 1.65798611, 1.66518981, 1.6630191 ], [ 1. , -2.5 , -2.45833333, -2.7875 , -2.75451389, -2.78503472, -2.77926794, -2.78234057], [ 1. , 0.83333333, 1.41666667, 1.40972222, 1.46458333, 1.45908565, 1.46417245, 1.46321132]])

Método de Gauss-Seidel

O método de Gauss-Seidel (MGS) é uma leve variação do MJR. A diferença é que para calcular a componente xj(k+1)x_j^{(k+1)}, usamos os valores x1(k+1),x2(k+1),,xj1(k+1)x_1^{(k+1)}, x_2^{(k+1)}, \ldots, x_{j-1}^{(k+1)}, já calculados e os valores restantes xj+1(k),,xn(k)x_{j+1}^{(k)}, \ldots, x_{n}^{(k)} da mesma forma.

O mesmo esquema iterativo de Jacobi, alterado apenas nas componentes coloridas, produz o processo iterativo de Gauss-Seidel,

{x1(k+1)=1a11[b1a12x2(k)+a13x3(k)++a1nxn(k)]x2(k+1)=1a22[b2a21x1(k+1)+a23x3(k)++a2nxn(k)]x3(k+1)=1a33[b3a31x1(k+1)+a32x2(k+1)++a3nxn(k)]xn(k+1)=1ann[bnan1x1(k+1)+an2x2(k+1)++an(n1)xn1(k+1)],\begin{cases} {\color{red}x_1^{(k+1)}} = \frac{1}{a_{11}} \left[b_1 - a_{12} x_2^{(k)} + a_{13} x_3^{(k)} + \cdots + a_{1n} x_n^{(k)}\right] \\ {\color{blue}x_2^{(k+1)}} = \frac{1}{a_{22}} \left[b_2 - a_{21} {\color{red}x_1^{(k+1)}} + a_{23} x_3^{(k)} + \cdots + a_{2n} x_n^{(k)}\right] \\ {x_3^{(k+1)}} = \frac{1}{a_{33}} \left[b_3 - a_{31} {\color{red}x_1^{(k+1)}} + a_{32} {\color{blue} x_2^{(k+1)}} + \cdots + a_{3n} x_n^{(k)}\right] \\ \vdots\\ {x_n^{(k+1)}} = \frac{1}{a_{nn}} \left[b_n - a_{n1} {\color{red}x_1^{(k+1)}} + a_{n2} {\color{blue} x_2^{(k+1)}} + \cdots + a_{n(n-1)} {\color{magenta} x_{n-1}^{{(k+1)}} }\right], \end{cases}

cuja equação matricial é dada por

x(k+1)=(D+L)1Ux(k)+(D+L)1b,\mathbf{x}^{(k+1)} = - ( \mathbf{D} + \mathbf{L})^{-1} \mathbf{U} \mathbf{x}^{(k)} + ( \mathbf{D} + \mathbf{L})^{-1} b,

Implementação computacional

A função abaixo implementa o método de Gauss-Seidel como variação da função elaborada para o método de Jacobi, porém acrescentando o critério de parada baseado no erro relativo.


def gauss_seidel(A, b, x0, nit, tol):
    """ Método de Gauss-Seidel de solucao do sistema Ax=b

    Entradas:
        - A: matriz n x n (tipo: lista de listas)
        - b: vetor n x 1 (tipo: lista)
        - x0: vetor n x 1, ponto de partida (tipo: lista)
        - nit: número de iterações
        - tol: tolerancia de erro relativo
   
    Saídas:
        - x: matriz n x N, contendo a sequência de vetores
        - c: norma da matriz de iteração       
        - err: erro relativo percentual por iteracao (norma 2)
    """

    import numpy as np
    n = len(b)
    x = np.zeros((n, nit))
    x[:,0] = x0
    xx = x0 # iterada atual
    P = np.tril(A)
    N = P - A
    C = np.linalg.solve(P, N)
    c = np.linalg.norm(C)
    g = np.linalg.solve(P, b)
    
    
    for j in range(1, nit):
        xx = C @ xx + g
        x[:,j] = xx
         
    key = True    
        
    for i in range(1, nit):   
             
        e = np.linalg.norm(x[:,i] - x[:,i-1])/np.linalg.norm(x[:,i])
            
        if (e < tol) and (key == True):                        
            key = False

    print(f'Vetor-solução: {x[:,-1]}')
    print(f"||C|| = {c:.4f}")
    
    return x, c

Aplicando-a ao mesmo sistema anterior, chegamos a uma solução com poucos passos.

_, c = gauss_seidel(B, b, x0, nit, 1e-1)

# vetor-solução
x = _[:,-1]

# norma do resíduo
r = np.sqrt(np.dot(B @ x - b, B @ x - b))
print(f"||r|| = {r:e}")

_
Vetor-solução: [ 1.66363617 -2.78181809  1.46363635]
||C|| = 0.3517
||r|| = 8.822865e-07
array([[ 1. , 1. , 1.61666667, 1.65972222, 1.66331019, 1.66360918, 1.6636341 , 1.66363617], [ 1. , -2.5 , -2.75833333, -2.77986111, -2.78165509, -2.78180459, -2.78181705, -2.78181809], [ 1. , 1.41666667, 1.45972222, 1.46331019, 1.46360918, 1.4636341 , 1.46363617, 1.46363635]])
#(Este código depende da biblioteca `plotly`, mas não *está otimizado*.)
#Desenvolver código para plotagem 3D da convergência para o método de Jacobi.

# # plotagem 3D da convergência 
# import plotly.graph_objs as go
# from plotly.offline import iplot, init_notebook_mode, plot
# init_notebook_mode(connected=False)

# xp = sol[0,:]
# yp = sol[1,:]
# zp = sol[2,:]

# points = go.Scatter3d(x = xp, y = yp, z = zp, mode = 'markers', marker = dict(size = 0.1,color = "rgb(227,26,28)"))

# vecs = []
# for i in range(len(xp)):
#     v = go.Scatter3d( x = [0,xp[i]], y = [0,yp[i]], z = [0,zp[i]], marker = dict(size = 0.1, color = "rgb(0,255,0)"),
#                        line = dict( color = "rgb(0,255,0)", width = 4) )
#     vecs.append(v)


# cx = np.sum(xp)/np.size(xp)
# cy = np.sum(yp)/np.size(yp)
# cz = np.sum(zp)/np.size(zp)

# vector = go.Scatter3d( x = [0,cx], y = [0,cy], z = [0,cz], marker = dict(size = 1, color = "rgb(100,100,100)"),
#                        line = dict( color = "rgb(100,100,100)", width = 4) )

# data = [points,vector] + vecs
# layout = go.Layout(margin = dict( l = 0,r = 0, b = 0, t = 0))
# fig = go.Figure(data=data,layout=layout)


# # vector

# fig.add_cone(x=[cx],y=[cy],z=[cz],u=[cx],v=[cy],w=[cz],sizeref=0.1,anchor='tip',colorscale='gray')

# for i in range(len(xp)):
#     fig.add_cone(x=[xp[i]],y=[yp[i]],z=[zp[i]],u=[xp[i]],v=[yp[i]],w=[zp[i]],sizeref=0.1,anchor='tip',colorscale='jet')
#     fig.update_layout(showlegend=False)


# plot(fig, show_link=True,filename='jacobi-3d-vectors.html')
# from IPython.display import display, HTML
# display(HTML('jacobi-3d-vectors.html'))

Critérios de parada

Consideremos x(k)=[x1(k) x2(k)  xn(k)]T{\bf x}^{(k)} = [x_1^{(k)} \ x_2^{(k)} \ \ldots \ x_n^{(k)}]^T o kk-ésimo vetor de uma sequência de vetores do Rn\mathbb{R}^n e x=[x1 x2  xn]T{\bf x} = [x_1 \ x_2 \ \ldots \ x_n]^T um vetor de referência. A distância entre eles, em uma norma especificada define o erro (ou resíduo), ou seja:

r(k)=x(k)xr^{(k)} = || {\bf x}^{(k)} - {\bf x} ||_{\square}

A depender da escolha de {\square}, chegamos a diferentes formas de medir o erro. As mais comuns são por meio de normas clássicas:

  • norma do máximo ( =\square = \infty ) r(k)=max1inxi(k)xi\Rightarrow r^{(k)} = \max\limits_{1 \le i \le n} | x_i^{(k)} - x_i |

  • _norma Euclidiana ( =2\square = 2 ) r(k)={i=1n(xi(k+1)xi)2}1/2\Rightarrow r^{(k)} = \{\sum_{i=1}^n (x_i^{(k+1)} - x_i)^2\}^{1/2}

Dado ϵ>0\epsilon > 0 (tolerância) e para uma norma escolhida, temos duas maneiras usuais de encerrar o processo iterativo:

  • critério de parada do erro absoluto: r(k)<ϵr^{(k)} < \epsilon

  • critério de parada do erro relativo: r(k)r<ϵ\frac{ r^{(k)} }{ r } < \epsilon, onde r=max1inxi(k)r = \max\limits_{1 \le i \le n} | x_i^{(k)} |

Arcabouço teórico relevante

Esta seção traz alguns elementos teóricos importantes que ajudam a compreender os métodos iterativos e as situações de convergência.

Teorema: Se A{\bf A} é uma matriz estritamente diagonalmente dominante, então, para qualquer escolha de x(0){\bf x}^{(0)}, tanto o MJR quanto o MGS geram sequencias que convergem para a solução única de Ax=b{\bf A}{\bf x} = {\bf b}.

Teorema [Critério geral de convergência]: O processo iterativo definido por

x(k+1)=Cx(k)+g,  k=0,1,2,,{\bf x}^{(k+1)} = {\bf C} {\bf x}^{(k)} + {\bf g}, \ \ k = 0,1,2,\ldots,

é convergente se, para qualquer norma de matrizes, C<1|| {\bf C} || < 1.

Definição [Raio espectral]: O raio espectral ρ(A)\rho({\bf A}) de uma matriz A{\bf A} é definido como ρ(A)=maxλ\rho({\bf A}) = \max | \lambda |, onde λ\lambda é um autovalor de A{\bf A}. Se λ=a+bi\lambda = a + bi, λ=(a2+b2)1/2| \lambda | = (a^2 + b^2)^{1/2}.

Teorema [Stein-Rosenberg]: Considere J{\bf J} e G{\bf G} as matrizes estacionárias que definem o processo iterativo de Jacobi-Richardson e Gauss-Seidel respectivamente, isto é, C=J{\bf C} = {\bf J}, ou C=G{\bf C} = {\bf G}. Se aij0a_{ij} \le 0, para cada iji \ne j e aii>0a_{ii} > 0, para i=1,2,,ni=1,2,\ldots,n, então uma, e apenas uma, das seguintes sentenças vale:

  • i) 0ρ(G)<ρ(J)<1 0 \le \rho({\bf G}) < \rho({\bf J}) < 1

  • ii) 1<ρ(J)<ρ(G) 1 < \rho({\bf J}) < \rho({\bf G})

  • iii) ρ(G)=ρ(J)=0 \rho({\bf G}) = \rho({\bf J}) = 0

  • iv) ρ(G)=ρ(J)=1 \rho({\bf G}) = \rho({\bf J}) = 1

Em especial, o caso i) indica que, quando um método converge, então ambos convergem, e o MGS converge mais rápido do que o MJR; o caso ii) indica que, quando um método diverge, ambos divergem, com a divergência do MGS sendo mais pronunciada.