static void Main() { for (int n = 200; n < 1001; n += 100) { matrix A = rand_matrix(n); vector v = rand_vector(n); vector b = v.copy(); Stopwatch cd_time = new Stopwatch(); cd_time.Start(); var cd = new cholesky(A); vector x_cd = cd.solve(v); cd_time.Stop(); Stopwatch qr_time = new Stopwatch(); qr_time.Start(); var qr = new gs(A); var x_qr = qr.solve(b); qr_time.Stop(); ///// matrix dimension n*n cd_runtime qr_runtime WriteLine($"{n} \t {cd_time.ElapsedMilliseconds} \t {qr_time.ElapsedMilliseconds}"); } } //Method: Main
static void Main() { //// Del A //// int n = 3; matrix A = rand_matrix(n); var cd = new cholesky(A); var L = cd.L; var LT = cd.LT; WriteLine("_____________________________________"); WriteLine(); WriteLine("Part A - decomposit A into L*LT"); (A).print("Matrix A="); WriteLine(); (L).print("Matrix L="); WriteLine(); (LT).print("Matrix LT="); WriteLine(); WriteLine("Check if L*LT=A"); matrix LLT = L * LT; LLT.print("L*LT="); WriteLine(); if (A.approx(LLT)) { WriteLine("L*LT=A\tTEST PASSED"); } else { WriteLine("L*LT!=A\tTEST FAILED"); } //// Del B //// vector v = rand_vector(n); vector b = v.copy(); vector x = cd.solve(v); WriteLine("_____________________________________"); WriteLine(); WriteLine("Part B - Solving linear equation: A*x=b"); A.print("Matrix A="); WriteLine(); b.print("Vector b="); WriteLine(); x.print("Solution x="); WriteLine(); vector Ax = (A * x); Ax.print("Check A*x="); WriteLine(); if (b.approx(Ax)) { WriteLine("A*x=b TEST PASSED"); } else { WriteLine("A*x!=b TEST FAILED"); } //// Del C //// WriteLine("_____________________________________"); WriteLine(); WriteLine("Part C - Determinant of A"); double D = cd.determinant(); WriteLine($"det(A)={D}"); WriteLine(); //Determinant test is only avalible for n=3 if (n == 3) { double D_alt = A[0, 0] * A[1, 1] * A[2, 2] + A[0, 1] * A[1, 2] * A[2, 0] + A[0, 2] * A[1, 0] * A[2, 1] - A[0, 2] * A[1, 1] * A[2, 0] - A[0, 1] * A[1, 0] * A[2, 2] - A[1, 2] * A[2, 1] * A[0, 0]; if (matrix.approx(D_alt, D)) { WriteLine("TEST PASSED"); } else { WriteLine("TEST FAILED"); } } //// Del D //// WriteLine("_____________________________________"); WriteLine(); WriteLine("Part D - find the inverse matrix of A"); var A_inv = cd.inverse(); A_inv.print("A_inv="); WriteLine(); WriteLine("Check if A_inv is the inverse:"); WriteLine(); matrix AA_inv1 = A * A_inv; AA_inv1.print("A*A_inv="); WriteLine(); matrix AA_inv2 = A * A_inv; AA_inv2.print("A_inv*A="); WriteLine(); matrix I = matrix.id(n); if (I.approx(AA_inv1) && I.approx(AA_inv2)) { WriteLine("A*A_inv=I\tTEST PASSED"); } else { WriteLine("A*A_inv=I\tTEST FAILED"); } } //Method: Main