Advertisement
jacknpoe

Resolve conjunto de equações pelo método de Jacobi

Apr 28th, 2017
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.52 KB | None | 0 0
  1. /*
  2. Resolve conjunto de equações (matriz)
  3.  
  4. Para entender, entre com os seguintes dados:
  5.  
  6. Exemplo 1:
  7. 2 (quantidade de variáveis)
  8. 2, 1, 3  (primeira linha, equivale a  2x + y = 3
  9. 4, 5, 9  (segunda linha, equivale a 4x + 5y = 9
  10. Os resultados serão próximos de x=1 e y=1
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <iostream>
  16. #include <locale.h>
  17. #include <string.h>
  18.  
  19. using namespace std;
  20.  
  21. double absoluto( double valor)
  22. {
  23.     if( valor >= 0)
  24.     {
  25.         return valor;
  26.     }
  27.     else
  28.     {
  29.         return valor * -1;
  30.     }
  31. }
  32.  
  33. class TMatriz {
  34.     double *Matriz, *Resultado, *Anterior;
  35.     long Tamanho; bool Prolixo;
  36. public:
  37.     TMatriz( long tam, bool pro);
  38.     TMatriz( long tam);
  39.     TMatriz( bool pro);
  40.     TMatriz( void);
  41.     ~TMatriz( void);
  42.     double *matriz( long lin, long col);
  43.     double *resultado( long col);
  44.     double *anterior( long col);
  45.     long tamanho( void);
  46.     bool resolva( void);
  47. };
  48.  
  49. // * Implementação da Classe
  50. // Classe TMatriz
  51.  
  52. TMatriz::TMatriz( long tam, bool pro) {
  53.     Prolixo = pro;
  54.     Tamanho = tam;
  55.     Matriz = (double*) malloc( sizeof( double) * ( tam * tam + tam));
  56.     Resultado = (double*) malloc( sizeof( double) * tam );
  57.     Anterior = (double*) malloc( sizeof( double) * tam );
  58. }
  59.  
  60. TMatriz::TMatriz( long tam){ TMatriz( tam, false); }
  61.  
  62. TMatriz::TMatriz( bool pro){ TMatriz( 2, pro); }
  63.  
  64. TMatriz::TMatriz( void){ TMatriz( 2, false); }
  65.  
  66. TMatriz::~TMatriz( void)
  67. {
  68.     free( Matriz);
  69.     free( Resultado);
  70.     free( Anterior);
  71. }
  72.  
  73. double *TMatriz::matriz( long lin, long col) {  return( &Matriz[ (lin-1) + (col-1) * Tamanho] ); }
  74.  
  75. double *TMatriz::resultado( long col) { return( &Resultado[ col-1] ); }
  76.  
  77. double *TMatriz::anterior( long col) { return( &Anterior[ col-1] ); }
  78.  
  79. long TMatriz::tamanho( void) { return( Tamanho); }
  80.  
  81. bool TMatriz::resolva( void) {
  82.     int i, j, iteracao;
  83.     double maior_d, maior_v, acum;
  84.     // calcula os valores iniciais
  85.     for( i = 1; i <= Tamanho; i++)
  86.     {
  87.         (*anterior( i)) = (*matriz( i, Tamanho + 1)) / (*matriz( i, i));
  88.         (*resultado( i)) = (*anterior( i));
  89.         cout << "Valor inicial de x" << i << ": " << (*resultado( i)) << endl ;
  90.     }
  91.  
  92.     // looping principal (infinito)
  93.     iteracao = 1;
  94.     while( true)
  95.     {
  96.         // itera as linhas
  97.         for( i = 1; i <= Tamanho; i++)
  98.         {   // começamos com o valor de bn
  99.             acum = (*matriz( i, Tamanho + 1));
  100.             // itera as colunas
  101.             for( j = 1; j <= Tamanho; j++)
  102.             {
  103.                 if( j != i )
  104.                     acum = acum - (*matriz( i, j)) * (*anterior( j));
  105.             }
  106.             (*resultado( i)) = acum / (*matriz( i, i));
  107.             cout << "Valor de x" << i << "(" << iteracao << "): " << (*resultado( i)) << endl ;
  108.         }
  109.  
  110.         // calcula o erro
  111.         maior_d = 0;
  112.         maior_v = 0;
  113.         for( i = 1; i <= Tamanho; i++)
  114.         {
  115.             if( absoluto( (*resultado( i))) > maior_v )
  116.                 maior_v = absoluto( (*resultado( i)));
  117.             if( absoluto( (*resultado( i)) - (*anterior( i)) ) > maior_d )
  118.                 maior_d = absoluto( (*resultado( i)) - (*anterior( i)) );
  119. //            cout << "Erro: " <<  maior_d << " / " << maior_v << endl ;
  120.         }
  121.         cout << "Erro: " << ( maior_d / maior_v ) << endl ;
  122.         if( ( maior_d / maior_v ) < 0.0001) break;
  123.  
  124.         // copia os resultados
  125.         for( i = 1; i <= Tamanho; i++)
  126.         {
  127.             (*anterior( i)) = (*resultado( i));
  128.         }
  129.         // incrementa a interação
  130.         iteracao += 1;
  131.     }
  132.     return true;
  133. }
  134.  
  135. // Corpo do Programa
  136.  
  137. int main( void)
  138. {
  139.     TMatriz *matriz;
  140.  
  141.     setlocale( LC_ALL, "");     // equal caracters in prompt
  142.  
  143.     matriz = new TMatriz( 4, true);
  144.  
  145.     (*(*matriz).matriz( 1, 1)) = 4;
  146.     (*(*matriz).matriz( 1, 2)) = -1;
  147.     (*(*matriz).matriz( 1, 3)) = 0;
  148.     (*(*matriz).matriz( 1, 4)) = 0;
  149.     (*(*matriz).matriz( 1, 5)) = 1;
  150.  
  151.     (*(*matriz).matriz( 2, 1)) = -1;
  152.     (*(*matriz).matriz( 2, 2)) = 4;
  153.     (*(*matriz).matriz( 2, 3)) = -1;
  154.     (*(*matriz).matriz( 2, 4)) = 0;
  155.     (*(*matriz).matriz( 2, 5)) = 1;
  156.  
  157.     (*(*matriz).matriz( 3, 1)) = 0;
  158.     (*(*matriz).matriz( 3, 2)) = -1;
  159.     (*(*matriz).matriz( 3, 3)) = 4;
  160.     (*(*matriz).matriz( 3, 4)) = -1;
  161.     (*(*matriz).matriz( 3, 5)) = 1;
  162.  
  163.     (*(*matriz).matriz( 4, 1)) = 0;
  164.     (*(*matriz).matriz( 4, 2)) = 0;
  165.     (*(*matriz).matriz( 4, 3)) = -1;
  166.     (*(*matriz).matriz( 4, 4)) = 4;
  167.     (*(*matriz).matriz( 4, 5)) = 1;
  168.  
  169. // resultados: 0,36364 0,45455 0,45455 0,36364
  170.  
  171.     if( ! ( (*matriz).resolva() )) {
  172.         cout << "\n\n\nAlgum erro (a implementar)!\n\n";
  173.         return 2;
  174.     }
  175.  
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement