Ir ao conteúdo

Gauss-Seidel


Ítalo Elétrico

Posts recomendados

Postado

Boa noite, galera!

 

Eu estou com dificuldade na implementação do método de Gauss-Seidel em código C. Não tenho muita prática com programação e é essencial em Cálculo Numérico para Engenharia. A parte matemática é fácil de entender, o problema é o algoritmo, mesmo.

 

Eu tenho de resolver esse sistema linear (na verdade qualquer um, mas estou começando por um caso particular antes de aperfeiçoar o código):

 8x+ 2x+ 2x3 = 3

-1x+ 4x2 - 4x3 = 3

 1x1 - 2x+ 6x1 = 8

 

e4ea3f653028767d176d865bda8d0a88.png

#include <stdio.h>#include <stdlib.h>#include <math.h>// Constante de erro.#define erro = 0.001// "Delta de Kronecker" invertido. Retorna 1, se  i != j, e 0, se i = j.int delta(int i, int j){	return (i != j) ? 1 : 0;}// Função principalint main(int argc, char*argv[]) {	// Matriz de coeficientes. "3x3"	float a[4][4] = {{0,  0,  0,  0},			 {0,  8,  2,  2},			 {0, -1,  4, -4},			 {0,  1, -2,  6}};	// Vetor de resultados. "3" elementos.	float b[4] = {0, 3, 3, 8};	// Valor anterior e posterior, respectivamente, de x. "3" elementos.	float x_pre[4] = {0, 0, 0, 0};	float x_pos[4];	// Variável para armazenar o valor do somatório. "3" elementos.	float soma[4];	// Variável de contagem de iterações.	int cont = 1;		// Imprime os valores iniciais de x.	printf("0: x(1)=%f\tx(2)=%f\tx(3)=%f\n", x_pre[1], x_pre[2], x_pre[3]);		do {		// Imprime o nº da iteração corrente.		printf("%i: ", cont);				// Loop de atribuição para o iésimo x. 		for (int i=1; i<=3; i++)		{				// Somatório em j. 			for (int j=1; j<=3; j++)			{				soma[j] = a[i][j]*x_pre[j]*delta(i,j);			}						// Atualiza os valores de x.			x_pos[i] = (b[i]-soma[i])/a[i][i];		}		// Imprime os valores atuais de x. Atribui os valores do vetor x_pos aos do vetor x_pre.		for (int k=1; k<=3; k++) {				printf("x(%i)=%f\t", k, x_pos[k]);			x_pre[k] = x_pos[k];		}		// Quebra de linha. Incrementa o nº da iteração.		printf("\n");		cont++;	}	while (cont <= 100);		return 0;}

 

Ao executar, ele não converge para os valores reais (x1=-1, x2=3, x3=5/2), e sim fica com o mesmo valor da 1ª iteração (x1=0.375, x2=0.75, x3=1.333...), independente dos valores iniciais.

 

Agradeço pela ajuda.

Postado

Acredito que o seu problema esteja aqui:

for (int i=1; i<=3; i++){		// Somatório em j. 	for (int j=1; j<=3; j++)	{		soma[j] = a[i][j]*x_pre[j]*delta(i,j);	}				// Atualiza os valores de x.	x_pos[i] = (b[i]-soma[i])/a[i][i];}

Veja que no somatório de j você faz 3 iterações e atribui os valores a cada posição do vetor "soma".

Mas quando você vai atualizar os valores de x, você só utiliza soma, ou seja, a unica iteração que vai importar no somatório de j é o atual valor de i.

Se i=1, você só utiliza soma[1], Se i=2, você só utiliza soma[2], Se i=3, você só utiliza soma[3].

 

Isso significa que nessas situações o seu delta sempre terá i=j, e o delta sempre será 0, e, por consequencia, o seu soma sempre será 0. Por isso que o valor sempre dá igual.

 

Experimente declarar "soma" como uma simples variavel float, e mude esta linha:

soma[j] = a[i][j]*x_pre[j]*delta(i,j);

para

soma += a[i][j]*x_pre[j]*delta(i,j);

e não esqueça de zerar a variavel soma antes do somatório de j

// Somatório em j. soma = 0;

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!