Método de Gauss-Seidel

Origem: Wikipédia, a enciclopédia livre.

O método de Gauss-Seidel é um método iterativo para resolução de sistemas de equações lineares. O seu nome é uma homenagem aos matemáticos alemães Carl Friedrich Gauss e Philipp Ludwig von Seidel. É semelhante ao método de Jacobi (e como tal, obedece ao mesmo critério de convergência). É condição suficiente de convergência que a matriz seja estritamente diagonal dominante, i. e., fica garantida a convergência da sucessão de valores gerados para a solução exacta do sistema linear.

Procuramos a solução do conjunto de equações lineares, expressadas em termos de matriz como

A iteração Gauss-Seidel é

onde ; as matrizes , , e representam respectivamente os coeficientes da matriz : a diagonal, triangular estritamente inferior, e triangular estritamente superior; e é o contador da iteração. Esta expressão matricial é utilizada principalmente para analisar o método. Quando implementada, Gauss-Seidel, uma aproximação explícita de entrada por entrada é utilizada:

Diferenciando-se do método de Gauss-Jacob:

Sendo que o método de Gauss-Seidel apresenta convergência mais rápida que este último.

Note que o cálculo de utiliza apenas os elementos de que já havia sido calculada e apenas aqueles elementos de já haviam avançado para a iteração . Isto significa que nenhum armazenamento adicional é necessário, e que computacionalmente pode ser substituído ( por ). A iteração geralmente continua até que a solução esteja dentro da tolerância especificada.

Pseudocódigo[editar | editar código-fonte]

O pseudocódigo a seguir descreve um algoritmo baseado no método de Gauss-Seidel. As variáveis de entrada são: a matriz de coeficientes , o vetor dos termos constantes , a tolerância para o critério de parada e o número máximo de iterações. A saída é a aproximação calculada da solução de ou mensagem de que o critério de parada não foi satisfeito.

escolher uma aproximação inicial xo = (xo1, …, xon)
faça k = 1.
enquanto k <= N faça:
  para i := (1, …, n):
    σ = 0.
    para j := (1, …, i-1):
      σ = σ + aij * xj
    fim para.
    para j := (i+1, …, n):
      σ = σ + aij * xoj
    fim para.
    xi = (bi - σ) / aii
  fim para.
  se ||x-xo|| <= TOL então:
    retorna x.
  fim se
  xo = x.
  k = k+1.
fim enquanto.
imprime mensagem "Número máximo de iterações excedido."

Javascript[editar | editar código-fonte]

Abaixo é apresentado a resolução utilizando a linguagem JavaScript.

function norm(Matrix) {
    //Requer implementação ou inclusão de bibliotecas de terceiros
}
/*
* A = Matriz
* b = Resultado da matriz
*/
function gaussSeidel(A, b) {
	var X = new Array();
	var x = new Array();
	for (var k = 0; k < b.length; k++)
	{
		X[k] = 0; //Math.floor((Math.random() * 10000) + 1);
	}
	var E = 0.00001; //precisao, tolerância
	var m = 1000; //número máximo de iterações
	var ni = 0; //contador de iterações
	var continuar = true;

	while (continuar && ni < m) {
	    for (var i=0; i < b.length; i++) {
	        soma = 0;
	        for (var j = 0; j < i; j++) {
                	soma = soma + A[i][j] * x[j];
	        }
	        for (var j = i + 1; j < b.length; j++) {
                	soma = soma + A[i][j] * X[j];
	        }
		x[i] = (b[i] - soma) / A[i][i];
	    }
	    // se | x - xo | < Tolerância
	    if (Math.abs(math.norm(x) - math.norm(X)) < E) {
	        continuar = false;
	    } else {
	        X=x.slice(0);
	    }
	    ni = ni + 1;
	}
	return x;
}

Exemplo[editar | editar código-fonte]

Utilizando a equação dois, vamos calcular uma iteração da matriz, sendo que a análise da convergência é dada pela diagonal dominante, ou seja, o a soma dos módulos de todos os elementos em que i difere de j de uma dada linha tem que ser menor do que o módulo do elemento em que i é igual a j nesta mesma linha. Verificado isso, parte-se para a próxima etapa:

Matriz:

Em que bi é igual:

Usando a equação:

Obtemos o sistema :

Utilizando a pressuposição inicial de vetor nulo:

É necessário notar que, ao fazer as iterações, o x que recebe o valor é substituido e jogado na equação de baixo. Por exemplo:

Resulta em:

Que resulta em:

Como esse é jogado na equação seguinte, no caso x2:

Após a substituição essa ficará assim:

Ou seja, somente o valor de x1 está definido, pois uma iteração já havia sido feita, o resto dos x's assumem seu valor inicial, no caso, zero. Por fim, após uma iteração temos:

Calculando o Erro[editar | editar código-fonte]

O cálculo do erro consiste em se pegar a maior diferença entre as raízes da iteração k-1 e k, e dividi-las por o valor de x máximo da iteração atual;

Diferenças:

Erro da primeira iteração:

Ligações externas[editar | editar código-fonte]