Advertisement
Guest User

Untitled

a guest
May 21st, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <sstream>
  4. #include <string>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. void rysujMacierz(double ** elem, int dim, int dim2, int first_col = 0)
  10. {
  11. cout << setprecision(7) << fixed;
  12.  
  13. for(int i = 0; i < dim; i++)
  14. {
  15. for(int j = first_col; j < dim2; j++)
  16. {
  17. cout << setw(12) << elem[i][j] << " ";
  18. }
  19. cout << endl;
  20. }
  21. }
  22.  
  23. void rysujWektor(double * elem, int dim)
  24. {
  25. cout << setprecision(7) << fixed;
  26.  
  27. for(int i = 0; i < dim; i++)
  28. {
  29. cout << setw(12) << elem[i] << " ";
  30. }
  31. cout << endl;
  32. }
  33.  
  34. int main()
  35. {
  36. int dim;
  37. double ** macierz; //glowna macierz
  38. double * wektorB; //wektor wyrazow wolnych
  39. double * x; //rozwiazanie
  40. double * y;
  41.  
  42. dim = 4;
  43.  
  44. macierz = new double * [dim];
  45. wektorB = new double [dim];
  46. x = new double [dim + 1];
  47. y = new double [dim + 1];
  48.  
  49. for(int i = 0; i < dim; i++)
  50. {
  51. macierz[i] = new double [2 * dim];
  52. }
  53.  
  54. macierz[0][4] = 1.0;
  55. macierz[0][5] = 20.0;
  56. macierz[0][6] = -30.0;
  57. macierz[0][7] = -4.0;
  58.  
  59. macierz[1][4] = 4.0;
  60. macierz[1][5] = 20.0;
  61. macierz[1][6] = -6.0;
  62. macierz[1][7] = 50.0;
  63.  
  64. macierz[2][4] = 9.0;
  65. macierz[2][5] = -18.0;
  66. macierz[2][6] = 12.0;
  67. macierz[2][7] = -11.0;
  68.  
  69. macierz[3][4] = 16.0;
  70. macierz[3][5] = -15.0;
  71. macierz[3][6] = 14.0;
  72. macierz[3][7] = 130.0;
  73.  
  74. wektorB[0] = 0.0;
  75. wektorB[1] = 114.0;
  76. wektorB[2] = -5.0;
  77. wektorB[3] = 177.0;
  78.  
  79. cout << "\npodana macierz wspolczynnikow:" << endl;
  80.  
  81. rysujMacierz(macierz, dim, 2 * dim, dim);
  82.  
  83. cout << "\npodany wektor wyrazow wolnych:" << endl;
  84.  
  85. rysujWektor(wektorB, dim);
  86.  
  87.  
  88. //dolaczamy macierz jednostkowa
  89. for(int i = 0; i < dim; i++)
  90. {
  91. for(int j = 0; j < dim; j++)
  92. {
  93. if (i == j)
  94. {
  95. macierz[i][j] = 1.0;
  96. }
  97. else
  98. {
  99. macierz[i][j] = 0.0;
  100. }
  101. }
  102. }
  103.  
  104. cout << "\nMacierz klatkowa:" << endl;
  105.  
  106. rysujMacierz(macierz, dim, 2 * dim);
  107.  
  108.  
  109. //rozklad LU
  110. double e = 1e-9; //0
  111. double m;
  112.  
  113. int i;
  114. int j;
  115. int k;
  116.  
  117. for(i = 0; i < dim; i++)
  118. {
  119.  
  120. //czesciowy wybor elementu podstawowego
  121. if(fabsl(macierz[i][dim + i]) < e)
  122. {
  123. cout << "element na przekatnej zbyt zblizony zera!" << endl;
  124.  
  125. double wektor_mod_max = fabsl(macierz[i][dim + i]); // element o maksymalnym module.
  126. int k_max = i; // numer wiersza w ktorym znaleziono maks element
  127.  
  128. // szukamy elementu o maks. module
  129. // w elementach z kolumny i.
  130. for(int k = i; k < dim; k++)
  131. {
  132. if(fabsl(macierz[k][dim + i]) > wektor_mod_max)
  133. {
  134. wektor_mod_max = fabsl(macierz[k][dim + i]);
  135. k_max = k;
  136. }
  137. }
  138.  
  139. // jesli znaleziony element ma modul 0, konczymy.
  140. if(wektor_mod_max < e)
  141. {
  142. cout << "\nnie znaleziono elementu podstawowego roznego od zera - rozw. nie istnieje!";
  143. exit(-1);
  144. }
  145.  
  146. // jesli znaleziono element o module wiekszym niz 0, zamieniamy wiersze.
  147. // zamieniamy k_max-ty wiersz z i-tym wierszem.
  148.  
  149. double tmp;
  150.  
  151. for(int k = 0; k < i; k++)
  152. {
  153. // zamieniamy tylko fragmenty wiersza mac. L.
  154. tmp = macierz[k_max][k];
  155. macierz[k_max][k] = macierz[i][k];
  156. macierz[i][k] = tmp;
  157. }
  158.  
  159. for(int k = dim; k < 2 * dim; k++)
  160. {
  161. // Zamianiamy wiersz mac. U.
  162. tmp = macierz[k_max][k];
  163. macierz[k_max][k] = macierz[i][k];
  164. macierz[i][k] = tmp;
  165. }
  166.  
  167. cout << "zamieniono elementy z wiersza " << k_max + 1 << " z wierszem " << i + 1 << "." << endl;
  168.  
  169. rysujMacierz(macierz, dim, 2 * dim);
  170. }
  171.  
  172.  
  173. //gauss LU
  174. for(j = i + 1; j < dim; j++)
  175. {
  176. m = macierz[j][dim + i] / macierz[i][dim + i];
  177.  
  178. cout << "\nwspolczynnik m = " << macierz[j][dim + i] << " / " << macierz[i][dim + i] << "." << endl;
  179.  
  180. for(k = dim; k >= 0; k--)
  181. {
  182. macierz[j][dim + k] -= m * macierz[i][dim + k];
  183.  
  184. cout << "Element " << j << " " << dim + k << " -= " << m << " * " << macierz[i][dim + k] << "." << endl;
  185. }
  186.  
  187. // do macierzy jednostkowej z lewej wpisujemy wspolczynniki
  188. // uzywane przy eliminacji Gaussa.
  189.  
  190. macierz[j][i] = m;
  191. }
  192.  
  193. cout << "\nMacierz po kroku:" << endl;
  194. rysujMacierz(macierz, dim, 2 * dim);
  195. }
  196.  
  197.  
  198. //wyswietlamy macierze L i U
  199. cout << "\nMacierz L:" << endl;
  200.  
  201. rysujMacierz(macierz, dim, dim);
  202.  
  203. cout << "\nMacierz U:" << endl;
  204.  
  205. rysujMacierz(macierz, dim, 2 * dim, dim);
  206.  
  207. //obliczanie y i x
  208.  
  209. //y
  210. y[0] = wektorB[0];
  211.  
  212. for(i = 1; i < dim; i++)
  213. {
  214. y[i] = wektorB[i];
  215. for(j = 1; j < i + 1; j++)
  216. {
  217. y[i] = y[i] - macierz[i][j-1] * y[j - 1];
  218. }
  219. }
  220.  
  221. cout << "wektor y:" << endl;
  222.  
  223. rysujWektor(y, dim);
  224.  
  225. //x
  226. x[dim - 1] = y[dim - 1] / macierz[dim - 1][dim - 1 + dim];
  227.  
  228. for(i = dim - 1; i >= 0; i--)
  229. {
  230. x[i] = y[i];
  231.  
  232. for(j = i + 1; j < dim; j++)
  233. {
  234. x[i] = x[i] - macierz[i][j + dim] * x[j];
  235. }
  236. x[i] = x[i] / macierz[i][i + dim];
  237. }
  238.  
  239. cout << "Wektor x:" << endl;
  240.  
  241. rysujWektor(x, dim);
  242.  
  243.  
  244. system("PAUSE");
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement