Лаб. работа "Обращение матриц в C#"

Расширенный алгоритм Гаусса-Жордана для нахождения обратной матрицы

Пусть дано:

$A=\begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \ a_{21} & a_{22} & \cdots & a_{2n} \ \vdots & \vdots & \ddots & \vdots \ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix} \quad a_{11} \ne 0 \quad I=\begin{pmatrix} 1 & 0 & \cdots & 0 \ 0 & 1 & \cdots & 0 \ \vdots & \vdots & \ddots & \vdots \ 0 & 0 & \cdots & 1 \end{pmatrix}$

Прямой ход (алгоритм образования нулей под главной диагональю)

  • Разделим первую строку матрицы А на $a_{11}$ получим: $a_{1j}^1 = \frac{a_{1j} }{a_{11} }$, j — столбец матрицы А.
  • Повторяем действия для матрицы I, по формуле: $b_{1s}^1 = \frac{b_{1s} }{a_{11} }$, s — столбец матрицы I

Получим:

$A=\begin{pmatrix} 1 & a_{12}^1 & \cdots & a_{1n}^1 \ a_{21} & a_{22} & \cdots & a_{2n} \ \vdots & \vdots & \ddots & \vdots \ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix} \qquad I=\begin{pmatrix} b_{11}^1 & 0 & \cdots & 0 \ 0 & 1 & \cdots & 0 \ \vdots & \vdots & \ddots & \vdots \ 0 & 0 & \cdots & 1 \end{pmatrix}$

  • Будем образовывать 0 в первом столбце : $a_{2j}^1=a_{2j}-a_{1j}^1 a_{21} \ , \dots , \ a_{nj}^1=a_{nj}-a_{1j}^1 a_{n1}$
  • Повторяем действия для матрицы І, по формулам : $b_{2s}^1=b_{2s}-b_{1s}^1 a_{21} \ , \dots , \ b_{ns}^1=b_{ns}-b_{1s}^1 a_{n1}$

Получим:

$A=\begin{pmatrix} 1 & a_{12}^1 & \cdots & a_{1n}^1 \ 0 & a_{22}^1 & \cdots & a_{2n}^1 \ \vdots & \vdots & \ddots & \vdots \ 0 & a_{n2}^1 & \cdots & a_{nn}^1 \end{pmatrix} \qquad I=\begin{pmatrix} b_{11}^1 & 0 & \cdots & 0 \ b_{21}^1 & 1 & \cdots & 0 \ \vdots & \vdots & \ddots & \vdots \ b_{n1}^1 & 0 & \cdots & 1 \end{pmatrix}$

  • продолжаем выполнять аналогичные операции, используя формулы : $a_{ij}^k=\frac{a_{ij}^k}{a_{ii} } \qquad a_{ij}^k=a_{ij}^{k-1}-a_{kj}^k a_{ik}^{k-1}$,

при условии, что $k = 1 \rightarrow n,i = k + 1 \rightarrow n,j = 1 \rightarrow n$

  • Повторяем действия для матрицы І, по формулам : $b_{ik}^k=\frac{b_{ik}^k}{a_{ii} } \qquad b_{is}^k=b_{is}^{k-1}-b_{ks}^k a_{ik}^{k-1}$

при условии, что $k=1 \to n,; i=k+1 \to n,; s=1 \to n$ получим:

$A=\begin{pmatrix} 1 & a_{12}^1 & \cdots & a_{1n}^1 \ 0 & 1 & \cdots & a_{2n}^2 \ \vdots & \vdots & \ddots & \vdots \ 0 & 0 & \cdots & 1 \end{pmatrix} \qquad I=\begin{pmatrix} b_{11}^1 & 0 & \cdots & 0 \ b_{21}^2 & b_{22}^2 & \cdots & 0 \ \vdots & \vdots & \ddots & \vdots \ b_{n1}^n & b_{n2}^n & \cdots & b_{nn}^n \end{pmatrix}$

Обратный ход (алгоритм образования нулей над главной диагональю)

Используем формулу: $a_{ij}^{k-1}=a_{ij}^{k-1}-a_{ij}^k a_{ik}^i$, при условии, что $k=n \to 1,; i=1 \to k-1,; j=1 \to n$

Повторяем действия для матрицы І, по формуле : $b_{is}^{k-1}=b_{is}^{k-1}-b_{is}^k a_{ik}^i$, при условии, что $k=n \to 1,; i=1 \to k-1,; s=1 \to n$

Окончательно получаем :

$A=\begin{pmatrix} 1 & 0 & \cdots & 0 \ 0 & 1 & \cdots & 0 \ \vdots & \vdots & \ddots & \vdots \ 0 & 0 & \cdots & 1 \end{pmatrix} \qquad I=A^{-1}$

Код на C#, реализующий алгоритм Гаусса-Жордана

 1using System;
 2
 3class Program
 4{
 5    static void Main()
 6    {
 7        double[,] matrix = new double[,]
 8        {
 9            {2, -1, 0},
10            {-1, 2, -1},
11            {0, -1, 2}
12        };
13
14        double[,] inverseMatrix = InverseMatrix(matrix);
15
16        PrintMatrix(inverseMatrix);
17    }
18
19    static double[,] InverseMatrix(double[,] matrix)
20    {
21        int size = matrix.GetLength(0);
22        double[,] augmentedMatrix = new double[size, 2 * size];
23
24        // Create augmented matrix
25        for (int i = 0; i < size; i++)
26        {
27            for (int j = 0; j < size; j++)
28            {
29                augmentedMatrix[i, j] = matrix[i, j];
30                augmentedMatrix[i, j + size] = i == j ? 1 : 0;
31            }
32        }
33
34        // Gauss-Jordan elimination
35        for (int i = 0; i < size; i++)
36        {
37            double pivot = augmentedMatrix[i, i];
38            for (int j = 0; j < 2 * size; j++)
39            {
40                augmentedMatrix[i, j] /= pivot;
41            }
42
43            for (int j = 0; j < size; j++)
44            {
45                if (j == i) continue;
46                double factor = augmentedMatrix[j, i];
47                for (int k = 0; k < 2 * size; k++)
48                {
49                    augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k];
50                }
51            }
52        }
53
54        // Extract inverse matrix
55        double[,] inverseMatrix = new double[size, size];
56        for (int i = 0; i < size; i++)
57        {
58            for (int j = 0; j < size; j++)
59            {
60                inverseMatrix[i, j] = augmentedMatrix[i, j + size];
61            }
62        }
63
64        return inverseMatrix;
65    }
66
67    static void PrintMatrix(double[,] matrix)
68    {
69        for (int i = 0; i < matrix.GetLength(0); i++)
70        {
71            for (int j = 0; j < matrix.GetLength(1); j++)
72            {
73                Console.Write(matrix[i, j] + " ");
74            }
75            Console.WriteLine();
76        }
77    }
78}

Задание:

  1. Изучить метод Гаусса-Жордана

  2. Написать приложение на языке C# для нахождения обратной матрицы для матрицы, заданной пользователем.

  3. Добавить в приложение проверку на правильность нахождения обратной матрицы. $A^{-1}\cdot A = E$, где $E$ – единичная матрица.

← Лаб. работа "Одномерные и двумерные массивы в …