Xsufu

Методы решения СЛАУ

Sep 13th, 2020 (edited)
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.94 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.         static int menu() {
  12.             Console.WriteLine(" ————————————————————————— ");
  13.             Console.WriteLine("|  Выберите метод решения |");
  14.             Console.WriteLine("|-------------------------|");
  15.             Console.WriteLine("| 1 |  Крамера            |");
  16.             Console.WriteLine("| 2 |  Гаусса             |");
  17.             Console.WriteLine("| 3 |  Матричный          |");
  18.             Console.WriteLine("| 4 |  Гаусса-Жордана     |");
  19.             Console.WriteLine(" ————————————————————————— ");
  20.             Console.Write(">> ");
  21.  
  22.             int choise = 0;
  23.             choise = Convert.ToInt32(Console.ReadLine());
  24.             Console.WriteLine();
  25.             return choise;
  26.         }
  27.  
  28.         static void Cramer(double [,] free, double [,] matrix, int n, int m) {
  29.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  30.             double res = 0;                             //переменная для детерминантов
  31.             double det = Determinant(matrix, n, m);     //общий детерминант
  32.  
  33.             double[,] UsMatrix = new double[n, m];      //создаём копию изначальной матрицы
  34.             UsMatrix = (double[,]) matrix.Clone();
  35.  
  36.             string[] lines = new string[n];             //массив для хранения ответов
  37.  
  38.             for (int c = 0; c<n; c++) {
  39.                 for (int i = 0; i<n; i++) {             //заменяем столбик с номером "C" на вектор свободных членов
  40.                     matrix[i, c] = free[i, 0];
  41.                 }
  42.                 res = Determinant(matrix, n, m)/det;    //вычисляем корень
  43.                 Console.WriteLine($"x{c + 1} = {res}");
  44.                 lines[c] = Convert.ToString(res);
  45.                 matrix = (double[,]) UsMatrix.Clone();  //возвращаем матрице изначальный вид
  46.             }
  47.             File.WriteAllLines($"{path}", lines);
  48.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  49.         }
  50.        
  51.         static void PrintMatrix(double[,] arr, int n, int m) {             //печать матрицы
  52.             for (int i = 0; i < n; i++) {
  53.                 for (int j = 0; j < m; j++) {
  54.                     Console.Write(String.Format("{0,5}", arr[i, j]));
  55.                 }
  56.                 Console.WriteLine();
  57.             }
  58.             Console.WriteLine();
  59.         }
  60.  
  61.         //вычисление детерминанта приведением к треугольному виду
  62.         static double Determinant(double[,] matrix, int n, int m) {      
  63.             double res = 1;
  64.             double[,] UsMatrix = new double[n, m];
  65.  
  66.             UsMatrix = (double[,]) matrix.Clone();   //копирование матрицы
  67.  
  68.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  69.                 for (int j = i + 1; j < n; j++) {
  70.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  71.                     for (int k = i; k < n; k++) {
  72.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  73.                     }
  74.                 }
  75.             }
  76.  
  77.             for (int i = 0, j = 0; i<3 && j<3; i++, j++) {
  78.                 res *= UsMatrix[i, j];
  79.             }
  80.  
  81.             return res;
  82.         }
  83.  
  84.         static void Gauss (double[,] free, double[,] matrix, int n, int m) {
  85.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  86.             double[,] UsMatrix = new double[n, m];                         //копия матрицы
  87.             double[,] FreeCopy = new double[n, 1];                         //копия вектора
  88.             string[] lines = new string[n];                                //хранение ответов
  89.  
  90.             UsMatrix = (double[,])matrix.Clone();   //копирование матрицы
  91.             FreeCopy = (double[,])free.Clone();     //копирование вектора свободных членов
  92.  
  93.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  94.                 for (int j = i + 1; j < n; j++) {
  95.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  96.                     for (int k = i; k < n; k++) {
  97.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  98.                     }
  99.                     FreeCopy[j, 0] -= FreeCopy[i, 0] * koef;        //изменение вектора свободных членов
  100.                 }
  101.             }
  102.             int count = 1;    
  103.             double[] x = new double[n];                             //x - массив хранения неизвестных
  104.             x[0] = FreeCopy[n-1, 0] / UsMatrix[n-1, m-1];           //вычисление последнего неизвестного
  105.             for (int i = 1, k = n-2; i<n && k>=0; i++, k--) {       //обртаный ход
  106.                 for (int j = n-1; j!=k; j--, count++) {
  107.                     //формула вычисления неизвестных суть в выражении неизвестного и последющем делении на диагональный элемент
  108.                     x[i] = (FreeCopy[k, 0] + UsMatrix[k, j] * (-1) * x[i - count]) / UsMatrix[k,k];
  109.                     //FreeCopy - преображённый вектор свободных членов, UsMatrix - преображённая матрица
  110.                 }
  111.                 count = 1;
  112.             }
  113.  
  114.             Array.Reverse(x, 0,n);              //разворот массива (массив, начальный элемент, длина разворота)
  115.             for (int i = 0; i<n; i++) {         //вывод результата на экран и перезапись в string массив
  116.                 Console.WriteLine($"x{i+1} = {x[i]}");
  117.                 lines[i] = Convert.ToString(x[i]);
  118.             }
  119.             File.WriteAllLines($"{path}", lines);       //запись в файл
  120.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  121.         }
  122.  
  123.         static void Main(string[] args) {
  124.             string path = @"E:\C#\Университет\Первый круг\1Ж\matrix.txt";  //указываем путь к файлу
  125.             string[] lines = File.ReadAllLines($"{path}");                 //считываем строки в элементы string массива
  126.  
  127.             int n, m;
  128.             n = Int32.Parse(lines[0]);                                     // считываем кол-во строк и столбцов
  129.             m = Int32.Parse(lines[1]);
  130.  
  131.             double[,] matrix = new double[n, m];                           //создаём матрицу
  132.             int r = 3;                                                     //память номера элемента массива
  133.  
  134.             double[,] free = new double[n, 1];
  135.             for (int j = 0; r<n+3; r++, j++) {      //запись свободных челенов
  136.                 free[j, 0] = Int32.Parse(lines[r]);
  137.             }
  138.  
  139.             for (int i = 0; i<n; i++) {             //построчно записываем из lines в matrix                                      
  140.                 for (int j = 0; j<m; j++) {
  141.                     r++;
  142.                     matrix[i, j] = Int32.Parse(lines[r]);
  143.                 }
  144.             }
  145.  
  146.            
  147.             Console.WriteLine("Исходная матрциа: ");
  148.             PrintMatrix(matrix, n, m);
  149.             Console.WriteLine("Вектор свободных членов: ");
  150.             PrintMatrix(free, n, 1);          
  151.            
  152.             int choise = menu();            //вывод меню на экран
  153.  
  154.             switch (choise) {
  155.                 case 1:
  156.                     Cramer(free, matrix, n, m);
  157.                     break;
  158.                 case 2:
  159.                     Gauss(free, matrix, n, m);
  160.                     break;
  161.                 default:
  162.                     Console.WriteLine("Ошибка ввода");
  163.                     break;
  164.             }
  165.            
  166.         }
  167.     }
  168. }
Add Comment
Please, Sign In to add comment