Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <map>
- using namespace std;
- const int n = 10;
- double getValue(map<int, double> &matrix, int i, int j) {
- // значения в map-е хранятся по ключу, где ключ - это такой индекс одномерного массива
- // который позволяет хранить данные для двумерного массива, т.е., все строки двумерной
- // матрицы лежат в одномерном массиве со смещением i*n (n-длина строки)
- if (matrix.count(i * n + j)) // функция count возвращает кол-во элементов по ключу (для map 1, если элемент есть, или 0, если нет)
- return matrix[i * n + j]; // Возвращаем элемент, который лежит по указанному ключу
- return 0; // Если нет такого элемента, возвращаем 0
- }
- // setValue вставляет значение в map, игнорируя равные нулю элементы
- void setValue(map<int, double> &matrix, int i, int j, double value) {
- if (value) // если добавляемое значение отлично от 0
- matrix[i * n + j] = value; // добавляем его в map
- else
- matrix.erase(i * n + j); // Если равно 0, не добавляем его, а если раньше по этому адресу что-то лежало, удаляем
- }
- // Печать матрицы, лежащей в map
- void print(map<int, double> &matrix) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- cout << getValue(matrix, i, j) << " ";
- cout << endl;
- }
- cout << endl;
- }
- // Метод Гауса для решения СЛАУ
- void gauss(map<int, double> &matrix, double y[n], double x[n]) {
- cout << "Размер контейнера: " << matrix.size() << endl; // вывод размера map
- for (int k = 0; k < n; k++){ // проходим по строкам матрицы
- // Приведение левой части к треугольному виду:
- for (int i = k; i < n; i++){
- double temp = getValue(matrix, i, k);
- if (!abs(temp)) continue; // для нулевого коэффициента пропускаем
- for (int j = 0; j < n; j++)
- setValue(matrix, i, j, getValue(matrix, i, j) / temp);
- y[i] = y[i] / temp;
- if (i == k) continue; // избегаем вычитание ур-ия из самого себя
- for (int j = 0; j < n; j++)
- setValue(matrix, i, j, getValue(matrix, i, j) - getValue(matrix, k, j));
- y[i] = y[i] - y[k];
- }
- }
- print(matrix);
- cout << "Размер контейнера: " << matrix.size() << endl; // вывод размера map
- // обратная подстановка (обратный ход метода Гаусса)
- for (int k = n - 1; k >= 0; k--) {
- x[k] = y[k];
- for (int i = 0; i < k; i++)
- y[i] = y[i] - getValue(matrix, i, k) * x[k];
- }
- }
- int main() {
- map<int, double> matrix; // map для хранения упакованной матрицы
- double b[n], x[n];
- // Заполнение матрицы упаковкой её в map
- for (int i = 0; i < n; i++)
- {
- matrix[(n - i - 1) * n + i] = 100;
- matrix[(n-i - 4) * n + i] = 15;
- }
- // Вывод исходной матрицы
- print(matrix);
- // заполнение вектора b:
- for (int i = 0; i < n; i++) b[i] = pow(-1,i)*n;
- // Заполнение вектора b для тестового примера:
- /*
- for (int i = 0; i < n; i++) {
- // решение: x[i] = 1, i=0..10 -> b = 65 65 65 65 65 50 50 50 50 50
- switch (i) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- b[i] = 65;
- break;
- default:
- b[i] = 50;
- break; }
- }
- */
- // Получаем решение методом Гауса, результат храним в x
- gauss(matrix, b, x);
- // Вывод решения
- for (int i = 0; i < n; i++)
- cout << "x[" << i << "]=" << x[i] << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement