rdfs:comment
| - LU-разложение — представление матрицы в виде , где — нижнетреугольная матрица с единичной диагональю, а — верхнетреугольная. LU-разложение еще называют LU-факторизацией. Матрица является нижнетреугольной с единичной диагональю, поэтому ее определитель равен 1. Матрица — верхнетреугольная матрица, значит ее определитель равен произведению элементов, расположенных на главной диагонали. Будем использовать следующие обозначения для элементов матриц , , ; причем диагональные элементы матрицы : , . Тогда, если известно LU-разложение матрицы, её определитель можно вычислить по формуле 1.
*
* Для
|
abstract
| - LU-разложение — представление матрицы в виде , где — нижнетреугольная матрица с единичной диагональю, а — верхнетреугольная. LU-разложение еще называют LU-факторизацией. Матрица является нижнетреугольной с единичной диагональю, поэтому ее определитель равен 1. Матрица — верхнетреугольная матрица, значит ее определитель равен произведению элементов, расположенных на главной диагонали. Будем использовать следующие обозначения для элементов матриц , , ; причем диагональные элементы матрицы : , . Тогда, если известно LU-разложение матрицы, её определитель можно вычислить по формуле Найти матрицы и можно следующим образом(выполнять шаги следует строго по порядку, т.к. следующие элементы находятся с использованием предыдущих): 1.
*
* Для 1.
*
* В итоге мы получим матрицы — и . В программной реализации данного метода (компактная схема Гаусса) для представления матриц и можно обойтись всего одним массивом, в котором совмещаются матрицы и . Например вот так(для матрицы размером ): Фрагмент программы на C# для нахождения матриц и . //переменная n(размерность иходной квадратной матрицы) должна получить значение до этого момента double[,] A = new double[n, n]; double[,] L = new double[n, n]; double[,] U = new double[n, n]; //до этого момента массив A должен быть полностью определен for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { U[0, i] = A[0, i] L[i, 0] = A[i, 0] / U[0, 0]; double sum = 0; for (int k = 0; k < i; k++) { sum += L[i, k] * U[k, j]; } U[i, j] = A[i, j] - sum; if (i > j) { L[j, i] = 0; } else { sum = 0; for (int k = 0; k < i; k++) { sum += L[j, k] * U[k, i]; } L[j, i] = (A[j, i] - sum) / U[i, i]; } } } //после выполнения цикла в массиве L - элементы матрицы L, в массиве U - элементы матрицы U. //Теперь можно вычислять определитель
|