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); } }
static void Main() { try { //прямые методы: Гаусс, LU-разложение, QR-разложение var T1 = new Thread(() => { //int N = 10; //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 + 1.0); // } // X_true.Elem[i] = 1; //} // for (int i = 0; i < N; i++) // { // for (int j = 0; j < N; j++) // { // //A.Elem[i][j] = 1.0 / (i + j + 1.0); // } // X_true.Elem[i] = 1; // } // var ElemMatrix = new double[][] // { // //new double[]{-2,-2,-1}, // //new double[]{1,0,-2}, // //new double[]{0,1,2} // new double[]{5,1,9}, // new double[]{1,4,1}, // new double[]{5,1,3} // }; // A.Elem = ElemMatrix; // //правая часть // var F = A * X_true; // //решатель // //var Solver = new Gauss_Method(); // //var Solver = new LU_Decomposition(A); // var Solver = new QR_Decomposition(A, QR_Decomposition.QR_Algorithm.Householder); // var X = Solver.Start_Solver(F); // //X.Console_Write_Vector(); // Console.WriteLine("\nError: {0}\n", Tools.Relative_Error(X, X_true)); }); //Итерационные методы var T2 = new Thread(() => { }); //итерационные методы: Якоби и SOR var T3 = new Thread(() => { int SIZE_BLOCK = 450; double m = 1e+4; double z = 1.2; for (int k = 0; k < 1; k++) { //var Solver = new Jacobi_Method(30000, 1e-12); var Solver = new SOR_Method(30000, 1e-4); //Вычисление точного решения //var A_g = new Matrix("Data\\System3\\", m); //var F_g = new Vector("Data\\System3\\"); //var GSolver = new Gauss_Method(); //var sw = new Stopwatch(); //sw.Start(); //var X_true = GSolver.Start_Solver(A_g, F_g); //sw.Stop(); //Console.WriteLine($"\nTime: {sw.Elapsed}"); //Блочная или обычная матрица/вектор //var A = new Block_Matrix("Data\\System3\\", SIZE_BLOCK, m); //var F = new Block_Vector("Data\\System3\\", SIZE_BLOCK); //var A = new Matrix("Data\\System3\\", m); //var F = new Vector("Data\\System3\\"); var A = new Matrix(3, 3); var F = new Vector(3); F.Elem[0] = 8; F.Elem[1] = 8; F.Elem[2] = 11; var ElemMatrix = new double[][] { //new double[]{-2,-2,-1}, //new double[]{1,0,-2}, //new double[]{0,1,2} new double[] { 10, 1, 0 }, new double[] { 1, 10, 0 }, new double[] { 0, 0, 10 } }; A.Elem = ElemMatrix; var sw = new Stopwatch(); sw.Start(); //var X = Solver.Start_Solver(A, F); var X = Solver.Start_Solver(A, F, 1); //var X = Solver.Start_Solver(A, F, z); sw.Stop(); Console.WriteLine($"\nTime: {sw.Elapsed}"); //var X_true_Norm = X_true.Norma(); //ДЛЯ ОБЫЧНОЙ МАТРИЦЫ //for (int j = 0; j < 900; j++) //{ // X_true.Elem[j] = X.Elem[j] - X_true.Elem[j]; //} //ДЛЯ БЛОЧНОЙ МАТРИЦЫ //int q = 0; //for (int i = 0; i < X.N; i++) //{ // for (int j = 0; j < SIZE_BLOCK; j++) // { // X_true.Elem[q] = X.Block[i].Elem[j] - X_true.Elem[q]; // q++; // } //} //Console.WriteLine("delta = " + (X_true.Norma() / X_true_Norm)); //Console.WriteLine("Cond(A) = " + A.Cond_InfinityNorm() + "\n"); //Console.WriteLine("m = " + m); //Console.WriteLine("z = " + z); Console.WriteLine("--------------------------"); //m /= 100; //z += 0.1; } }); var T4 = new Thread(() => { var A = new CSlR_Matrix("Data\\Sparse_Format\\Systems2\\nonSPD\\"); var X_true = new Vector(A.N); var F = new Vector(A.N); for (int i = 0; i < A.N; i++) { X_true.Elem[i] = 1.0; } A.Mult_MV(X_true, F); var Solver = new Conjurate_Gradient_Method(30000, 1e-12); //var Solver = new BiConjurate_Gradient_Method(30000, 1e-12); var sw = new Stopwatch(); sw.Start(); var X = Solver.Start_Solver(A, F, Preconditioner.Type_Preconditioner.LU_Decomposition); sw.Stop(); Console.WriteLine($"\nTime: {sw.Elapsed}"); Console.WriteLine("Relative_Error: {0}", Tools.Relative_Error(X, X_true)); Console.ReadLine(); for (int i = 0; i < X.N; i++) { Console.WriteLine("X[{0}] = {1}", i + 1, X.Elem[i]); } }); //время решения Console.WriteLine(Tools.Measurement_Time(T4)); } catch (Exception E) { Console.WriteLine("\n*** Error! ***"); Console.WriteLine("Method: {0}", E.TargetSite); Console.WriteLine("Message: {0}\n", E.Message); } Console.ReadLine(); }