//получение 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];
                }
            }
        }
Пример #2
0
        //реализация 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];
                }
            }
        }