НОУ ІНТУЇТ | лекція | Статичні і динамічні матриці
Завдання 6.12. Знайти визначник квадратної матриці .
Мал.6.15.
Блок-схема алгоритму обчислення зворотної матриці
Нехай задана матриця (6.2), необхідно обчислити її визначник. Для цього матрицю необхідно перетворити до трикутного вигляду (6.3), а потім скористатися властивістю, відомим з курсу лінійної алгебри, яке свідчить, що визначник трикутної матриці дорівнює добутку її діагональних елементів: .
Перетворення матриці (6.2) до вигляду (6.3) можна здійснити за допомогою прямого ходу методу Гаусса. Алгоритм обчислення визначника матриці, зображений у вигляді блок-схеми на Мал. 6.16 , Являє собою алгоритм прямого ходу методу Гаусса, в процесі виконання якого проводиться перестановка рядків матриці. Ця операція призводить до зміни знака визначника. У блок-схемі момент зміни знака відбитий в блоках 8-9. У блоці 8 визначається, чи будуть рядки мінятися місцями, і якщо відповідь ствердна, то в блоці 9 відбувається зміна знака визначника. У блоках 15-16 виконується безпосереднє обчислення визначника шляхом перемноження діагональних елементів перетвореної матриці.
На лістингу приведений текст програми вирішення задачі 6.12 з коментарями.
#include <iostream> #include <math.h> using namespace std; // Функція обчислення визначника. double determinant (double ** matrica_a, int n) // Формальні параметри: matrica_a - вихідна матриця, n - розмір матриці, // функція повертає значення визначника (тип double.) {int i, j, k, r; double c, M, max, s, det = 1; // a - копія вихідної матриці. double ** a; // Виділення пам'яті для матриці a. a = new double * [n]; for (i = 0; i <n; i ++) a [i] = new double [n]; // В a записуємо копію вихідної матриці. for (i = 0; i <n; i ++) for (j = 0; j <n; j ++) a [i] [j] = matrica_a [i] [j]; // Прямий хід методу Гаусса. for (k = 0; k <n; k ++) {max = fabs (a [k] [k]); r = k; for (i = k + 1; i <n; i ++) if (fabs (a [i] [k])> max) {max = fabs (a [i] [k]); r = i; } // Якщо рядки мінялися місцями, то зміна знака визначника. if (r! = k) det = -det; for (j = 0; j <n; j ++) {c = a [k] [j]; a [k] [j] = a [r] [j]; a [r] [j] = c; } For (i = k + 1; i <n; i ++) for (M = a [i] [k] / a [k] [k], j = k; j <n; j ++) a [i] [ j] - = M * a [k] [j]; } // Обчислення визначника. for (i = 0; i <n; i ++) det * = a [i] [i]; // Повернення визначника як результат функції for (i = 0; i <n; i ++) delete [] a [i]; delete [] a; return det; } Int main () {int result, i, j, N; double ** a, b; cout << "N ="; cin >> N; a = new double _ [N]; for (i = 0; i <N; i ++) a [i] = new double [N]; // Введення значень вихідної матриці. cout << "Введення матриці A" << endl; for (i = 0; i <N; i ++) for (j = 0; j <N; j ++) cin >> a [i] [j]; // Звернення до функції обчислення визначника. cout << "визначник =" << determinant (a, N) << endl; }
Мал. 6.16. Блок-схема алгоритму обчислення визначника
В цьому розділі читач познайомився з обробкою статичних і динамічних матриць в C ++, а також з використанням функцій для вирішення завдань обробки динамічних матриць.