Guest User

Untitled

a guest
Aug 10th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 KB | None | 0 0
  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. //---------------------------------------------------------------------------
Add Comment
Please, Sign In to add comment