//получение 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];
                }
            }
        }
Esempio n. 3
0
        static void Main()
        {
            try
            {
                //прямые методы: Гаусс, LU-разложение, QR-разложение
                var T1 = new Thread(() =>
                {
                    int N      = 5;
                    var A      = new Matrix(N, N);
                    var X_true = new Vector(N);

                    //заполнение СЛАУ
                    for (int i = 0; i < N; i++)
                    {
                        for (int j = 0; j < N; j++)
                        {
                            A.Elem[i][j] = 1.0 / (i + j + 2.0);
                        }
                        X_true.Elem[i] = 1;
                    }

                    //правая часть
                    var F = A * X_true;

                    //метод Гаусса
                    var Solver = new Gauss_Method();
                    var X      = Solver.Start_Solver(A, F);
                });

                //итерационные блочные методы: Якоби, Гаусса-Зейделя и SOR
                var T2 = new Thread(() =>
                {
                    //матрица
                    var A = new Matrix("Data\\Dense_Format\\");
                    //вектор правой части
                    var F = new Vector("Data\\Dense_Format\\");
                    //метод SOR при w = 1.8 (максимальное число итераций = 30000, точность = 1e-12)
                    var Solver = new SOR_Method(30000, 1e-12);
                    var X      = Solver.Start_Solver(A, F, 1.85);
                });

                //методы на подпространствах Крылова: CSlR-формат матрицы
                var T3 = new Thread(() =>
                {
                    //разреженная СЛАУ
                    var A      = new CSlR_Matrix("Data\\Sparse_Format\\Systems2\\NonSPD\\");
                    var F      = new Vector(A.N);
                    var X_True = new Vector(A.N);
                    //заполнение вектора истинного решения и правой части
                    for (int i = 0; i < A.N; i++)
                    {
                        X_True.Elem[i] = 1.0;
                    }
                    A.Mult_MV(X_True, F);
                });

                //время решения задачи
                Console.WriteLine(Tools.Measurement_Time(T3));
            }

            catch (Exception E)
            {
                Console.WriteLine("\n*** Error! ***");
                Console.WriteLine("Method:  {0}", E.TargetSite);
                Console.WriteLine("Message: {0}\n", E.Message);
            }
        }