//классический метод QR-разложения
        public void QR_Decomposition_Classic_Gram_Schmidt_Process(Matrix A)
        {
            R = new UpperTriangularMatrix(A.N, A.N);
            Q = new LowerTriangularMatrix(A.M, A.M);
            var q_ = new Vector(A.M);

            for (int j = 0; j < A.N; j++)
            {
                //формирование верхнетреугольной матрицы R
                for (int i = 0; i < j; i++)
                {
                    for (int k = 0; k < A.M; k++)
                    {
                        R.Elem[i][j] += A.Elem[k][j] * Q.Elem[k][i];
                    }
                }

                //копирование j-ой строки матрицы A в вектор q_
                q_.Copy_Column(A, j);

                for (int i = 0; i < j; i++)
                {
                    for (int k = 0; k < q_.N; k++)
                    {
                        q_.Elem[k] -= Q.Elem[k][i] * R.Elem[i][j];
                    }
                }

                //запись значения нормы вектора q_ в Rj,j элемент матрицы R
                R.Elem[j][j] = q_.Norma();

                if (R.Elem[j][j] < CONST.EPS)
                {
                    return;
                }

                //формирование унитарной матрицы Q
                for (int i = 0; i < A.M; i++)
                {
                    Q.Elem[i][j] = q_.Elem[i] / R.Elem[j][j];
                }
            }
        }
        //решение СЛАУ
        public Vector Start_Solver(Matrix A, Vector F)
        {
            // вектор-решение
            var res = new Vector(F.N);

            // приведение к верхнему треугольному виду матрицы A, изменяя вместе с этим вектор F
            Direct_Way(A, F);

            // так как в Matrix нет метода для решения, то скопируем в другой класс
            var U = new UpperTriangularMatrix(A.M, A.N);

            for (int i = 0; i < A.M; i++)
            {
                for (int j = i; j < A.N; j++)
                {
                    U.Elem[i][j] = A.Elem[i][j];
                }
            }

            // решение СЛАУ обратным ходом по столбцам
            res = U.BackColumnSubstitution(F);
            return(res);
        }