Pesquisar neste blog

26/02/2018

Algoritmo método de Gauss Seidel C/C++





























#include <stdio.h>
#include <math.h>
#define ERROR 0.001 // erro, precissao
#define N 3 // Tamanho da matriz (linhas do sistema linear)

void main (){
int i, j;

    // Declara a matriz com os coeficientes e respostas
    float A[N][N]   = {{3, -0.1, -0.2},
                       {0.1, 7, -0.3},
                       {0.3, -0.2, 10}};

    // Declara matriz com os resultados
    float b[N][1]  = {{7.85},
                      {-19.3},
                      {71.4},
  {15}};

    // Declarar o vetor de chute inicial
    float x[N][1] = {{0},
                     {0},
                     {0},
{0}};

    // Declara o vetor do x velho para calcular o erro
    float xAntigo[N][1] = {{0},
                          {0},
                          {0},
  {0}};

    // Declara bandeira que indica quando parar
    float xError[N][1] = {{0},
                        {0},
                        {0},
{0}};

    // Erro que vai pra 1 quando todos os esrros forem no minimo menor que o ERROR
    int erro = 0;

    // Loop do metodo
    do {

        // Loop para
        for (i = 0; i < N; i++) {
            float s = 0;

            // Calculando o somatorio do conjunto x das iterações
            //usando a regra de cramer
            for (j = 0; j < N; j++) {
                if (j != i)
                    s = s + A[i][j]*x[j][0];//lop para calcular o Ax
            }

            // Faz (bi - s) / Aii ser o x
            x[i][0] = ((b[i][0] - s)/ A[i][i]);//lop para calcular o B-somatorio / A

        }
        //criterio da convergencia
        for (i = 0; i<N; i++){
            xError[i][0] = (fabs((x[i][0]- xAntigo[i][0]) / x[i][0])) * 100;
            if (xError[i][0] >= ERROR){
                erro = 1;//erro como uma questão de parada
            }else{
                erro = 0;
            }
            xAntigo[i][0] = x[i][0];
        }

        printf("\n");

        for (i = 0; i <N; i++){
           printf("X%i = %f\t |Er| = %f\n",i+1, x[i][0], xError[i][0]);
        }

    } while (erro != 0);

}

4 comentários:

Anônimo disse...

Cara, na parte que você declara a matriz dos termos independentes eu não entendi esse "15" que você colocou.

Unknown disse...

EU também não entedi esse 15, ta dando erro de compilação

Unknown disse...

Na hora que ele foi colocar os valores nos vetores ele colocou 4 valores mas esta definido N=3, por isso ele não aceita. Além disso o compilador pode reclamar desse void main aí, mas é só colocar int e return 0 no final que compila suave.

Anônimo disse...

Obrigado, ajudou muito!