Advertisement
rakoczyn

[Metody Numeryczne] Metoda eliminacji Gaussa

Oct 26th, 2011
1,326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1.  
  2.     // METODA ELIMINACJI GAUSSA
  3.     // 20-10-2011, 27-10-2011
  4.     // WOJCIECH RAK
  5.  
  6.  
  7. #include <iostream>
  8. #define _USE_MATH_DEFINES
  9. #include <math.h>
  10. #include <fstream>
  11. #include <string>
  12.  
  13.  
  14. using namespace std;
  15.  
  16. double tab[100][100];
  17. int N;
  18. double X[100];
  19. bool osobliwa = false;
  20.  
  21.  
  22. void zamienWiersze (int a, int b)
  23. {
  24.     double tmp = 0.0;
  25.     for (int i = 0; i < N+1; i++)
  26.     {
  27.  
  28.         tmp = tab[a][i];
  29.         tab[a][i] = tab[b][i];
  30.         tab[b][i] = tmp;
  31.     }
  32.  
  33. }
  34.  
  35. void wypiszTablice();
  36.  
  37. void przeksztalc( int m)
  38. {
  39.    
  40.     if (m > 1)
  41.     {
  42.         int max = 0;
  43.         for (int i = N-m; i < N; i++)
  44.         {
  45.             if (tab[i][N-m] > tab[N-m][N-m])
  46.                 zamienWiersze(N-m,i);
  47.         }
  48.         //wypiszTablice();
  49.  
  50.         przeksztalc(m-1);
  51.  
  52.        
  53.     }
  54. }
  55.  
  56.  
  57. void gauss(int k)
  58. {
  59.     if( k < N)
  60.     {
  61.  
  62.         double p = tab[k][k];
  63.  
  64.         if (p == 0)
  65.             osobliwa = true;
  66.         else
  67.         {
  68.             for (int i = k+1; i < N; i++)
  69.             {
  70.                 double q = tab[i][k] / p;
  71.                 for (int j = k; j < N+1; j++)
  72.                 {
  73.            
  74.                     tab[i][j] = tab[i][j] - q * tab[k][j];
  75.                 }
  76.             }
  77.  
  78.             gauss(k+1);
  79.         }
  80.     }
  81.     if (!osobliwa)
  82.     {
  83.         double d = 0.0;
  84.  
  85.         for(int i = k+1; i < N; i++)
  86.             d+=tab[k][i]*X[i];
  87.  
  88.         //X[k] = tab[k][N] / tab[k][N-1];
  89.         X[k] = (tab[k][N] + (-d)) / tab[k][N-(N-k)];
  90.     }
  91.    
  92. }
  93.  
  94. void wypiszTablice()
  95. {
  96.    
  97.     for (int i=0; i < N; i++)
  98.     {
  99.         for (int j = 0; j < N+1; j++)
  100.         {
  101.             if (j < N) cout << "a[" << i+1 << "," << j+1 << "]=" << tab[i][j] << "\t";
  102.             else cout << "b[" << i+1 << "]=" << tab[i][j];
  103.            
  104.         }
  105.  
  106.         cout << endl;
  107.     }
  108. }
  109.  
  110. void wczytajTablice()
  111. {
  112.     cout << "\n\tPodaj wspolczynniki: " << endl;
  113.     for (int i=0; i < N; i++)
  114.         for (int j = 0; j < N; j++)
  115.         {
  116.             cout << "Podaj a[" << i+1 << "," << j+1 << "]=";
  117.             cin >> tab[i][j];
  118.         }
  119.  
  120.     cout << "\n\tPodaj wyrazy wolne: " << endl;
  121.     for (int i = 0; i < N; i++)
  122.     {
  123.         cout << "Podaj b[" << i+1 << "]=";
  124.         cin >> tab[i][N];
  125.     }
  126. }
  127.  
  128. void czy_osobliwa()
  129. {
  130.  
  131.     double det = 0.0;
  132.    
  133.     if (N == 2)
  134.         det = tab[0][0] * tab [1][1] - tab [0][1] * tab [1][0];
  135.    
  136.     if (N == 3)
  137.         det = tab[0][0] * tab[1][1] * tab[2][2] + tab [1][0] * tab[2][1] * tab[0][2] + tab[2][0] * tab[0][1] * tab[1][2] - tab[0][2] * tab[1][1] * tab[2][0] - tab[1][2] * tab[2][1] * tab[0][0] - tab[2][2] * tab [0][1] * tab[1][0];
  138.  
  139.     if (det == 0)
  140.         osobliwa = true;
  141.    
  142. }
  143. int main()
  144. {
  145.    
  146.  
  147.     cout << "\n\t\tRozwiazywanie rownan metoda Gaussa" << endl;
  148.  
  149.     cout << "\n\tPodaj wymiar: ";
  150.    
  151.     cin >> N;
  152.  
  153.     wczytajTablice();
  154.  
  155.     cout << "\n\n\tPodana tablica: " << endl;
  156.     wypiszTablice();
  157.  
  158.     if(!osobliwa)
  159.     {
  160.         przeksztalc(N);
  161.        
  162.         gauss(0);
  163.  
  164.         if(!osobliwa)
  165.         {
  166.        
  167.             cout << "\n\n\tPodana tablica po przeksztalceniu: " << endl;
  168.        
  169.             wypiszTablice();
  170.        
  171.             cout<< "\n\n\tRozwiazanie ukladu rownan: " << endl;
  172.        
  173.             for (int i = 0; i < N; i++)
  174.                 cout <<"X[" << i+1 << "]=" << X[i] << endl;
  175.         }
  176.         else cout << "Podana macierz jest osobliwa!" << endl;;
  177.  
  178.     }
  179.  
  180.     else cout << "Podana macierz jest osobliwa!" << endl;;
  181.  
  182.  
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement