Найти обратную матрицу методом Гаусса - ошибки в коде - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д