Método de Gauss-Seidel

Fonte: testwiki
Saltar para a navegação Saltar para a pesquisa

Predefinição:Sem fontes 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 é

x(k+1)=(D+L)1(Ux(k)+b),

onde A=D+L+U; as matrizes D, L, e U representam respectivamente os coeficientes da matriz A: a diagonal, triangular estritamente inferior, e triangular estritamente superior; e k é 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:

xi(k+1)=1aii(bij<iaijxj(k+1)j>iaijxj(k)),i=1,2,,n.

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

xi(k+1)=1aii(bij=1,jinaijxj(k)),i=1,2,,n

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

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

Pseudocódigo

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 A, o vetor dos termos constantes b, a tolerância TOL 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 Ax=b 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

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

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:

{4x1x2x3=1x1+4x2x3x4=2x1x2+4x3x4x5=6x2x3+4x4x5=2x3x4+4x5=1

Em que bi é igual:

bi=(12621)

Usando a equação: xi(k+1)=j=1,jinaijaii+xj(k)+biaii,i=1,2,,n

Obtemos o sistema :

{x(k+1)=14+0.25x2(k)+0.25x3(k)x(k+1)=12+0.25x1(k)+0.25x3(k)+0.25x4(k)x(k+1)=32+0.25x1(k)+0.25x2(k)+0.25x4(k)+0.25x5(k)x(k+1)=12+0.25x2(k)+0.25x3(k)+0.25x5(k)x(k+1)=14+0.25x3(k)+0.25x4(k)

Utilizando a pressuposição inicial de vetor nulo:

x(0)=(00000)

É 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:

x(1)=14+0.25x2(k)+0.25x3(k)

Resulta em:

x(1)=14+0.25*0+0.25*0

Que resulta em:

x(1)=0.25

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

x(2)=12+0.25x1(k)+0.25x3(k1)+0.25x4(k1)

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

x(2)=12+0.25*(0.25)+0.25*0+0.25*0

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:

{x1(1)=0.25x2(1)=0.4375x3(1)=1.546875x4(1)=0.99609375x5(1)=0.3857421875

Calculando o Erro

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;

erro(k)=max|xi(k)xi(k1)|max1in|xi(k)|

Diferenças:

{|x1(1)x1(0)|=|0.250|=0.25|x2(1)x2(0)|=0.4375|x3(1)x3(0)|=1.546875|x4(1)x4(0)|=0.99609375|x5(1)x5(0)|=0.3857421875

Erro da primeira iteração:

MR(1)=1.5468751.546875=1

Ligações externas