Xsufu

Метод Гаусса

Sep 15th, 2020 (edited)
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.07 KB | None | 0 0
  1. //входные данные:
  2. //free - вектор свободных членов
  3. //matrix - непосредственно матрица
  4. //n и m - размерность
  5.  
  6. static void Gauss (double[,] free, double[,] matrix, int n, int m) {
  7.             string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";  //указываем путь к файлу
  8.             double[,] UsMatrix = new double[n, m];                         //копия матрицы
  9.             double[,] FreeCopy = new double[n, 1];                         //копия вектора
  10.             string[] lines = new string[n];                                //хранение ответов
  11.  
  12.             UsMatrix = (double[,])matrix.Clone();   //копирование матрицы
  13.             FreeCopy = (double[,])free.Clone();     //копирование вектора свободных членов
  14.  
  15.             for (int i = 0; i < n - 1; i++) {       //приведение к верхнему треугольному виду
  16.                 for (int j = i + 1; j < n; j++) {
  17.                     double koef = UsMatrix[j, i] / UsMatrix[i, i];
  18.                     for (int k = i; k < n; k++) {
  19.                         UsMatrix[j, k] -= UsMatrix[i, k] * koef;
  20.                     }
  21.                     FreeCopy[j, 0] -= FreeCopy[i, 0] * koef;        //изменение вектора свободных членов
  22.                 }
  23.             }
  24.  
  25.             int count = 1;    
  26.             double[] x = new double[n];                             //x - массив хранения неизвестных
  27.             x[0] = FreeCopy[n-1, 0] / UsMatrix[n-1, m-1];           //вычисление последнего неизвестного
  28.             for (int i = 1, k = n-2; i<n && k>=0; i++, k--) {       //обртаный ход
  29.                 for (int j = n-1; j!=k; j--, count++) {
  30.                     //формула вычисления неизвестных суть в выражении неизвестного и последющем делении на диагональный элемент
  31.                     x[i] = (FreeCopy[k, 0] + UsMatrix[k, j] * (-1) * x[i - count]) / UsMatrix[k,k];
  32.                     //FreeCopy - преображённый вектор свободных членов, UsMatrix - преображённая матрица
  33.                 }
  34.                 count = 1;
  35.             }
  36.  
  37.             Array.Reverse(x, 0,n);              //разворот массива (массив, начальный элемент, длина разворота)
  38.             for (int i = 0; i<n; i++) {         //вывод результата на экран и перезапись в string массив
  39.                 Console.WriteLine($"x{i+1} = {x[i]}");
  40.                 lines[i] = Convert.ToString(x[i]);
  41.             }
  42.             File.WriteAllLines($"{path}", lines);       //запись в файл
  43.             Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
  44.         }
Add Comment
Please, Sign In to add comment