Advertisement
Xsufu

ПММ - 1 (прямые СЛАУ)

Sep 17th, 2020 (edited)
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.75 KB | None | 0 0
  1. //Решение СЛАУ методами Гаусса, Крамера, Гаусса-Жордана, матричным
  2. //Автор - Горшков Иван, группа ИТ-22Б
  3. using System;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.NetworkInformation;
  7. using System.Text;
  8.  
  9. namespace Matrix {
  10.     class Program {
  11.  
  12.         //метод печати меню
  13.         static void menu(double[,] free, double[,] matrix, int n, int m) {
  14.             Console.WriteLine("Исходная матрциа: ");
  15.             PrintMatrix(matrix, n, m);
  16.             Console.WriteLine("Вектор свободных членов: ");
  17.             PrintMatrix(free, n, 1);
  18.  
  19.             Console.WriteLine(" ————————————————————————— ");
  20.             Console.WriteLine("|  Выберите метод решения |");
  21.             Console.WriteLine("|-------------------------|");
  22.             Console.WriteLine("| 1 |  Крамера            |");
  23.             Console.WriteLine("| 2 |  Гаусса             |");
  24.             Console.WriteLine("| 3 |  Матричный          |");
  25.             Console.WriteLine("| 4 |  Гаусса-Жордана     |");
  26.             Console.WriteLine(" ————————————————————————— ");
  27.             Console.Write(">> ");
  28.  
  29.             int choise = 0;
  30.             choise = Convert.ToInt32(Console.ReadLine());
  31.             Console.WriteLine();
  32.  
  33.             switch (choise) {
  34.                 case 1:
  35.                     Cramer(free, matrix, n, m);
  36.                     break;
  37.                 case 2:
  38.                     Gauss(free, matrix, n, m);
  39.                     break;
  40.                 case 3:
  41.                     MM(free, matrix, n, m);
  42.                     break;
  43.                 case 4:
  44.                     GaussJordan(free, matrix, n, m);
  45.                     break;
  46.                 default:
  47.                     Console.WriteLine("Ошибка ввода");
  48.                     break;
  49.             }
  50.         }
  51.  
  52.         //метод Крамера
  53.         static void Cramer(double [,] free, double [,] matrix, int n, int m) {
  54.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  55.             double res = 0;                             //переменная для детерминантов
  56.             double det = Determinant(matrix, n, m);     //общий детерминант
  57.  
  58.             double[,] UsMatrix = new double[n, m];      //создаём копию изначальной матрицы
  59.             UsMatrix = (double[,]) matrix.Clone();
  60.  
  61.             string[] lines = new string[n];             //массив для хранения ответов
  62.  
  63.             for (int c = 0; c<m; c++) {
  64.                 for (int i = 0; i<n; i++) {             //заменяем столбик с номером "C" на вектор свободных членов
  65.                     matrix[i, c] = free[i, 0];
  66.                 }
  67.                 res = Determinant(matrix, n, m)/det;    //вычисляем корень
  68.                 Console.WriteLine($"x{c + 1} = {res}"); //вывод корней в консоль
  69.                 lines[c] = Convert.ToString(res);       //перевод результатов в строковый массив
  70.                 matrix = (double[,]) UsMatrix.Clone();  //возвращаем матрице изначальный вид
  71.             }
  72.             File.WriteAllLines($"{path}", lines);
  73.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  74.         }
  75.        
  76.         //метод мечати матрциы
  77.         static void PrintMatrix(double[,] arr, int n, int m) {             //печать матрицы
  78.             for (int i = 0; i < n; i++) {
  79.                 for (int j = 0; j < m; j++) {
  80.                     Console.Write(String.Format("{0,5}", arr[i, j]));
  81.                 }
  82.                 Console.WriteLine();
  83.             }
  84.             Console.WriteLine();
  85.         }
  86.  
  87.         //вычисление детерминанта приведением к треугольному виду
  88.         static double Determinant(double[,] matrix, int n, int m) {      
  89.             double res = 1;
  90.             double[,] UsMatrix = new double[n, m];
  91.  
  92.             UsMatrix = (double[,]) matrix.Clone();   //копирование матрицы
  93.  
  94.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  95.                 for (int j = i + 1; j < n; j++) {
  96.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  97.                     for (int k = i; k < n; k++) {
  98.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  99.                     }
  100.                 }
  101.             }
  102.  
  103.             for (int i = 0, j = 0; i<n && j<m; i++, j++) {
  104.                 res *= UsMatrix[i, j];
  105.             }
  106.  
  107.             return res;
  108.         }
  109.  
  110.         //метод Гаусса
  111.         static void Gauss (double[,] free, double[,] matrix, int n, int m) {
  112.            
  113.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  114.             double[,] UsMatrix = new double[n, m];                         //копия матрицы
  115.             double[,] FreeCopy = new double[n, 1];                         //копия вектора
  116.             double[,] Copy = new double[n, 1];
  117.             string[] lines = new string[n];                                //хранение ответов
  118.  
  119.             UsMatrix = (double[,])matrix.Clone();   //копирование матрицы
  120.             FreeCopy = (double[,])free.Clone();     //копирование вектора свободных членов
  121.             Copy = (double[,])FreeCopy.Clone();
  122.  
  123.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  124.                 for (int j = i + 1; j < n; j++) {
  125.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  126.                     for (int k = i; k < n; k++) {
  127.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  128.                     }
  129.                     FreeCopy[j, 0] -= FreeCopy[i, 0] * koef;        //изменение вектора свободных членов
  130.                 }
  131.             }
  132.  
  133.             for (int i = 0; i < n; i++) {
  134.                 double save = UsMatrix[i, i];
  135.                 for (int j = 0; j < m; j++) {
  136.                     if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
  137.                         continue;
  138.                     UsMatrix[i, j] = UsMatrix[i, j] / save;
  139.                 }
  140.                 FreeCopy[i, 0] = FreeCopy[i, 0] / save;
  141.             }
  142.  
  143.             double[] x = new double[n];                                   //x - массив хранения неизвестных
  144.             x[0] = FreeCopy[n - 1, 0];                                    //вычисление последнего неизвестного
  145.             for (int i = 1, k = n - 2; i < n && k >= 0; i++, k--) {       //обратный ход
  146.                 for (int j = m-1, count = i; j>k; j--, count--) {
  147.                     //формула вычисления неизвестных суть в выражении неизвестного и последющем делении на диагональный элемент
  148.                     FreeCopy[k, 0] = FreeCopy[k, 0] + (UsMatrix[k, j] * (-1) * x[i-count]);
  149.                     //FreeCopy - преображённый вектор свободных членов, UsMatrix - преображённая матрица
  150.                 }
  151.                 x[i] = FreeCopy[k, 0];
  152.             }
  153.            
  154.             Array.Reverse(x, 0,n);              //разворот массива (массив, начальный элемент, длина разворота)
  155.             for (int i = 0; i<n; i++) {         //вывод результата на экран и перезапись в string массив
  156.                 Console.WriteLine($"x{i+1} = {x[i]}");
  157.                 lines[i] = Convert.ToString(x[i]);
  158.             }
  159.             File.WriteAllLines($"{path}", lines);       //запись в файл
  160.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  161.  
  162.         }
  163.  
  164.         //метод Гаусса-Жордана
  165.         static void GaussJordan(double[,] free, double[,] matrix, int n, int m) {
  166.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  167.             double[,] UsMatrix = new double[n, m];                         //копия матрицы
  168.             double[,] FreeCopy = new double[n, 1];                         //копия вектора
  169.             string[] lines = new string[n];                                //хранение ответов
  170.             double[,] Unit = new double[n, m];                             //единичная матрица
  171.  
  172.             UsMatrix = (double[,])matrix.Clone();   //копирование матрицы
  173.             FreeCopy = (double[,])free.Clone();     //копирование вектора свободных членов
  174.  
  175.             for (int i = 0; i<n; i++)              //заполнение единичной матрицы
  176.                 for (int j = 0; j < m; j++)
  177.                     if (i == j)
  178.                         Unit[i, j] = 1;
  179.            
  180.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  181.                 for (int j = i + 1; j < n; j++) {
  182.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  183.                     for (int k = i; k < n; k++) {
  184.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  185.                         Unit[j, k] -= Unit[i, k] * koef;
  186.                     }
  187.                     FreeCopy[j, 0] -= FreeCopy[i, 0] * koef;        //изменение вектора свободных членов
  188.                 }
  189.             }
  190.  
  191.             for (int i = n-1; i > 0; i--) {       //приведение к нижнему треугольному виду
  192.                 for (int j = i-1; j >= 0; j--) {
  193.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  194.                     for (int k = i; k >= 0; k--) {
  195.                         if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
  196.                             continue;
  197.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  198.                         Unit[j, k] -= Unit[i, k] * koef;
  199.                     }
  200.                     FreeCopy[j, 0] -= FreeCopy[i, 0] * koef;        //изменение вектора свободных членов
  201.                 }
  202.             }
  203.  
  204.             for (int i = 0; i < n; i++) {
  205.                 double save = UsMatrix[i, i];
  206.                 for (int j = 0; j < m; j++) {
  207.                     if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
  208.                         continue;
  209.                     UsMatrix[i, j] = UsMatrix[i, j] / save;
  210.                     Unit[i, j] = Unit[i, j] / save;
  211.                 }
  212.                 FreeCopy[i, 0] = FreeCopy[i, 0] / save;
  213.             }
  214.  
  215.             for (int i = 0; i < n; i++) {         //вывод результата на экран и перезапись в string массив
  216.                 Console.WriteLine($"x{i + 1} = {FreeCopy[i,0]}");
  217.                 lines[i] = Convert.ToString(FreeCopy[i,0]);
  218.             }
  219.             File.WriteAllLines($"{path}", lines);       //запись в файл
  220.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  221.  
  222.         }
  223.  
  224.         static void MM (double[,] free, double[,] matrix, int n, int m) {
  225.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";
  226.             double tmp;
  227.             double[,] Unit = new double[n, m];                             //единичная матрица
  228.             string[] lines = new string[n];
  229.  
  230.             for (int i = 0; i < n; i++)                                    //заполнение единичной матрицы
  231.                 for (int j = 0; j < m; j++)
  232.                     if (i == j)
  233.                         Unit[i, j] = 1;
  234.  
  235.             for (int i = 0; i < n; i++) {
  236.                 tmp = matrix[i,i];
  237.                 for (int j = n - 1; j >= 0; j--) {
  238.                     matrix[i,j] /= tmp;
  239.                     Unit[i,j] /= tmp;
  240.                 }
  241.  
  242.                 if (i >= 1) {
  243.                     for (int j = i - 1; j >= 0; j--) {
  244.                         double temp = matrix[j,i];
  245.                         for (int s = 0; s < n; s++) {
  246.                             matrix[j,s] -= temp * matrix[i,s];
  247.                             Unit[j,s] -= temp * Unit[i,s];
  248.                         }
  249.                     }
  250.                 }
  251.  
  252.                 for (int j = i + 1; j < n; j++) {
  253.                     tmp = matrix[j,i];
  254.                     for (int q = n - 1; q >= 0; q--) {
  255.                         matrix[j,q] -= tmp * matrix[i,q];
  256.                         Unit[j,q] -= tmp * Unit[i,q];
  257.                     }
  258.                 }
  259.             }
  260.  
  261.             double[] x = new double[n];
  262.  
  263.             for (int i = 0; i < n; i++) {
  264.                 double cst = 0;
  265.                 for (int j = 0; j < n; j++) {
  266.                     Unit[i,j] *= free[j,0];
  267.                     cst += Unit[i,j];
  268.                 }
  269.                 x[i] = cst;
  270.             }
  271.  
  272.             for (int c = 0; c < n; c++) {
  273.                 Console.WriteLine($"x{c + 1} = {x[c]}"); //вывод корней в консоль
  274.                 lines[c] = Convert.ToString(x[c]);       //перевод результатов в строковый массив
  275.             }
  276.  
  277.             File.WriteAllLines($"{path}", lines);
  278.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  279.         }
  280.  
  281.         static void Main(string[] args) {
  282.             string path = @"E:\C#\Университет\Первый круг\1Ж\matrix.txt";  //указываем путь к файлу
  283.             string[] lines = File.ReadAllLines($"{path}");                 //считываем строки в элементы string массива
  284.  
  285.             int n, m;
  286.             n = Int32.Parse(lines[0]);                                     //считываем кол-во строк и столбцов
  287.             m = Int32.Parse(lines[1]);                                     //преобразованием из string в int
  288.  
  289.             double[,] matrix = new double[n, m];                           //создаём матрицу
  290.             int r = 3;                                                     //память номера элемента массива
  291.  
  292.             double[,] free = new double[n, 1];                             //free - вектор свободных членов
  293.             for (int j = 0; r<n+3; r++, j++) {      //запись свободных челенов
  294.                 free[j, 0] = Int32.Parse(lines[r]);
  295.             }
  296.  
  297.             for (int i = 0; i<n; i++) {             //построчно записываем из lines в matrix                                      
  298.                 for (int j = 0; j<m; j++) {
  299.                     r++;
  300.                     matrix[i, j] = Int32.Parse(lines[r]);
  301.                 }
  302.             }
  303.  
  304.             menu(free, matrix, n, m);      
  305.            
  306.         }
  307.     }
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement