Ir ao conteúdo
  • Cadastre-se
Diogo Batista Costa

C++ Matriz Utilizando Gauss Seidel C++

Recommended Posts

Galera Boa tarde Estou com um problema no meu código e queria pedir ajuda. Criei pelo C++ Uma matriz Utilizando GAUSS SEIDEL, Porém  quando compilo ele faz a primeira Interação Corretamente, quando Chega na segunda interação os valores não estão corretos.

na linha 129  do meu programa ele multiplica todos os valores da linha por -1 e seu respectivo valor da matriz inicial. A Diagonal principal fica intacta; isso você pode comprovar na hora que aparece a matriz na tela de acordo com a interação feita.

Na interação 2  essa linha 129 não multiplica os valores por -1; 
Na interação 3 parece que volta ao normal.

Como esse é meu primeiro tópico não sei se postei no local correto e se estou compartilhando o link correto. Coloquei meu código no GitHub.

Se puderem Ajudar agradeço muito 😃  

Ps: Se o código estiver muito sujo, com conteúdo em excesso, aceito ajuda para retirar algo 😉 .

Foto da tentativa: https://drive.google.com/file/d/1M3MeIVw1sOPO__RiB1PzXm9s4gPoM_3_/view?usp=sharing


https://gist.github.com/Diogoislim/d0bbb698037eac548f470f379ec24bd6

 

  ///---- MÉTODO DE CÁLCULO
    void gauss_seidel(){

      float valorDeX[100] = {0};
     // float x_final[100] = {0};
      float x_nova[100] = {0};
      float somarLinhaX[100] = {0};
      distancia = 0;
      interacao =0;

     do{
          somarLinha =0;
          interacao += 1;
          cout << " ---------------"" Interacao: " << interacao << " ---------------" << endl;
          for(int i=1; i<= ordem; i++){
            for(int j=1; j<=ordem; j++){
                if(j == i){
                    matriz_a[i][j] = matriz_a[i][j];
                }else{
                    primeiroCalculo = ((-1) * (matriz_a[i][j]) * (matriz_x[j])); // MULTIPLICA OS TERMOS POR -1  E PELO X
                    matriz_a[i][j] = primeiroCalculo;
                    somarLinha += matriz_a[i][j];
                }

            string condicao = (j <  ordem ) ?  " | ": " |  "; // SOMENTE FOMATACAO
            cout << matriz_a[i][j] << condicao;
            }
            cout << matriz_b[i] << endl;
            somarLinhaX[i] = somarLinha;
            valorDeX[i] = ((1 / matriz_a[i][i]) * (matriz_b[i] + somarLinhaX[i]));
            somarLinha = 0;
            x_nova[i] = valorDeX[i]; // x_nova É SOMENTE PARA GUARDAR O VALORDEX PARA DEPOIS TRANSFORMAR EM MATRIZ_X
        }
        cout << endl;


        for(int k=1; k<=ordem; k++){
            printf("x[%d] = 1/%0.1f * (%f + (%f)) ) = %f \n",k, matriz_a[k][k], matriz_b[k], somarLinhaX[k], valorDeX[k]);
        }
        cout << endl;
        distancia = calcular_distancia_seidel(valorDeX, matriz_x); // ValorDX = MATRIZ K + 1 E Matriz_x = MATRIZ K

        for(int m=1; m<=ordem; m++){
         matriz_x[m] = x_nova[m];
        }

        system("pause");
        cout << endl;

     }while(tolerancia < distancia);

 

deixei o GITHUB porque está grande o código :D

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Diogo Batista Costa    qual o enunciado desse exercício ?  ,      o que o programa deve fazer ?     rodei seu código e ele apresenta erros que consegui acertar e ele roda mas não apresenta nenhuma informação para saber para que serve .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Devair Obrigado por ajudar a função desse programa é calcular uma matriz quadrada utilizando o método de Gauss Seidel. Ele funciona da Seguinte forma: (Peço Até desculpas no programa deixei algumas coisas escritas erradas kk).

 

Ele pega os valores de uma Matriz A e uma Matriz B  e transforma em uma matriz Aumentada  ficando no formato [ A | B ].  Depois ele cria uma matriz que chamamos de Matriz Inicial X ().

 

Ele faz Respectivamente o Seguinte, 

 

Matriz A =   { 1, 2 , 3, 4 }         Matriz B= { 5, 6  }       Matriz X = { 1, 8}

  x¹         x²     =  B                              X     

 x ¹   +   2x²    = 5                              | 1 | ¹
3x¹   +   4x ²   = 6                              | 8 | ²

 

Ele Multiplica todos os números que não estão na diagonal que é o 2 e o 3 por -1. Em seguida multiplica por seu X equivalente ficando assim:

 

X¹  = B + ( - 2x²)              x² = 8

X¹ =   5 + ( - 2. 😎 / 1     /// este 1 está na diagonal acompanhando o x¹

X¹ =   5 - 16

X¹ = -11

 

X² = B ( - 3.x¹)      x¹ = 1

x² = 6 +( - 3.1 )  / 4        /// Esse quatro está na diagonal acompanhando o x²

X² =   3 / 4

X² =  0.75 

 

Aqui tenho valor de X¹ = 80 e de X² = 4.5.

Peço muitas desculpas explicar Assim foi a melhor maneira :( . 

 

onde é o valor de 1 e 8 troca agora por esses valores de 80 e 4.5. Até aqui Tudo bem ,o programa está fazendo corretamente. Aí ele vai e faz o processo novamente porém ele não reconhece o  -1. Por que ? se ele gera a primeira linha a matriz fica Assim :

1     - 16      =  5

-3   +  4       =  6  

Quando ele fizer a segunda interação deveria ficar assim:

1       -12      =  5

33   +  4       =  6  

Com o Sinal de menos onde era o -12 e 33 positivo. porque se ele não ficar dá diferença no próximo resultado.. Parece que ele inverte os sinais.

 

Fiz um exercício na mão utilizando a matriz 

Matriz A =   { 1, 2 , 3, 4 }         Matriz B= { 5, 6  }       Matriz X = { 1, 8}

https://photos.app.goo.gl/GqGYxMzyLxE1EKmv6

 

Vê como ela fica. 

 

Observação ela repete os mesmos passos porque a matriz calcula uma distancia que tem que ser menor que a tolerância informada, geralmente a tolerância é 0.05.(Não sei se isso Ajuda um pouco).

 

 

 

 

 

 

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 15/10/2018 às 20:34, devair1010 disse:

@Diogo Batista Costa    qual o enunciado desse exercício ?  ,      o que o programa deve fazer ?     rodei seu código e ele apresenta erros que consegui acertar e ele roda mas não apresenta nenhuma informação para saber para que serve .

 O Devair Agradeço por ter ajudado :D, acabei conseguindo resolver o Problema fiz o seguinte. Como tinha a Matriz_a[][] com os valores inicialmente indicados e eu precisava alterar o valor de cada linha sem alterar então criei uma matriz Auxiliar muita[][] com os valores de matriz_a[][]  e fiz todos os calculos necessários. No Final dos comandos atribui muita[][] = matriz_a[][] para ficar com os valores de A novamente. Em questão do " - 1 " como eu fiz esse método não precisou utilizá-lo.

 

Agradeço grandemente pela Ajuda. Jesus Abençoe :D

 

PS: Assim que Terminar deixo o Código todo Disponível lá para quem quiser Utilizar. A ideia é Calcular a Matriz pelo método iterativo de GAUSS SEIDEL e JACOBBI.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×