Лаб. работа “Обращение матриц в 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#, реализующий алгоритм Гаусса-Жордана
using System;
class Program
{
static void Main()
{
double[,] matrix = new double[,]
{
{2, -1, 0},
{-1, 2, -1},
{0, -1, 2}
};
double[,] inverseMatrix = InverseMatrix(matrix);
PrintMatrix(inverseMatrix);
}
static double[,] InverseMatrix(double[,] matrix)
{
int size = matrix.GetLength(0);
double[,] augmentedMatrix = new double[size, 2 * size];
// Create augmented matrix
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
augmentedMatrix[i, j] = matrix[i, j];
augmentedMatrix[i, j + size] = i == j ? 1 : 0;
}
}
// Gauss-Jordan elimination
for (int i = 0; i < size; i++)
{
double pivot = augmentedMatrix[i, i];
for (int j = 0; j < 2 * size; j++)
{
augmentedMatrix[i, j] /= pivot;
}
for (int j = 0; j < size; j++)
{
if (j == i) continue;
double factor = augmentedMatrix[j, i];
for (int k = 0; k < 2 * size; k++)
{
augmentedMatrix[j, k] -= factor * augmentedMatrix[i, k];
}
}
}
// Extract inverse matrix
double[,] inverseMatrix = new double[size, size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
inverseMatrix[i, j] = augmentedMatrix[i, j + size];
}
}
return inverseMatrix;
}
static void PrintMatrix(double[,] matrix)
{
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
}
}
Задание:
Изучить метод Гаусса-Жордана
Написать приложение на языке C# для нахождения обратной матрицы для матрицы, заданной пользователем.
Добавить в приложение проверку на правильность нахождения обратной матрицы. \(A^{-1}\cdot A = E\), где \(E\) – единичная матрица.