Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cmath>
- using namespace std;
- int zliczacz(int &ile);
- double przepiszzpliku(double **tab, int ile, double *tab2);
- bool sprawdz(double **tab, int ile);
- double macierzD(double **tabD, int ile, double **tab);
- double odwrotnaD(double **tabD, int ile);
- double macierzLU(double **tabLU, int ile, double **tab);
- double mnozenie(double **tab, int ile, double **tabLU, double **tabD);
- double mnozenie2(double *tabdb, int ile, double *tab2, double **tabD);
- void czy(bool &wybor,int &iter,double &epsilon);
- double iks(double **tab, int ile, double **tab3, double **tabk,int iter,double epsilon,bool wybor, double **x);
- bool porownanie(double **tabk,double **x,double epsilon,int ile);
- int main()
- {
- int ile = 0,iter=0;
- bool flaga = true, flaga1 = true, wybor=false;
- zliczacz(ile);
- double epsilon;
- // cout << "Linii jest: " << ile << endl;
- double **tab = new double *[ile];
- // cout << "Flaga = " << flaga << endl;
- double **tabD = new double *[ile];
- double **tabLU = new double *[ile];
- double **tab3 = new double *[ile];
- double **tabk = new double *[ile];
- double **x = new double *[ile];
- for (int i = 0; i < ile; i++)
- {
- tab[i] = new double [ile];
- tabD[i] = new double [ile];
- tabLU[i] = new double [ile];
- tab3[i] = new double [ile];
- tabk[i] = new double [ile];
- x[i] = new double [ile];
- }
- double *tab2 = new double[ile];
- double *tabdb = new double[ile];
- **tab = przepiszzpliku(tab, ile, tab2);
- cout << "Wspolczynniki przy iksach (MACIERZ A) :" << endl;
- cout << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tab[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- cout << endl;
- cout << "Wyrazy wolne (JEDNOKOLUMNOWA MACIERZ B) : " << endl;
- for(int i = 0; i < ile; i++)
- {
- cout << tab2[i] <<endl;
- }
- cout << endl;
- flaga1 = sprawdz(tab, ile);
- //cout << "Flaga1: " << flaga1 << endl;
- //flaga = flaga1;
- cout<<endl;
- if(flaga1)
- {
- **tabD = macierzD(tabD, ile, tab);
- /* cout << endl;
- cout << endl;
- cout << "ELEMENTY MACIERZY D: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tabD[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;*/
- **tabD = odwrotnaD(tabD, ile);
- /* cout << "ELEMENTY MACIERZY D^-1: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tabD[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;*/
- **tabLU = macierzLU(tabLU, ile, tab);
- /* cout << "ELEMENTY MACIERZY L+U: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tabLU[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;*/
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tabD[i][j]=tabD[i][j]*(-1);
- }
- }
- **tab = mnozenie(tab, ile, tabLU, tabD);
- /* cout << "ELEMENTY MACIERZY TAB: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tab[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;*/
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tabD[i][j]=tabD[i][j]*(-1);
- }
- }
- *tabdb = mnozenie2(tabdb, ile, tab2, tabD);
- /* cout << "ELEMENTY MACIERZY TABDB: " << endl;
- for(int i = 0; i < ile; i++)
- {
- cout << tabdb[i] <<endl;
- }
- cout << endl;*/
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- x[i][j]=0;
- }
- }
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tab3[i][j]=0;
- }
- }
- for(int i = 0; i < ile; i++)
- {
- tab3[i][0]=tabdb[i];
- }
- /* cout << "ELEMENTY MACIERZY TAB3: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- cout << tab3[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- */
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tabk[i][j]=0;
- }
- }
- czy(wybor,iter,epsilon);
- **tabk = iks(tab, ile, tab3,tabk,iter,epsilon,wybor,x);
- cout << "Wyniki: " << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < 1; j++)
- {
- cout <<"x"<<i+1<<"= " <<tabk[i][j] << " ";
- }
- }
- cout << endl;
- }
- //flaga = false;
- return 0;
- }
- //*************************************************************************************
- int zliczacz(int &ile)
- {
- ifstream plik;
- string linia;
- plik.open("wspolczynniki.txt");
- if(plik.is_open())
- {
- while(!plik.eof())
- {
- getline(plik, linia);
- ile++;
- }
- //cout << "Zliczylo: " << ile << endl;
- }
- else
- cout << "Blad otwarcia pliku " << endl;
- plik.close();
- }
- //*************************************************************************************
- double przepiszzpliku(double **tab, int ile, double *tab2)
- {
- ifstream plik;
- int k = 0;
- // cout << "TERAZ ILE = " << ile << endl;
- plik.open("wspolczynniki.txt");
- if(plik.is_open())
- {
- cin.clear();
- cin.sync();
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile + 1; j++)
- {
- if(j == ile)
- {
- plik >> tab2[k];
- k++;
- }
- else
- {
- plik >> tab[i][j];
- }
- }
- }
- }
- else
- cout << "Blad otwarcia pliku" << endl;
- plik.close();
- return **tab;
- }
- //*************************************************************************************
- bool sprawdz(double **tab, int ile)
- {
- bool flaga2 = true;
- int licznik = 0;
- int maks = ile-1;
- double suma1 = 0, suma2 = 0, suma3 = 0;
- // cout << "Sprawdza czy spelnia warunki zbieznosci: " << endl;
- for(int j = 0; j < ile; j++)
- {
- suma1 = suma1 + tab[maks][j];
- }
- suma1 = abs(suma1);
- for(int i=0; i < ile; i++)
- {
- suma2 = suma2 + tab[i][maks];
- }
- suma2 = abs(suma2);
- // cout << "Suma1 = " << suma1 << endl;
- // cout << "Suma2 = " << suma2 << endl;
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- suma3 = suma3 + tab[i][j];
- }
- }
- suma3 = sqrt(abs(suma3*suma3));
- double pomoc=1;
- for(int i=0; i<ile; i++)
- {
- pomoc=pomoc*tab[i][i];
- }
- //cout << "Suma3 = " << suma3 << endl;
- if(pomoc!=0)
- {
- if(suma1 < 1 || suma2 < 1 || suma3 < 1 )
- {
- flaga2 = true;
- }
- else
- flaga2 = false;
- if(flaga2)
- {
- cout << "Spelnia warunki zbieznosci " << endl;
- }
- else
- cout << "Nie spelnia warunkow zbieznosci " << endl;
- }
- else
- {
- cout<<"Wyznacznik macierzy diagonalnej musi byc rozny od 0"<<endl;
- flaga2 = false;
- }
- return flaga2;
- }
- //*************************************************************************************
- double macierzD(double **tabD, int ile, double **tab)
- {
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- if( i == j)
- {
- tabD[i][j] = tab[i][j];
- }
- else
- tabD[i][j] = 0;
- }
- }
- return **tabD;
- }
- //*************************************************************************************
- double odwrotnaD(double **tabD, int ile)
- {
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- if( i == j)
- {
- tabD[i][j] = 1 / tabD[i][j];
- }
- }
- }
- return **tabD;
- }
- //*************************************************************************************
- double macierzLU(double **tabLU, int ile, double **tab)
- {
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- if( i == j)
- {
- tabLU[i][j] = 0;
- }
- else
- tabLU[i][j] = tab[i][j];
- }
- }
- return **tabLU;
- }
- //************************************************************************************
- double mnozenie(double **tab, int ile, double **tabLU, double **tabD)
- {
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tab[i][j]=0;
- }
- }
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- for(int k = 0; k < ile; k++)
- {
- tab[i][j]=tab[i][j]+tabD[i][k]*tabLU[k][j];
- }
- }
- }
- return **tab;
- }
- //*********************************************************************************
- double mnozenie2(double *tabdb, int ile, double *tab2, double **tabD)
- {
- for(int j = 0; j < ile; j++)
- {
- tabdb[j]=0;
- }
- for(int i = 0; i < ile; i++)
- {
- tabdb[i] = tabdb[i] + tabD[i][i] * tab2[i];
- }
- return *tabdb;
- }
- //*******************************************************************************
- void czy(bool &wybor,int &iter,double &epsilon)
- {
- int a;
- cout<<"1 - iteracje"<<endl;
- cout<<"2 - epsilon";
- cin>>a;
- switch (a)
- {
- case 1:
- cout<<"Podaj ilosc iteracji";
- cin>>iter;
- wybor=true;
- break;
- case 2:
- cout<<"Podaj epsilon";
- cin>>epsilon;
- break;
- }
- }
- double iks(double **tab, int ile, double **tab3, double **tabk,int iter,double epsilon,bool wybor, double **x)
- {
- bool doep=true;
- if(wybor)
- {
- for(int k=0; k<iter; k++)
- {
- **tabk=mnozenie(tabk,ile,x,tab);
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tabk[i][j]=tabk[i][j]+tab3[i][j];
- }
- }
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- x[i][j]=tabk[i][j];
- }
- }
- }
- }
- else
- {
- while(doep)
- {
- **tabk=mnozenie(tabk,ile,x,tab);
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- tabk[i][j]=tabk[i][j]+tab3[i][j];
- }
- }
- if(porownanie(tabk,x,epsilon,ile))
- {
- doep=false;
- }
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- x[i][j]=tabk[i][j];
- }
- }
- }
- for(int i = 0; i < ile; i++)
- {
- for(int j = 0; j < ile; j++)
- {
- x[i][j]=tabk[i][j];
- }
- }
- }
- return **tabk;
- }
- bool porownanie(double **tabk,double **x,double epsilon,int ile)
- {
- double pom;
- bool pom2;
- for(int i=0; i<ile; i++)
- {
- pom=tabk[i][0]-x[i][0];
- pom=abs(pom);
- if(pom>epsilon)
- {
- pom2=false;
- }
- else pom2=true;
- }
- return pom2;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement