Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.82 KB | None | 0 0
  1. #include<iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include<cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. //maksymalny rozmiar macierzy
  9. #define MAX 100
  10.  
  11.  
  12. //Dane początkowe
  13. int N;//rozmiar macierzy
  14. int MLI;//maksymalna liczba iteracji
  15. double e;//dokładność e
  16.  
  17. //Macierze i wektory wykorzystywane w programie
  18. double Macierz_A[MAX][MAX];
  19. double Wektor_B[MAX];
  20. double Wektor_X[MAX];
  21. double Macierz_Alfa[MAX][MAX];
  22. double Wektor_Beta[MAX];
  23. double Wektor_R[MAX];
  24. double Wektor_Pierwszej_Poprawki[MAX];
  25.  
  26.  
  27.  
  28.  
  29. bool wczytaj_Z_Pliku_Wejsciowego(string fileName)//wczytuje macierz A oraz wektory B i X
  30. {
  31. //wprowadzenie danych początkowych
  32. cout << "Wprowadz N: ";
  33. cin >> N;
  34. cout << "Wprowadz MLI: ";
  35. cin >> MLI;
  36. cout << "Wprowadz e: ";
  37. cin >> e;
  38.  
  39. //otwarcie pliku tekstowego
  40. ifstream plik;
  41. plik.open(fileName);
  42.  
  43. double bufor;
  44.  
  45. if (!plik.is_open())//jeśli nie udało się otworzyć pliku
  46. {
  47. cout << "Nie odnaleziono pliku wejściowego!" << endl;
  48. return false;
  49. }
  50. else
  51. {
  52. for (int i = 0; i < N; i++)//wczytanie macierzy A
  53. {
  54. for (int j = 0; j < N; j++)
  55. {
  56. plik >> bufor;
  57. Macierz_A[i][j] = bufor;
  58. }
  59. }
  60.  
  61. for (int i = 0; i < N; i++)//wczytanie wektora B
  62. {
  63. plik >> bufor;
  64. Wektor_B[i] = bufor;
  65. }
  66.  
  67. for (int i = 0; i < N; i++)//wczytanie wektora X
  68. {
  69. plik >> bufor;
  70. Wektor_X[i] = bufor;
  71. }
  72. return true;
  73. }
  74. }
  75.  
  76.  
  77. void drukuj_Dane_Wejsciowe()
  78. {
  79.  
  80. for (int i = 0; i < N; i++)
  81. {
  82. for (int j = 0; j < N; j++)
  83. {
  84. cout << Macierz_A[i][j] << " ";
  85. }
  86. cout << endl;
  87. }
  88.  
  89. cout << endl << endl << "Wektor B" << endl;;
  90. for (int i = 0; i < N; i++)
  91. cout << Wektor_B[i] << " ";
  92.  
  93. cout << endl << endl << "Wektor X" << endl;
  94. for (int i = 0; i < N; i++)
  95. cout << Wektor_X[i] << " ";
  96.  
  97.  
  98. }
  99.  
  100. void stworz_Macierz_Alfa()//tworzenie macierzy alfa
  101. {
  102. bool dzielenie_przez_zero = false;
  103. for (int i = 0; i < N; i++)
  104. {
  105. for (int j = 0; j < N; j++)
  106. {
  107. if (i == j)
  108. {
  109. Macierz_Alfa[i][j] = 0;
  110. }
  111. else
  112. {
  113. if (Macierz_A[i][i] == 0)//jeżeli zero w mianowniku
  114. {
  115. cout << "Blad dzielenia przez zero" << endl;
  116. dzielenie_przez_zero = true;
  117. break;
  118. }
  119. else
  120. {
  121. Macierz_Alfa[i][j] = -Macierz_A[i][j] / Macierz_A[i][i];
  122. }
  123. }
  124. }
  125.  
  126. if (dzielenie_przez_zero)//jeżeli wystšpi dzielenie przez zero
  127. break;
  128. }
  129.  
  130. }
  131.  
  132.  
  133. void stworz_Wektor_Beta()//tworzenie wektora beta
  134. {
  135.  
  136. for (int i = 0; i < N; i++)
  137. {
  138. if (Macierz_A[i][i] == 0)//jeżeli zero w mianowniku
  139. {
  140. cout << "Blad dzielenia przez zero" << endl;
  141. break;
  142. }
  143. else
  144. {
  145. Wektor_Beta[i] = Wektor_B[i] / Macierz_A[i][i];
  146. }
  147. }
  148. }
  149.  
  150.  
  151. int funkcja_Glowna_Algorytmu()//funkcja wykonująca iterajce i testujaca warunek stopu
  152. {
  153. int a = 0;
  154. for (int i = 0; i < N; i++)//tworzenie tablicy
  155. {
  156. if (Wektor_X[i] == 0)
  157. {
  158. a++;
  159. }
  160. }
  161.  
  162. if (a == N)//wektor X jest zerowy
  163. {
  164. cout << "WEKTOR JEST ZEROWY" << endl;
  165. for (int i = 0; i < N; i++)
  166. {
  167. Wektor_R[i] = Wektor_Beta[i];
  168. }
  169. }
  170.  
  171.  
  172. double rs = abs(Wektor_R[0]);//bufor na dane
  173. int s = 0;//indeks elementu w tabilcy R
  174.  
  175. for (int i = 0; i < N; i++)//znajdowanie maksymalnego elementu
  176. {
  177. if (abs(Wektor_R[i]) >= rs)
  178. {
  179. rs = abs(Wektor_R[i]);
  180. s = i;
  181. cout << rs << endl;
  182. }
  183. }
  184. cout << "Maksymalny element: " << rs << endl;
  185.  
  186. //wektor pierwszej poprawki
  187. for (int i = 0; i < N; i++)
  188. {
  189. if (i == s)
  190. Wektor_Pierwszej_Poprawki[i] = Wektor_R[s];
  191. else
  192. Wektor_Pierwszej_Poprawki[i] = 0;
  193. }
  194.  
  195.  
  196. int it = 0;//licznik iteracji
  197.  
  198. do
  199. {
  200. Wektor_X[s] += Wektor_R[s];
  201.  
  202. for (int i = 0; i < N; i++)
  203. {
  204. if (i != s)
  205. Wektor_R[i] += (Macierz_Alfa[i][s] * Wektor_R[s]);
  206. }
  207. cout << "e = " << Wektor_R[s] << endl;
  208. Wektor_R[s] = 0;
  209.  
  210. rs = abs(Wektor_R[s]);
  211. s = 0;
  212.  
  213. for (int i = 0; i < N; i++)//znajdowanie maksymalnego elementu
  214. {
  215. if (abs(Wektor_R[i]) >= rs)
  216. {
  217. rs = abs(Wektor_R[s]);
  218. s = i;
  219. }
  220. }
  221. cout << "Nowy maksymalny element: " << rs << endl;
  222.  
  223. it++;
  224. } while (it<MLI && rs > e);
  225.  
  226. cout << "ostatnie e= " << rs<<endl;
  227. return it;
  228. }
  229.  
  230. void generuj_Raport()
  231. {
  232. ofstream plik;
  233. plik.open("raport.txt");
  234. if (!plik.is_open())//jeżeli wystąpił błąd przy otwarciu pliku
  235. {
  236. cout << "Wystapil blad przy tworzeniu pliku" << endl;
  237. }
  238. else
  239. {
  240. plik << "Raport wykonaywania algorytmu relaksacji: " << endl << endl;;
  241. plik << "Dane wejściowe: " << endl;
  242. plik << "Macierz A: " << endl;
  243.  
  244. for (int i = 0; i < N; i++)
  245. {
  246. for (int j = 0; j < N; j++)
  247. {
  248. plik << Macierz_A[i][j] << " ";
  249. }
  250. plik << endl;
  251. }
  252.  
  253. plik << endl<<"Wektor B: " << endl;
  254.  
  255. for (int i = 0; i < N; i++)
  256. plik << Wektor_B[i] << endl;
  257.  
  258. plik << "Dokładność e= " << e << endl;
  259. plik << "Maksymalna liczba iteracji= " << MLI<<endl;
  260.  
  261. plik << "Macierz alfa: " << endl;
  262. for (int i = 0; i < N; i++)
  263. {
  264. for (int j = 0; j < N; j++)
  265. plik << Macierz_Alfa[i][j] << " ";
  266. plik << endl;
  267. }
  268. plik << endl;
  269.  
  270. plik << "Wektor beta: " << endl;
  271. for (int i = 0; i < N; i++)
  272. plik << Wektor_Beta[i] << endl;
  273.  
  274. plik << "Wektor residuum: " << endl;
  275. for (int i = 0; i < N; i++)
  276. plik << Wektor_R[i] << endl;
  277.  
  278. plik << "Wektor przybliżonego rozwiązania: " << endl;
  279. for (int i = 0; i < N; i++)
  280. plik << endl;
  281.  
  282. plik << endl << "Wektor X: " << endl;
  283. for (int i = 0; i < N; i++)
  284. plik<< Wektor_X[i] << endl;
  285. }
  286. }
  287.  
  288.  
  289. int main()
  290. {
  291.  
  292.  
  293. /*
  294. bool wczytaj_Z_Pliku_Wejsciowego(string fileName);
  295. printMatrix();
  296. void stworz_Macierz_Alfa();
  297. void stworz_Wektor_Beta();
  298. int FunkcjaGlownaAlgorytmu();
  299. */
  300.  
  301. wczytaj_Z_Pliku_Wejsciowego("input.txt");
  302. stworz_Macierz_Alfa();
  303. stworz_Wektor_Beta();
  304. int it = funkcja_Glowna_Algorytmu();
  305. cout << "Liczba iteracji: " << it << endl;
  306.  
  307. generuj_Raport();
  308.  
  309.  
  310. return 0;
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement