Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // METODA ELIMINACJI GAUSSA
- // 20-10-2011, 27-10-2011
- // WOJCIECH RAK
- #include <iostream>
- #define _USE_MATH_DEFINES
- #include <math.h>
- #include <fstream>
- #include <string>
- using namespace std;
- double tab[100][100];
- int N;
- double X[100];
- bool osobliwa = false;
- void zamienWiersze (int a, int b)
- {
- double tmp = 0.0;
- for (int i = 0; i < N+1; i++)
- {
- tmp = tab[a][i];
- tab[a][i] = tab[b][i];
- tab[b][i] = tmp;
- }
- }
- void wypiszTablice();
- void przeksztalc( int m)
- {
- if (m > 1)
- {
- int max = 0;
- for (int i = N-m; i < N; i++)
- {
- if (tab[i][N-m] > tab[N-m][N-m])
- zamienWiersze(N-m,i);
- }
- //wypiszTablice();
- przeksztalc(m-1);
- }
- }
- void gauss(int k)
- {
- if( k < N)
- {
- double p = tab[k][k];
- if (p == 0)
- osobliwa = true;
- else
- {
- for (int i = k+1; i < N; i++)
- {
- double q = tab[i][k] / p;
- for (int j = k; j < N+1; j++)
- {
- tab[i][j] = tab[i][j] - q * tab[k][j];
- }
- }
- gauss(k+1);
- }
- }
- if (!osobliwa)
- {
- double d = 0.0;
- for(int i = k+1; i < N; i++)
- d+=tab[k][i]*X[i];
- //X[k] = tab[k][N] / tab[k][N-1];
- X[k] = (tab[k][N] + (-d)) / tab[k][N-(N-k)];
- }
- }
- void wypiszTablice()
- {
- for (int i=0; i < N; i++)
- {
- for (int j = 0; j < N+1; j++)
- {
- if (j < N) cout << "a[" << i+1 << "," << j+1 << "]=" << tab[i][j] << "\t";
- else cout << "b[" << i+1 << "]=" << tab[i][j];
- }
- cout << endl;
- }
- }
- void wczytajTablice()
- {
- cout << "\n\tPodaj wspolczynniki: " << endl;
- for (int i=0; i < N; i++)
- for (int j = 0; j < N; j++)
- {
- cout << "Podaj a[" << i+1 << "," << j+1 << "]=";
- cin >> tab[i][j];
- }
- cout << "\n\tPodaj wyrazy wolne: " << endl;
- for (int i = 0; i < N; i++)
- {
- cout << "Podaj b[" << i+1 << "]=";
- cin >> tab[i][N];
- }
- }
- void czy_osobliwa()
- {
- double det = 0.0;
- if (N == 2)
- det = tab[0][0] * tab [1][1] - tab [0][1] * tab [1][0];
- if (N == 3)
- 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];
- if (det == 0)
- osobliwa = true;
- }
- int main()
- {
- cout << "\n\t\tRozwiazywanie rownan metoda Gaussa" << endl;
- cout << "\n\tPodaj wymiar: ";
- cin >> N;
- wczytajTablice();
- cout << "\n\n\tPodana tablica: " << endl;
- wypiszTablice();
- if(!osobliwa)
- {
- przeksztalc(N);
- gauss(0);
- if(!osobliwa)
- {
- cout << "\n\n\tPodana tablica po przeksztalceniu: " << endl;
- wypiszTablice();
- cout<< "\n\n\tRozwiazanie ukladu rownan: " << endl;
- for (int i = 0; i < N; i++)
- cout <<"X[" << i+1 << "]=" << X[i] << endl;
- }
- else cout << "Podana macierz jest osobliwa!" << endl;;
- }
- else cout << "Podana macierz jest osobliwa!" << endl;;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement