Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
Postado
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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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!