Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <map>
  4.  
  5. using namespace std;
  6. const int n = 10;
  7. double getValue(map<int, double> &matrix, int i, int j) {
  8. // значения в map-е хранятся по ключу, где ключ - это такой индекс одномерного массива
  9. // который позволяет хранить данные для двумерного массива, т.е., все строки двумерной
  10. // матрицы лежат в одномерном массиве со смещением i*n (n-длина строки)
  11.  
  12. if (matrix.count(i * n + j)) // функция count возвращает кол-во элементов по ключу (для map 1, если элемент есть, или 0, если нет)
  13. return matrix[i * n + j]; // Возвращаем элемент, который лежит по указанному ключу
  14. return 0; // Если нет такого элемента, возвращаем 0
  15. }
  16.  
  17. // setValue вставляет значение в map, игнорируя равные нулю элементы
  18.  
  19. void setValue(map<int, double> &matrix, int i, int j, double value) {
  20. if (value) // если добавляемое значение отлично от 0
  21. matrix[i * n + j] = value; // добавляем его в map
  22. else
  23. matrix.erase(i * n + j); // Если равно 0, не добавляем его, а если раньше по этому адресу что-то лежало, удаляем
  24. }
  25.  
  26. // Печать матрицы, лежащей в map
  27.  
  28. void print(map<int, double> &matrix) {
  29. for (int i = 0; i < n; i++) {
  30. for (int j = 0; j < n; j++)
  31. cout << getValue(matrix, i, j) << " ";
  32. cout << endl;
  33. }
  34. cout << endl;
  35. }
  36.  
  37. // Метод Гауса для решения СЛАУ
  38.  
  39. void gauss(map<int, double> &matrix, double y[n], double x[n]) {
  40. cout << "Размер контейнера: " << matrix.size() << endl; // вывод размера map
  41. for (int k = 0; k < n; k++){ // проходим по строкам матрицы
  42.  
  43. // Приведение левой части к треугольному виду:
  44.  
  45. for (int i = k; i < n; i++){
  46. double temp = getValue(matrix, i, k);
  47. if (!abs(temp)) continue; // для нулевого коэффициента пропускаем
  48. for (int j = 0; j < n; j++)
  49. setValue(matrix, i, j, getValue(matrix, i, j) / temp);
  50. y[i] = y[i] / temp;
  51. if (i == k) continue; // избегаем вычитание ур-ия из самого себя
  52. for (int j = 0; j < n; j++)
  53. setValue(matrix, i, j, getValue(matrix, i, j) - getValue(matrix, k, j));
  54. y[i] = y[i] - y[k];
  55. }
  56. }
  57.  
  58. print(matrix);
  59. cout << "Размер контейнера: " << matrix.size() << endl; // вывод размера map
  60.  
  61. // обратная подстановка (обратный ход метода Гаусса)
  62.  
  63. for (int k = n - 1; k >= 0; k--) {
  64. x[k] = y[k];
  65. for (int i = 0; i < k; i++)
  66. y[i] = y[i] - getValue(matrix, i, k) * x[k];
  67. }
  68. }
  69.  
  70. int main() {
  71. map<int, double> matrix; // map для хранения упакованной матрицы
  72. double b[n], x[n];
  73. // Заполнение матрицы упаковкой её в map
  74. for (int i = 0; i < n; i++)
  75. {
  76. matrix[(n - i - 1) * n + i] = 100;
  77. matrix[(n-i - 4) * n + i] = 15;
  78. }
  79.  
  80. // Вывод исходной матрицы
  81. print(matrix);
  82.  
  83. // заполнение вектора b:
  84.  
  85. for (int i = 0; i < n; i++) b[i] = pow(-1,i)*n;
  86.  
  87. // Заполнение вектора b для тестового примера:
  88.  
  89. /*
  90.  
  91. for (int i = 0; i < n; i++) {
  92.  
  93. // решение: x[i] = 1, i=0..10 -> b = 65 65 65 65 65 50 50 50 50 50
  94.  
  95. switch (i) {
  96. case 0:
  97. case 1:
  98. case 2:
  99. case 3:
  100. case 4:
  101. b[i] = 65;
  102. break;
  103. default:
  104. b[i] = 50;
  105. break; }
  106.  
  107. }
  108. */
  109. // Получаем решение методом Гауса, результат храним в x
  110. gauss(matrix, b, x);
  111. // Вывод решения
  112. for (int i = 0; i < n; i++)
  113. cout << "x[" << i << "]=" << x[i] << endl;
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement