Método de Gauss-Jacobi

O Método de Gauss-Jacobi é um algoritmo iterativo utilizado para resolver sistemas lineares de equações do tipo Ax=b, onde A é uma matriz quadrada, x e b são vetores. Este método é particularmente útil quando a matriz A possui certas propriedades que facilitam sua aplicação.

Formulando o Problema

Considere um sistema linear de equações representado por:

a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bn

Podemos expressar este sistema em forma matricial como Ax=b, onde:

Aplicação Do Método

O método de Gauss-Jacobi consiste em decompor a matriz A em suas partes diagonal, triangular inferior e triangular superior. Especificamente, podemos escrever:

A=D+L+U,

onde D é a matriz diagonal formada pelos elementos da diagonal principal de A, L é a matriz triangular inferior (com zeros na diagonal) e U é a matriz triangular superior (também com zeros na diagonal).

Assim, o sistema original pode ser reescrito como:

Dx=LxUx+b.

Isolando x, obtemos:

x(k+1)=D1(Lx(k)Ux(k)+b),

onde x(k) representa a aproximação do vetor solução no k-ésimo passo.

Exemplo

Considere o sistema linear:

2x1+x2=8x1+3x2=10

Em forma matricial, temos A=(2113), b=(810).

Aplicando o método de Gauss-Jacobi:

x1(k+1)=12(8x2(k))x2(k+1)=13(10x1(k))

Criterio de Parada Do Método de Gauss-jacobi

O método de Gauss-Jacobi é uma técnica iterativa utilizada para resolver sistemas lineares. O critério de parada desse método é fundamental para determinar quando a solução atinge um nível aceitável de precisão. Este critério pode ser estabelecido considerando as seguintes condições:

  1. Erro Absoluto:
ϵ=maxi|xi(k+1)xi(k)|<ε

Aqui, xi(k+1) e xi(k) representam os valores das variáveis no (k+1)-ésimo e k-ésimo iterações, respectivamente. ε é um valor pequeno definido pelo usuário que serve como a tolerância de erro.

  1. Erro Relativo:
ϵ=maxi|xi(k+1)xi(k)|maxi|xi(k+1)|<ε

Este critério é útil quando as soluções são de ordens de grandeza diferentes.

  1. Número Máximo de Iterações:
    O método pode ser interrompido após um número máximo de iterações, Kmax, seja atingido.
kKmax
  1. Convergência Garantida:
    Para garantir a convergência do método de Gauss-Jacobi, é necessário que o sistema linear seja diagonalmente dominante ou que as matrizes associadas sejam simétricas e definidas positivas, conforme o Teorema Condição Suficiente de Converência do Método de Gauss-Jacobi

Exemplos

Considere um sistema linear Ax=b com matriz A diagonalmente dominante. Suponha que a tolerância de erro ε=106, o número máximo de iterações seja Kmax=50, e os valores iniciais sejam x(0)=[0,0,,0]T.

|xi(k+1)xi(k)|<106 |xi(k+1)xi(k)||xi(k+1)|<106

Observações Importantes

Código em Python

import numpy as np

def gauss_jacobi(A, b, x0=None, tol=1e-6, max_iter=100):
    """
    Solve the linear system Ax = b using the Gauss-Jacobi iterative method.

    Parameters:
    A : numpy.ndarray
        Coefficient matrix (n x n)
    b : numpy.ndarray
        Right-hand side vector (n,)
    x0 : numpy.ndarray, optional
        Initial guess for the solution (n,). If None, uses zeros.
    tol : float, optional
        Tolerance for the stopping criterion (default: 1e-6)
    max_iter : int, optional
        Maximum number of iterations (default: 100)

    Returns:
    result : dict
        Dictionary with keys:
            'solution'   : Solution vector (numpy.ndarray)
            'iterations' : Number of iterations performed (int)
            'converged'  : Boolean indicating if the method converged (bool)
            'residual'   : Final residual norm (float)
    """
    n = A.shape[0]
    if x0 is None:
        x0 = np.zeros(n)
    x = x0.copy()
    x_new = np.zeros_like(x)

    for iteration in range(1, max_iter + 1):
        for i in range(n):
            s = sum(A[i, j] * x[j] for j in range(n) if j != i)
            x_new[i] = (b[i] - s) / A[i, i]
        if np.linalg.norm(x_new - x, ord=np.inf) < tol:
            residual = np.linalg.norm(np.dot(A, x_new) - b, ord=np.inf)
            return {
                'solution': x_new,
                'iterations': iteration,
                'converged': True,
                'residual': residual
            }
        x[:] = x_new
    residual = np.linalg.norm(np.dot(A, x_new) - b, ord=np.inf)
    return {
        'solution': x_new,
        'iterations': max_iter,
        'converged': False,
        'residual': residual
    }

# Example usage
if __name__ == "__main__":
    A = np.array([[10., -1., 2., 0.],
                  [-1., 11., -1., 3.],
                  [2., -1., 10., -1.],
                  [0.0, 3., -1., 8.]])
    b = np.array([6., 25., -11., 15.])
    x0 = np.zeros(4)
    result = gauss_jacobi(A, b, x0, tol=1e-8, max_iter=100)
    print("Solution:", result['solution'])
    print("Iterations:", result['iterations'])
    print("Converged:", result['converged'])
    print("Final residual norm:", result['residual'])
    print("Verification: A·x =", np.dot(A, result['solution']))
    print("b =", b)