public static void findInverseMatrix() { int n = A.GetLength(0); double[,] inverseMatrix = new double[n, n]; for (int m = 0; m < n; m++) { double[,] currA = A.Clone() as double[, ]; double[,] prevA = A.Clone() as double[, ]; double[] currE = new double[n]; Array.Fill(currE, 0); currE[m] = 1; double[] prevE = currE.Clone() as double[]; double[] roots = new double[n]; for (int k = 0; k < n; k++) { if (A[k, k] == 0) { Console.WriteLine("Something went wrong: A[{0}][{0}] = 0!", k); return; } double mainEl = prevA[k, k]; //k-тий рядок на кожному кроці for (int j = k; j < n; j++) { currA[k, j] = (Double)prevA[k, j] / mainEl; } currE[k] = (Double)prevE[k] / mainEl; //інші рядки for (int i = k + 1; i < n; i++) { for (int j = k; j < n; j++) { currA[i, j] = prevA[i, j] - (prevA[i, k] * prevA[k, j]) / mainEl; } currE[i] = prevE[i] - (prevE[k] * prevA[i, k]) / mainEl; } prevA = currA.Clone() as double[, ]; prevE = currE.Clone() as double[]; } //корені for (int i = n - 1; i >= 0; i--) { double sum = prevE[i]; for (int j = n - 1; j >= i + 1; j--) { sum = sum - prevA[i, j] * roots[j]; } roots[i] = sum; inverseMatrix[i, m] = sum; } } Console.WriteLine("Inverse matrix: \n"); Auxiliary.printMatrix(inverseMatrix); }
public static void applyMethod() { double detA = 1; int n = A.GetLength(0); //знаходимо U double[,] U = new double[n, n]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) { double sum = 0; for (int k = 1; k <= i - 1; k++) { sum += Math.Pow(U[k - 1, i - 1], 2); } U[i - 1, i - 1] = Math.Sqrt(A[i - 1, i - 1] - sum); detA *= Math.Pow(U[i - 1, i - 1], 2); } else if (j > i) { double sum = 0; for (int k = 1; k <= i - 1; k++) { sum += U[k - 1, i - 1] * U[k - 1, j - 1]; } U[i - 1, j - 1] = 1 / U[i - 1, i - 1] * (A[i - 1, j - 1] - sum); } else { U[i - 1, j - 1] = 0; } } } Console.WriteLine("U"); Auxiliary.printMatrix(U); Console.WriteLine("------------------------------------------"); //знаходимо транспоновану U double[,] UT = Auxiliary.transponateMatrix(U); Console.WriteLine("Transponated U"); Auxiliary.printMatrix(UT); Console.WriteLine("------------------------------------------"); //розв'язуємо перше рівняння Console.WriteLine("UT * y = b"); double[] y = new double[n]; for (int i = 0; i < n; i++) { double sum = 0; for (int k = i - 1; k >= 0; k--) { sum += y[k] * UT[i, k]; } y[i] = (B[i] - sum) / UT[i, i]; } Console.WriteLine("y"); Auxiliary.printArray(y); Console.WriteLine("------------------------------------------"); //розв'язуємо друге рівняння Console.WriteLine("U * x = y"); double[] x = new double[n]; for (int i = n - 1; i >= 0; i--) { double sum = 0; for (int k = i + 1; k < n; k++) { sum += x[k] * U[i, k]; } x[i] = (y[i] - sum) / U[i, i]; } Console.WriteLine("x"); Auxiliary.printArray(x); Console.WriteLine("------------------------------------------"); Console.WriteLine("detA = " + detA); //шукаємо обернену матрицю -> Ut*y=ei & U*x=y double[,] inverseMatrix = new double[n, n]; for (int k = 0; k < n; k++) { double[] E = new double[n]; Array.Fill(E, 0); E[k] = 1; //y double[] y1 = new double[n]; for (int i = 0; i < n; i++) { double sum = 0; for (int p = i - 1; p >= 0; p--) { sum += y1[p] * UT[i, p]; } y1[i] = (E[i] - sum) / UT[i, i]; } //x double[] x1 = new double[n]; for (int i = n - 1; i >= 0; i--) { double sum = 0; for (int p = i + 1; p < n; p++) { sum += x1[p] * U[i, p]; } x1[i] = (y1[i] - sum) / U[i, i]; } for (int i = 0; i < n; i++) { inverseMatrix[i, k] = x1[i]; } } Console.WriteLine("\nInverse matrix"); Auxiliary.printMatrix(inverseMatrix); }
public static void applyMethod() { double detA = 1; int n = A.GetLength(0); double[,] currA = new double[n, n]; double[,] prevA = A.Clone() as double[, ]; double betta = 0; double m = 0; double[] w = new double[n]; //i double[,] H = new double[n, n]; //i double[,] Qt = new double[n, n]; double[,] I = new double[n, n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { I[i, j] = 1; } else { I[i, j] = 0; } } } for (int i = 0; i < n - 1; i++) { //знаходимо betta, m та w double sum = 0; for (int k = i; k < n; k++) { sum += Math.Pow(prevA[i, k], 2); } betta = Math.Sign(-prevA[i, i]) * Math.Sqrt(sum); m = 1 / Math.Sqrt(2 * Math.Pow(betta, 2) - 2 * betta * prevA[i, i]); for (int j = 0; j < n; j++) { w[j] = m * prevA[i, j]; if (j == i) { w[j] -= m * betta; } if (i != 0) { for (int k = 0; k < i; k++) { w[k] = 0; } } } //знаходимо Hi for (int l = 0; l < n; l++) { for (int p = 0; p < n; p++) { H[l, p] = I[l, p] - 2 * w[l] * w[p]; } } //знаходимо Qt double[,] q = new double[n, n]; if (i == 0) { Qt = H.Clone() as double[, ]; } else { for (int l = 0; l < n; l++) { for (int p = 0; p < n; p++) { double buff = 0; for (int k = 0; k < n; k++) { buff += Qt[l, k] * H[k, p]; } q[l, p] = buff; } } Qt = q.Clone() as double[, ]; } //знаходимо Ai for (int l = 0; l < n; l++) { for (int p = 0; p < n; p++) { double buff = 0; for (int k = 0; k < n; k++) { buff += prevA[l, k] * H[k, p]; } currA[l, p] = buff; } } Console.WriteLine("i = {0}", i); Console.WriteLine("\nA"); Auxiliary.printMatrix(prevA); prevA = currA.Clone() as double[, ]; Console.WriteLine("\nbetta{0} = {1}", i, betta); Console.WriteLine("\nm{0} = {1}", i, m); Console.WriteLine("\nw{0}", i); Auxiliary.printArray(w); Console.WriteLine("\nH{0}", i); Auxiliary.printMatrix(H); Console.WriteLine("\nA{0}", i); Auxiliary.printMatrix(currA); Console.WriteLine("------------------------------------------\n"); } //detA for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { detA *= currA[i, j]; } } } Console.WriteLine("detA = " + detA); //знаходимо y double[] y = new double[n]; y[0] = B[0] / currA[0, 0]; for (int i = 1; i < n; i++) { double sum = 0; for (int k = 0; k < i; k++) { sum += y[k] * currA[i, k]; } y[i] = (B[i] - sum) / currA[i, i]; } Console.WriteLine("y"); Auxiliary.printArray(y); //знаходимо x double[] x = new double[n]; for (int i = 0; i < n; i++) { double sum = 0; for (int j = 0; j < n; j++) { sum += Qt[i, j] * y[j]; } x[i] = sum; } Console.WriteLine("\nRoots:"); Auxiliary.printArray(x); }