sexta-feira, 24 de maio de 2013

Método Iterativo de Gauss-Jacobi

Atravéz de uma aproximação inicial, o Método de Gauss-Jacobi consiste em obter uma seqüência, por meio da relação recursiva.
O processo iterativo utiliza somente estimativas da iteração anterior.
O método gera uma seqüência convergente para a solução do sistema dado, independentemente da escolha da aproximação inicial.

Fórmula Matricial do Método Gauss-Jacobi

Decompõe-se a matriz de coeficientes A em:
A = L + D + U
Onde:
L – Matriz Triangular Inferior
D – Matriz Diagonal
U – Matriz Triangular Superior


Abaixo tem um algoritmo em C para o calculo deste método linear:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>

#define tam 3

main()
{
    int t, j, i, k; 
    bool pare=false;
    float a[tam][tam], b[tam], x[tam], x0[tam], x2[tam], e, norma=0, soma=0,soma2=0;
   
    // inserindo os elementos na matriz A
     printf("\nInserindo elementos da matriz A:");
     for(i=0; i<tam; i++)
     {
              for(j=0; j<tam; j++)
              {
                       printf("\nInsira o elemento a[%i,%i]:",i+1,j+1);
                       scanf("%f",&a[i][j]);
              }
     }
    
     printf("\n");
    
     // inserindo os elementos da matriz dos termos independentes B
     printf("Inserindo os termos independentes B:");
     for(i=0; i<tam; i++)
     {
              printf("\nInsira o elemento b[%i]:",i+1);
              scanf("%f",&b[i]);
     }
    
    // inserindo os elementos do vetor x0 inicial
    printf("Entrando com os valores do vetor x0 (inicial)\n");
    for(i=0; i<tam; i++)
    {
             printf("x0[%i]= ",i+1);
             scanf("%f",&x0[i]);
    }  

    //imprimindo a matriz
     printf("\nMatriz A:\n");
      for(i=0; i<tam; i++)
      {
             for (j=0;j<tam;j++)
             {
                 printf ("%.0f",a[i][j]);
                 if(j==2)
                 {
                          printf("\n");
                 }
                 else
                 {
                      printf("\t");
                 }
             }
    } 
    printf("\n\n");

   //imprimindo a matriz de termos
    printf("\nMatriz B:\n");
    for (j=0;j<tam;j++)
    {
                 printf ("%.0f",b[j]);
                 if(j==2)
                 {
                      printf("\n");
                 }
                 else
                 {
                      printf("\t");
                 }
     }      
     printf("\n\n");
   
    //imprimindo o vertor x
    printf("\nMatriz X:\n");
    for (j=0;j<tam;j++)
    {
                 printf ("%.0f",x0[j]);
                 if(j==2)
                 {
                      printf("\n");
                 }
                 else
                 {
                      printf("\t");
                 }
     }      
     printf("\n\n");

    printf("Entre com a precisao: ");
    scanf("%f", &e);

    while (!(pare))
    {
       
        for (i=0; i<tam; i++)
        {
            //calculando o valor do primeiro somatório.
            for (j=0; j<i; j++ )
            {
                soma=soma+a[i][j]*x0[j];
            }           
            //calculando o valor do somatório.
            for (j=i+1; j<tam; j++ )
            {           
                soma2 = soma2 + a[i][j]*x0[j];
            }
            x[i]=(b[i]-soma-soma2)/a[i][i];
            printf("x%i=%f\n",i,x[i]);
            soma=0;
            soma2=0;

        }

        for (t=0; t<tam; t++)
        {
            x2[t] = x[t]-x0[t];
        }
        norma = (sqrt((x2[0]*x2[0])+(x2[1]*x2[1])+(x2[2]*x2[2])))/sqrt((x[0]*x[0])+(x[1]*x[1])+(x[2]*x[2]));
        printf ("norma = %f", norma);
        printf("\nPressione p/ continuar\n\n");
        getch();

        if (norma <= e)
        {           
            pare = true;
        }
        else
        {
            for (t=0; t<tam; t++)
            {           
                x0[t] = x[t];
            }           
            k++;
        }

    }
getch();
}

4 comentários:

  1. Obrigado pelo código. Vou testa-lo.
    Para quem for usar, é em c++, não c.

    ResponderExcluir
  2. Mas essa é para uma matriz 3x3, como ficaria para uma matriz nxn?

    ResponderExcluir
    Respostas
    1. Linha 5:
      #define tam x
      Só colocar a ordem da sua matriz no lugar do x.
      Tenho 99% de certeza HEHE

      Excluir