//получение 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]; } } }
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); } }