Método de Gauss-Jacobi
O Método de Gauss-Jacobi é um algoritmo iterativo utilizado para resolver sistemas lineares de equações do tipo
Formulando o Problema
Considere um sistema linear de equações representado por:
Podemos expressar este sistema em forma matricial como
é uma matriz , é um vetor coluna de incógnitas, é um vetor coluna dos termos independentes.
Aplicação Do Método
O método de Gauss-Jacobi consiste em decompor a matriz
onde
Assim, o sistema original pode ser reescrito como:
Isolando
onde
Exemplo
Considere o sistema linear:
Em forma matricial, temos
Aplicando o método de Gauss-Jacobi:
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:
- Erro Absoluto:
Aqui,
- Erro Relativo:
Este critério é útil quando as soluções são de ordens de grandeza diferentes.
- Número Máximo de Iterações:
O método pode ser interrompido após um número máximo de iterações,, seja atingido.
- 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
- Erro Absoluto:
- Erro Relativo:
Observações Importantes
- O critério de parada baseado no erro relativo é mais robusto, pois considera a escala dos valores das variáveis.
- A escolha do critério de parada deve levar em conta o problema específico e as características do sistema linear.
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)