//классический метод 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); }