Untitled
unknown
plain_text
8 months ago
3.7 kB
4
Indexable
using System; class Program { static void Main(string[] args) { // Przykładowa macierz wejściowa double[,] A = { { 4, -2, 1 }, { 20, -7, 12 }, { -8, 13, 17 } }; Console.WriteLine("Macierz wejściowa:"); PrintMatrix(A); // Dekompozycja LU metodą Crouta Console.WriteLine("\nDekompozycja LU metodą Crouta:"); (double[,] L, double[,] U) = CroutLUDecomposition(A); Console.WriteLine("Macierz L:"); PrintMatrix(L); Console.WriteLine("Macierz U:"); PrintMatrix(U); // Odwracanie macierzy Console.WriteLine("\nMacierz odwrotna:"); double[,] A_inv = InvertMatrix(A); PrintMatrix(A_inv); } // Algorytm dekompozycji LU metodą Crouta static (double[,] L, double[,] U) CroutLUDecomposition(double[,] A) { int n = A.GetLength(0); double[,] L = new double[n, n]; double[,] U = new double[n, n]; for (int i = 0; i < n; i++) { U[i, i] = 1; // U jest macierzą trójkątną górną z 1 na przekątnej for (int j = i; j < n; j++) { // Obliczanie elementów macierzy L double sumL = 0; for (int k = 0; k < i; k++) sumL += L[j, k] * U[k, i]; L[j, i] = A[j, i] - sumL; } for (int j = i + 1; j < n; j++) { // Obliczanie elementów macierzy U double sumU = 0; for (int k = 0; k < i; k++) sumU += L[i, k] * U[k, j]; U[i, j] = (A[i, j] - sumU) / L[i, i]; } } return (L, U); } // Algorytm odwracania macierzy metodą bezwyznacznikową static double[,] InvertMatrix(double[,] A) { int n = A.GetLength(0); double[,] A_inv = new double[n, n]; // Znajdowanie macierzy odwrotnej przez rozwiązywanie układów równań for (int i = 0; i < n; i++) { // Jednostkowy wektor kolumnowy e_i double[] e = new double[n]; e[i] = 1; // Rozwiązanie układu równań A * x = e_i double[] x = SolveLinearSystem(A, e); // Przepisanie rozwiązania do macierzy odwrotnej for (int j = 0; j < n; j++) A_inv[j, i] = x[j]; } return A_inv; } // Funkcja do rozwiązywania układu równań A * x = b z użyciem dekompozycji LU static double[] SolveLinearSystem(double[,] A, double[] b) { int n = A.GetLength(0); (double[,] L, double[,] U) = CroutLUDecomposition(A); // Rozwiązanie L * y = b double[] y = new double[n]; for (int i = 0; i < n; i++) { double sum = 0; for (int j = 0; j < i; j++) sum += L[i, j] * y[j]; y[i] = (b[i] - sum) / L[i, i]; } // Rozwiązanie U * x = y double[] x = new double[n]; for (int i = n - 1; i >= 0; i--) { double sum = 0; for (int j = i + 1; j < n; j++) sum += U[i, j] * x[j]; x[i] = y[i] - sum; } return x; } // Funkcja do wyświetlania macierzy static void PrintMatrix(double[,] matrix) { int rows = matrix.GetLength(0); int cols = matrix.GetLength(1); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { Console.Write($"{matrix[i, j],8:F3} "); } Console.WriteLine(); } } }
Editor is loading...
Leave a Comment