Найти обратную матрицу методом Гаусса - ошибки в коде - C#
Формулировка задачи:
Друзья, помогите, пожалуйста, найти ошибку в программе. Пытаюсь найти обратную матрицу методом Гаусса, но результат не верный уже после прямого хода. Проверяю код на матрице [3;3], никак не пойму в чем проблема(
double[,] A = new double[3, 3];
A[0, 0] = 5; A[0, 1] = 2; A[0, 2] = 3;
A[1, 0] = 4; A[1, 1] = 5; A[1, 2] = 6;
A[2, 0] = 7; A[2, 1] = 8; A[2, 2] = 9;
double[,] AObrat = new double[3, 3];
double[,] ACopy = new double[3, 3];
//задаем обратную матрицу как единичную
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == j) { AObrat[i, j] = 1; }
else { AObrat[i, j] = 0; }
ACopy[i, j] = A[i, j]; //создаем копию матрицы A
Console.WriteLine("ACopy[i, j] =" + ACopy[i, j]);
}
}
Console.Read();
//прямой ход
for (int k = 0; k < 3; k++)
{
double div = ACopy[k, k];
for (int j = 0; j < 3; j++)
{
ACopy[k, j] /= div;
AObrat[k, j] /= div;
}
for (int i = k + 1; i < 3; i++)
{
double multi = ACopy[i, k];
for (int j = 0; j < 3; j++)
{
ACopy[i, j] -= multi * ACopy[k, j];
AObrat[i, j] -= multi * AObrat[k, j];
}
}
}
Console.WriteLine("после прямого хода");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
// Console.WriteLine("ACopy[i, j] =" + ACopy[i, j]);
Console.WriteLine("AObrat[i, j] =" + AObrat[i, j]);
}
} Console.ReadLine();
//обратный ход
for (int kk = 3 - 1; kk > 0; kk--)
{
ACopy[kk, 3 - 1] /= ACopy[kk, kk];
AObrat[kk, 3 - 1] /= ACopy[kk, kk];
for (int i = kk - 1; i + 1 > 0; i--)
{
double multi2 = ACopy[i, kk];
for (int j = 3 - 1; j > 0; j--)
{
ACopy[i, j] -= multi2 * ACopy[kk, j];
AObrat[i, j] -= multi2 * AObrat[kk, j];
}
}
}
Console.WriteLine("проверка матрицы Copy");
double[,] Ee = new double[3, 3];
int flagA = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
// Console.WriteLine("ACopy[i, j] =" + ACopy[i, j]);
Console.WriteLine("AObrat[i, j] =" + AObrat[i, j]);
if (i == j) { Ee[i, j] = 1; }
else { Ee[i, j] = 0; }
if (Ee[i, j] != ACopy[i, j]) { Console.WriteLine("i=" + i); Console.WriteLine("j=" + j); }
else { flagA = 1; }
}
}
if (flagA == 1) { Console.WriteLine("матрица стала единичной"); }
Console.ReadLine();
System.Console.ReadLine();
//проверка
double[,] ProverkaA = new double[3, 3];
for (int i = 0; i < 3; i++)//строки
{
for (int j = 0; j < 3; j++)//столбцы
{
for (int k = 0; k < 3; k++)
{
ProverkaA[i, j] += AObrat[i, k] * A[k, j];
}
}
}
Console.WriteLine("проверка матрицы Proverka");
int flag11 = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (Math.Abs(Ee[i, j] - ProverkaA[i, j]) > 0.002) { Console.WriteLine("i=" + i, "j=" + j); }
else { flag11 = 1; }
}
}
if (flag11 == 1) { Console.WriteLine("матрица стала единичной"); }
Console.ReadLine();Решение задачи: «Найти обратную матрицу методом Гаусса - ошибки в коде»
textual
Листинг программы
static void print(double[,] m)
{
Console.WriteLine();
for (var i = 0; i < m.GetLength(0); ++i)
{
for (var j = 0; j < m.GetLength(1); ++j)
{
Console.Write("{0:0.00}\t", m[i, j]);
}
Console.WriteLine();
}
}