daily pastebin goal
51%
SHARE
TWEET

Untitled

a guest Aug 10th, 2018 60 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <math.h>
  5. #include <fstream>
  6. #include <string>
  7. #include <stdlib.h>
  8.  
  9. using namespace std;
  10.  
  11. //---------------------------------------------------------------------------
  12.  
  13. #define typ double      //w drugiej wersji testow – typ float
  14. #define MAXN 101
  15. int n;
  16. typ epsilon;
  17. int MLI;
  18. typ Alfa[MAXN][MAXN];
  19. typ Beta[MAXN];
  20. typ A[MAXN][MAXN];
  21. typ B[MAXN];
  22. typ x_poprzedni[MAXN];
  23. typ x_aktualny[MAXN];
  24. typ Xk1[MAXN];
  25. typ Xk[MAXN];
  26. int iter=0;
  27.  
  28. //---------------------------------------------------------------------------
  29.  
  30. int funkcja_a()
  31. {
  32.     int i,j;
  33.     char nazwaPliku[64];
  34.  
  35. cout << "Podaj n: ";                    //czytanie z klawiatury: n, epsilon i MLI
  36. cin >> n;
  37. cout << "Podaj epsilon: ";
  38. cin >> epsilon;
  39. cout << "Podaj MLI: ";
  40. cin >> MLI;
  41. cout << "Podaj nazwe pliku wejsciowego: ";
  42.     cin >> nazwaPliku;                            //pobranie nazwy pliku z klawiatury
  43.  
  44.     ifstream plik(nazwaPliku);
  45.  
  46.     if(! plik.is_open())    //sprawdzenie, czy plik o podanej nazwie moze zostac wykorzystany
  47.         return 0;       //funkcja zwraca zero jezeli jest to niemozliwe
  48.  
  49.     for(i = 1; i <= n; i++)             //wczytanie macierzy A z pliku
  50.         for(j = 1; j <= n; j++)
  51.             plik >> A[i][j];
  52.  
  53.     for(i = 1; i <= n; i++)             //wczytanie wektora B z pliku
  54.             plik >> B[i];
  55.  
  56.     plik.close();              //zamkniecie pliku
  57.     return 1;                  //funkcja zwraca 1 jezeli plik został poprawnie wykorzystany
  58. }
  59.  
  60. //---------------------------------------------------------------------
  61.  
  62. int funkcja_b()
  63. {
  64.     for(int i=1;i<n+1;i++)
  65.     {
  66.         if(A[i][i]!=0)
  67.         {
  68.             Beta[i]=B[i]/A[i][i];               //obliczanie wartosci macierzy Beta
  69.             for(int j=1;j<n+1;j++)
  70.             {
  71.                 if(i==j) Alfa[i][j]=0;      //obliczanie wartosci macierzy Alfa
  72.                 else Alfa[i][j]=-(A[i][j]/A[i][i]);
  73.             }
  74.  
  75.         }
  76.         else return 0;                  //funkcja zwraca zero jezeli niemożliwe
  77. //jest obliczenie macierzy Alfa i Beta
  78.     }
  79.     return 1;       //funkcja zwraca 1 jezeli obliczenie macierzy Alfa i Beta byly mozliwe
  80. }
  81.  
  82. //---------------------------------------------------------------------
  83.  
  84. void funkcja_c()
  85. {
  86.     for(int i=1;i<n+1;i++)
  87.         x_aktualny[i]=Beta[i];
  88.  
  89.     typ norma=0.0;
  90.     typ suma=0.0;
  91. typ pom=0.0;
  92.  
  93.     do
  94.     {
  95.         for(int i=1;i<n+1;i++)          // przepisanie aktualnego wektora rozwiązań
  96.             x_poprzedni[i]=x_aktualny[i];   // jako rozwiązanie poprzednie
  97.  
  98.         iter++;                     //inkrementacja licznika iteracji
  99.  
  100.             for(int i=1;i<n+1;i++)          //wyznaczanie aktualnego wektora
  101.         {
  102.             pom=0.0;
  103.                         for(int j=1;j<n+1;j++)
  104.                 if(j!=i)
  105.                     pom+=(Alfa[i][j]*x_poprzedni[j]);
  106.             x_aktualny[i]=pom+Beta[i];
  107.         }
  108.  
  109.         //obliczanie normy
  110.  
  111.         suma=0;
  112.         for(int i=1;i<n+1;i++)
  113.             suma+=((x_aktualny[i]-x_poprzedni[i])*(x_aktualny[i]-x_poprzedni[i]));
  114.         norma=sqrt(suma/n);
  115.     }
  116.     while((iter<MLI)&&(norma>epsilon));
  117. }
  118.  
  119. //---------------------------------------------------------------------
  120.  
  121. int funkcja_d(bool zm)
  122. {
  123. char raport[64];
  124. cout << "Podaj nazwe pliku zawierajacego raport: ";
  125. cin >> raport;
  126. ofstream plik(raport);
  127.  
  128. if(! plik.is_open())        //sprawdzenie, czy plik o podanej nazwie zostal utworzony
  129.         return 0;           //funkcja zwraca zero jezeli jest to niemozliwe
  130.     plik<<"Macierz A:"<<endl;       //wpisanie macierzy A do pliku zawierającego raport
  131.     for(int i=1;i<n+1;i++)
  132.             {
  133.                 for(int j=1;j<n+1;j++)
  134.                 plik<<"\t"<<A[i][j];
  135.                 plik<<endl;
  136.             }
  137.     plik<<endl;
  138.     plik<<"Wektor B:"<<endl;        //wpisanie wektora B do pliku zawierającego raport
  139.  
  140.     for(int i=1;i<n+1;i++)
  141.         plik<<"\t"<<B[i];
  142.    
  143.     plik<<endl<<endl;
  144.     plik<<"epsilon = "<<epsilon<<endl;
  145.     plik<<"MLI = "<<MLI<<endl;
  146.  
  147.     if(zm==true)     //sprawdzenie czy dla podanych danych można skorzystac z metody Jakobiego
  148.     {
  149.         plik<<"\nMacierz Alfa:"<<endl;  //wpisanie macierzy Alfa do pliku zawier. raport
  150.             for(int i=1;i<n+1;i++)
  151.                 {
  152.                     for(int j=1;j<n+1;j++)
  153.                     plik<<"\t"<<Alfa[i][j];
  154.                     plik<<endl;
  155.                 }
  156.  
  157.             plik<<"\nWektor Beta:"<<endl;   //wpisanie wektora Beta do pliku zawier. raport
  158.  
  159.             for(int i=1;i<n+1;i++)
  160.                 plik<<"\t"<<Beta[i];
  161.  
  162.             plik.precision(20);
  163.             plik<<"\n\nLiczba wykonanych iteracji wynosi "<<iter<<endl;
  164.             plik.setf(ios::scientific,ios::floatfield); //zmiana trybu wyswietlania liczb
  165.  
  166.             plik<<"\n\nWektor ostatnio wykonanej iteracji:"<<endl;
  167.             for(int k=1;k<n+1;k++)
  168.                 plik<<"\t"<<x_aktualny[k]<<endl;
  169.  
  170.             plik<<"\n\nWektor przedostatnio wykonanej iteracji:"<<endl;
  171.             for(int k=1;k<n+1;k++)
  172.                 plik<<"\t"<<x_poprzedni[k]<<endl;
  173.     }
  174.     else plik<<"\n\nDla podanych danych niemozliwe jest obliczenie rozwiazania metoda Jacobiego.";
  175.  
  176.     plik.close();
  177. }
  178.  
  179. //---------------------------------------------------------------------
  180.  
  181. int main(int argc, char* argv[])
  182. {
  183.     bool zm=false;
  184.     if(funkcja_a()==1)
  185.     {
  186.         if(funkcja_b()==1)
  187.         {
  188.             funkcja_c();
  189.             zm=true;
  190.         }
  191.         funkcja_d(zm);
  192.     }
  193.     else cout<<"Plik o podanej nazwie nie moze zostac wykorzystany w programie."<<endl;
  194.  
  195.     system("PAUSE");
  196.     return 0;
  197. }
  198.  
  199. //---------------------------------------------------------------------------
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top