Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Решение СЛАУ методами Гаусса, Крамера, Гаусса-Жордана, матричным
- //Автор - Горшков Иван, группа ИТ-22Б
- using System;
- using System.IO;
- using System.Linq;
- using System.Net.NetworkInformation;
- using System.Text;
- namespace Matrix {
- class Program {
- //метод печати меню
- static void menu(double[,] free, double[,] matrix, int n, int m) {
- Console.WriteLine("Исходная матрциа: ");
- PrintMatrix(matrix, n, m);
- Console.WriteLine("Вектор свободных членов: ");
- PrintMatrix(free, n, 1);
- Console.WriteLine(" ————————————————————————— ");
- Console.WriteLine("| Выберите метод решения |");
- Console.WriteLine("|-------------------------|");
- Console.WriteLine("| 1 | Крамера |");
- Console.WriteLine("| 2 | Гаусса |");
- Console.WriteLine("| 3 | Матричный |");
- Console.WriteLine("| 4 | Гаусса-Жордана |");
- Console.WriteLine(" ————————————————————————— ");
- Console.Write(">> ");
- int choise = 0;
- choise = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine();
- switch (choise) {
- case 1:
- Cramer(free, matrix, n, m);
- break;
- case 2:
- Gauss(free, matrix, n, m);
- break;
- case 3:
- MM(free, matrix, n, m);
- break;
- case 4:
- GaussJordan(free, matrix, n, m);
- break;
- default:
- Console.WriteLine("Ошибка ввода");
- break;
- }
- }
- //метод Крамера
- static void Cramer(double [,] free, double [,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt"; //указываем путь к файлу
- double res = 0; //переменная для детерминантов
- double det = Determinant(matrix, n, m); //общий детерминант
- double[,] UsMatrix = new double[n, m]; //создаём копию изначальной матрицы
- UsMatrix = (double[,]) matrix.Clone();
- string[] lines = new string[n]; //массив для хранения ответов
- for (int c = 0; c<m; c++) {
- for (int i = 0; i<n; i++) { //заменяем столбик с номером "C" на вектор свободных членов
- matrix[i, c] = free[i, 0];
- }
- res = Determinant(matrix, n, m)/det; //вычисляем корень
- Console.WriteLine($"x{c + 1} = {res}"); //вывод корней в консоль
- lines[c] = Convert.ToString(res); //перевод результатов в строковый массив
- matrix = (double[,]) UsMatrix.Clone(); //возвращаем матрице изначальный вид
- }
- File.WriteAllLines($"{path}", lines);
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- //метод мечати матрциы
- static void PrintMatrix(double[,] arr, int n, int m) { //печать матрицы
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- Console.Write(String.Format("{0,5}", arr[i, j]));
- }
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- //вычисление детерминанта приведением к треугольному виду
- static double Determinant(double[,] matrix, int n, int m) {
- double res = 1;
- double[,] UsMatrix = new double[n, m];
- UsMatrix = (double[,]) matrix.Clone(); //копирование матрицы
- for (int i = 0; i < n - 1; i++) { //приведение к верхнему треугольному виду
- for (int j = i + 1; j < n; j++) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k < n; k++) {
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- }
- }
- }
- for (int i = 0, j = 0; i<n && j<m; i++, j++) {
- res *= UsMatrix[i, j];
- }
- return res;
- }
- //метод Гаусса
- static void Gauss (double[,] free, double[,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt"; //указываем путь к файлу
- double[,] UsMatrix = new double[n, m]; //копия матрицы
- double[,] FreeCopy = new double[n, 1]; //копия вектора
- double[,] Copy = new double[n, 1];
- string[] lines = new string[n]; //хранение ответов
- UsMatrix = (double[,])matrix.Clone(); //копирование матрицы
- FreeCopy = (double[,])free.Clone(); //копирование вектора свободных членов
- Copy = (double[,])FreeCopy.Clone();
- for (int i = 0; i < n - 1; i++) { //приведение к верхнему треугольному виду
- for (int j = i + 1; j < n; j++) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k < n; k++) {
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- }
- FreeCopy[j, 0] -= FreeCopy[i, 0] * koef; //изменение вектора свободных членов
- }
- }
- for (int i = 0; i < n; i++) {
- double save = UsMatrix[i, i];
- for (int j = 0; j < m; j++) {
- if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
- continue;
- UsMatrix[i, j] = UsMatrix[i, j] / save;
- }
- FreeCopy[i, 0] = FreeCopy[i, 0] / save;
- }
- double[] x = new double[n]; //x - массив хранения неизвестных
- x[0] = FreeCopy[n - 1, 0]; //вычисление последнего неизвестного
- for (int i = 1, k = n - 2; i < n && k >= 0; i++, k--) { //обратный ход
- for (int j = m-1, count = i; j>k; j--, count--) {
- //формула вычисления неизвестных суть в выражении неизвестного и последющем делении на диагональный элемент
- FreeCopy[k, 0] = FreeCopy[k, 0] + (UsMatrix[k, j] * (-1) * x[i-count]);
- //FreeCopy - преображённый вектор свободных членов, UsMatrix - преображённая матрица
- }
- x[i] = FreeCopy[k, 0];
- }
- Array.Reverse(x, 0,n); //разворот массива (массив, начальный элемент, длина разворота)
- for (int i = 0; i<n; i++) { //вывод результата на экран и перезапись в string массив
- Console.WriteLine($"x{i+1} = {x[i]}");
- lines[i] = Convert.ToString(x[i]);
- }
- File.WriteAllLines($"{path}", lines); //запись в файл
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- //метод Гаусса-Жордана
- static void GaussJordan(double[,] free, double[,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt"; //указываем путь к файлу
- double[,] UsMatrix = new double[n, m]; //копия матрицы
- double[,] FreeCopy = new double[n, 1]; //копия вектора
- string[] lines = new string[n]; //хранение ответов
- double[,] Unit = new double[n, m]; //единичная матрица
- UsMatrix = (double[,])matrix.Clone(); //копирование матрицы
- FreeCopy = (double[,])free.Clone(); //копирование вектора свободных членов
- for (int i = 0; i<n; i++) //заполнение единичной матрицы
- for (int j = 0; j < m; j++)
- if (i == j)
- Unit[i, j] = 1;
- for (int i = 0; i < n - 1; i++) { //приведение к верхнему треугольному виду
- for (int j = i + 1; j < n; j++) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k < n; k++) {
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- Unit[j, k] -= Unit[i, k] * koef;
- }
- FreeCopy[j, 0] -= FreeCopy[i, 0] * koef; //изменение вектора свободных членов
- }
- }
- for (int i = n-1; i > 0; i--) { //приведение к нижнему треугольному виду
- for (int j = i-1; j >= 0; j--) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k >= 0; k--) {
- if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
- continue;
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- Unit[j, k] -= Unit[i, k] * koef;
- }
- FreeCopy[j, 0] -= FreeCopy[i, 0] * koef; //изменение вектора свободных членов
- }
- }
- for (int i = 0; i < n; i++) {
- double save = UsMatrix[i, i];
- for (int j = 0; j < m; j++) {
- if (UsMatrix[i, j] == 0 || UsMatrix[i, j] == -0)
- continue;
- UsMatrix[i, j] = UsMatrix[i, j] / save;
- Unit[i, j] = Unit[i, j] / save;
- }
- FreeCopy[i, 0] = FreeCopy[i, 0] / save;
- }
- for (int i = 0; i < n; i++) { //вывод результата на экран и перезапись в string массив
- Console.WriteLine($"x{i + 1} = {FreeCopy[i,0]}");
- lines[i] = Convert.ToString(FreeCopy[i,0]);
- }
- File.WriteAllLines($"{path}", lines); //запись в файл
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- static void MM (double[,] free, double[,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt";
- double tmp;
- double[,] Unit = new double[n, m]; //единичная матрица
- string[] lines = new string[n];
- for (int i = 0; i < n; i++) //заполнение единичной матрицы
- for (int j = 0; j < m; j++)
- if (i == j)
- Unit[i, j] = 1;
- for (int i = 0; i < n; i++) {
- tmp = matrix[i,i];
- for (int j = n - 1; j >= 0; j--) {
- matrix[i,j] /= tmp;
- Unit[i,j] /= tmp;
- }
- if (i >= 1) {
- for (int j = i - 1; j >= 0; j--) {
- double temp = matrix[j,i];
- for (int s = 0; s < n; s++) {
- matrix[j,s] -= temp * matrix[i,s];
- Unit[j,s] -= temp * Unit[i,s];
- }
- }
- }
- for (int j = i + 1; j < n; j++) {
- tmp = matrix[j,i];
- for (int q = n - 1; q >= 0; q--) {
- matrix[j,q] -= tmp * matrix[i,q];
- Unit[j,q] -= tmp * Unit[i,q];
- }
- }
- }
- double[] x = new double[n];
- for (int i = 0; i < n; i++) {
- double cst = 0;
- for (int j = 0; j < n; j++) {
- Unit[i,j] *= free[j,0];
- cst += Unit[i,j];
- }
- x[i] = cst;
- }
- for (int c = 0; c < n; c++) {
- Console.WriteLine($"x{c + 1} = {x[c]}"); //вывод корней в консоль
- lines[c] = Convert.ToString(x[c]); //перевод результатов в строковый массив
- }
- File.WriteAllLines($"{path}", lines);
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- static void Main(string[] args) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\matrix.txt"; //указываем путь к файлу
- string[] lines = File.ReadAllLines($"{path}"); //считываем строки в элементы string массива
- int n, m;
- n = Int32.Parse(lines[0]); //считываем кол-во строк и столбцов
- m = Int32.Parse(lines[1]); //преобразованием из string в int
- double[,] matrix = new double[n, m]; //создаём матрицу
- int r = 3; //память номера элемента массива
- double[,] free = new double[n, 1]; //free - вектор свободных членов
- for (int j = 0; r<n+3; r++, j++) { //запись свободных челенов
- free[j, 0] = Int32.Parse(lines[r]);
- }
- for (int i = 0; i<n; i++) { //построчно записываем из lines в matrix
- for (int j = 0; j<m; j++) {
- r++;
- matrix[i, j] = Int32.Parse(lines[r]);
- }
- }
- menu(free, matrix, n, m);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement