Лаб. работа "Обращение матриц в 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}
Задание:
Изучить метод Гаусса-Жордана
Написать приложение на языке C# для нахождения обратной матрицы для матрицы, заданной пользователем.
Добавить в приложение проверку на правильность нахождения обратной матрицы. $A^{-1}\cdot A = E$, где $E$ – единичная матрица.