Método de Gauss-Seidel – 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]