Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <iomanip>
  6. #include <math.h>
  7.  
  8. double EPS = 1.0e-10;
  9. const int SIZE = 4;
  10.  
  11. void printMatrix(double arr[][SIZE]) {
  12. for(int i=0;i<SIZE;i++)
  13. {
  14. for (int j = 0; j < SIZE; j++)
  15. {
  16. std::cout << arr[i][j] << " ";
  17. }
  18. std::cout << std::endl;
  19. }
  20. std::cout << std::endl;
  21. }
  22. void printVector(double arr[]){
  23. for (int i = 0; i < SIZE; i++) {
  24. std::cout << arr[i] << std::endl;
  25. }
  26. std::cout << "\n\n";
  27. }
  28. void printVectorB(double* b) {
  29. for (int i = 0; i < SIZE; i++) {
  30. std::cout << *(b + i) << std::endl;
  31. }
  32. std::cout << "\n\n";
  33. }
  34. int max(double arr[][SIZE], int kol){
  35. double max = 0;
  36. int maxID = 0;
  37. for (int i = 0; i < SIZE; i++)
  38. {
  39. if (fabs(arr[i][kol]) > max)
  40. {
  41. max = fabs(arr[i][kol]);
  42. maxID = i;
  43. }
  44. }
  45. return maxID;
  46. }
  47. double* opV(double wektor[], double piv[][SIZE], int swaps[][2]){
  48. static double vect[SIZE];
  49. for (int i = 0; i < SIZE; i++)
  50. {
  51. vect[i] = wektor[i];
  52. }
  53. for (int i = 0; i < SIZE; i++)
  54. {
  55. while (swaps[i][0] != swaps[i][1]) {
  56. std::swap(vect[swaps[i][0]], vect[swaps[i][1]]);
  57. std::cout << "Zamieniam " << swaps[i][0] << " z " << swaps[i][1] << std::endl;
  58. break;
  59. }
  60. }
  61. //std::cout << "Po zamianie wierszy: ";
  62. //printVector(vect);
  63. for (int k = 0; k < SIZE; k++)
  64. {
  65. for (int i = 1; i < SIZE; i++)
  66. {
  67. if (k < i){
  68. vect[i] -= (vect[k]*piv[i][k]);
  69. }
  70. }
  71. }
  72. return vect;
  73. }
  74. int main() {
  75. //Napisz program w języku „C/C++”, realizujący dekompozycję LU macierzy A, przy zastosowaniu
  76. //eliminacji Gaussa z częściowym wyborem elementu podstawowego, a następnie rozwiązujący układ
  77. //równań Ax = b.
  78. //
  79. double A[SIZE][SIZE] = {{1.,20.,-30.,-4.}, {4.,20.,-6.,50.}, {9.,-18.,12.,-11.}, {16.,-15.,14.,130.}};
  80. double B[SIZE] = {0. , 114., -5., 177.};
  81.  
  82. //double A[SIZE][SIZE] = { {6.,-2.,2.,4.}, {12.,-8.,6.,10.}, {3.,-13.,9.,3.}, {-6.,4.,1.,-18.} };
  83. //double B[SIZE] = { 12.,34.,27.,-38. };
  84.  
  85. double L[SIZE][SIZE] = { {1.,0.,0.,0.},{0.,1.,0.,0.},{0.,0.,1.,0.},{0.,0.,0.,1.} };
  86. double X[SIZE] = {};
  87. int zamiany[SIZE][2] = {{0,0},{0,0},{0,0},{0,0}};
  88. int id = 0;
  89. printMatrix(A);
  90. //A = L * U
  91. //1.operacja na macierzy A
  92. for (int k = 0; k < SIZE; k++)//kolumny
  93. {
  94. for (int i = 1; i < SIZE; i++)//wiersze
  95. {
  96. if (k < i) // elementy pod przekątną
  97. {
  98. if (A[k][k] == 0.) // jezeli el na przekatnej == 0 to nie mozemy przez niego podzielic
  99. {
  100. int maxIndex = max(A, k);
  101. double wiersz[SIZE];
  102.  
  103. for (int i = 0; i < SIZE; i++)
  104. {
  105. wiersz[i] = A[maxIndex][i]; //zapisanie wartosci wiersza do zamiany
  106. }
  107.  
  108. for (int i = 0; i < SIZE; i++) //zamiana wiersza
  109. {
  110. A[maxIndex][i] = A[k][i];
  111. A[k][i] = wiersz[i];
  112. }
  113. zamiany[id][0] = k;
  114. zamiany[id][1] = maxIndex;
  115. std::cout<< "Do zamiany wyrazy o indexach " << zamiany[id][0] << " z " << zamiany[id][1]<<"\n" << std::endl;
  116. id++;
  117. }
  118. double pivot = A[i][k] / A[k][k];
  119. L[i][k] = pivot; //mnoznik
  120. for (int col = 0; col < SIZE; col++)//kolumny
  121. {
  122. A[i][col] -= (A[k][col] * pivot);
  123. }
  124. //B[i] -= (B[k] * pivot);
  125. }
  126. }
  127. }
  128. printMatrix(A);
  129. printMatrix(L);
  130. //operacja na wektorze b
  131. double* b = opV(B, L, zamiany);
  132. //std::cout << "B po operacjach wierszy: ";
  133. printVectorB(b);
  134. //wyliczenie x
  135. for (int i = SIZE - 1; i >= 0; --i) {
  136. double temp = 0;
  137. for (int j = i + 1; j < SIZE; ++j) {
  138. temp += A[i][j] * X[j];
  139. }
  140. X[i] = ((*(b+i)) - temp) / A[i][i];
  141. }
  142. printVector(X);
  143. getchar();
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement