//получение LU матрицы public void CreateLU(Matrix A) { LU = new Matrix(A.M, A.N); //копирование матрицы A в LU, чтобы не испортить A for (int i = 0; i < A.M; i++) { for (int j = 0; j < A.N; j++) { LU.Elem[i][j] = A.Elem[i][j]; } } //прямой ход метода Гаусса для получения верхнего треугольника //являющегося верхней треугольной матрицей U Gauss_Method.Direct_Way(LU); //формирование нижнего треугольника //являющегося нижней треугольной матрицей L for (int i = 0; i < A.M; i++) { for (int j = 0; j < i; j++) { double sumLikUkj = 0; for (int k = 0; k < j; k++) { sumLikUkj += LU.Elem[i][k] * LU.Elem[k][j]; } LU.Elem[i][j] = (A.Elem[i][j] - sumLikUkj) / LU.Elem[j][j]; } } }
//реализация LU-разложения public LU_Decomposition(Matrix A) { //хранилище для верхней и нижней треугольных матриц LU = new Matrix(A.M, A.N); //копирование исходной матрицы LU.Copy(A); //построение верхней треугольной матрицы Gauss_Method.Direct_Way(LU); //построение нижней треугольной матрицы for (int i = 0; i < A.M; i++) { for (int j = 0; j < i; j++) { double sum_LikUkj = 0; for (int k = 0; k < j; k++) { sum_LikUkj += LU.Elem[i][k] * LU.Elem[k][j]; } LU.Elem[i][j] = (A.Elem[i][j] - sum_LikUkj) / LU.Elem[j][j]; } } }