@Likrik

Как работает метод Гаусса на C#?

Здравствуйте. Есть код на C#, который решает СЛАУ методом Гаусса. Проблема в том, что я до конца не могу понять как он работает. Вижу только, что создается, кажется, матрица-перевертыш, но не более того. Пошагово не могу понять что происходит. Был бы очень признателен за разъяснение.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Gauss_CommandLine
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Решение СЛАУ методом Гаусса");
            Console.WriteLine();
            Console.WriteLine("Для запуска программы введите 'Запуск'.");
            Console.WriteLine("Для выхода из программы введите 'Выход'.");
            Console.WriteLine("Примечание! Ввод чувствителен к регистру введнных символов.");
            Console.WriteLine();
            string Control;
            Control = Console.ReadLine();
            while (true)
            {
                if (Control == "Запуск")
                {
                    Console.WriteLine();
                    Console.Write("Введите размерность матрицы: ");
                    int RowAm = int.Parse(Console.ReadLine());
                    double[,] MatrixCoef = new double[RowAm, RowAm];
                    double[] FreeCoef = new double[RowAm];
                    double Multi1, Multi2;
                    double[] Result = new double[RowAm];
                    Console.WriteLine();
                    Console.WriteLine("Введите коэффициенты и свободные члены матрицы:");
                    Console.WriteLine();
                    for (int i = 0; i < RowAm; i++)
                    {
                        for (int j = 0; j < RowAm; j++)
                        {
                            Console.Write($"A[{i + 1}][{j + 1}] = ");
                            MatrixCoef[i, j] = double.Parse(Console.ReadLine());
                        }
                        Console.Write($"B[{i + 1}] = ");
                        FreeCoef[i] = double.Parse(Console.ReadLine());
                        Console.WriteLine();
                    }
                    Console.WriteLine("Начальный вид матрицы:");
                    Console.WriteLine();
                    int MatrixRow = MatrixCoef.GetLength(0);
                    int MatrixCol = MatrixCoef.GetLength(1);
                    for (int i = 0; i < MatrixRow; i++)
                    {
                        for (int j = 0; j < MatrixCol; j++)
                        {
                            Console.Write(MatrixCoef[i, j] + "\t");
                        }
                        Console.WriteLine();
                    }
                    Console.WriteLine();
                    Console.WriteLine("Свободные члены матрицы:");
                    Console.WriteLine();
                    for (int i = 0; i < RowAm; i++)
                    {
                        Console.WriteLine($"B[{i + 1}] = {FreeCoef[i]}");
                    }
                    Console.WriteLine();
                    for (int k = 0; k < RowAm; k++)
                    {
                        for (int j = k + 1; j < RowAm; j++)
                        {
                            Multi1 = MatrixCoef[j, k] / MatrixCoef[k, k];
                            for (int i = k; i < RowAm; i++)
                            {
                                MatrixCoef[j, i] = MatrixCoef[j, i] - Multi1 * MatrixCoef[k, i];
                            }
                            FreeCoef[j] = FreeCoef[j] - Multi1 * FreeCoef[k];
                        }
                    }
                    for (int k = RowAm - 1; k >= 0; k--)
                    {
                        Multi1 = 0;
                        for (int j = k; j < RowAm; j++)
                        {
                            Multi2 = MatrixCoef[k, j] * Result[j];
                            Multi1 += Multi2;
                        }
                        Result[k] = (FreeCoef[k] - Multi1) / MatrixCoef[k, k];
                    }
                    Console.WriteLine("Конечный вид матрицы:");
                    Console.WriteLine();
                    for (int i = 0; i < MatrixRow; i++)
                    {
                        for (int j = 0; j < MatrixCol; j++)
                        {
                            Console.Write(MatrixCoef[i, j] + "\t");
                        }
                        Console.WriteLine();
                    }
                    Console.WriteLine();
                    Console.WriteLine("Корни матрицы:");
                    Console.WriteLine();
                    for (int i = 0; i < RowAm; i++)
                    {
                        Console.WriteLine($"X[{i + 1}] = {Result[i]}");
                    }
                    Console.WriteLine();
                    Console.WriteLine("Программа завершила решение.");
                    Console.WriteLine();
                    Console.WriteLine("Для повторного запуска программы введите 'Запуск'.");
                    Console.WriteLine("Для выхода из программы введите 'Выход'.");
                    Console.WriteLine();
                    Control = Console.ReadLine();
                }
                if (Control == "Выход")
                {
                    Console.WriteLine();
                    Console.WriteLine("Программа завершила работу.");
                    Thread.Sleep(1000);
                    Environment.Exit(0);
                    break;
                }
                else
                {
                    Console.WriteLine();
                    Console.WriteLine("Ошибка! Ввод недопустимого значения.");
                    Console.WriteLine();
                    Control = Console.ReadLine();
                }
            }
        }
    }
}

Выкладываю весь код для полного понимания работы программы.
  • Вопрос задан
  • 4978 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы