Найти обратную матрицу методом Гаусса - ошибки в коде - 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();
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5