/// <summary> /// Прямой ход алгоритма Гаусса решения систем линейных уравнений. /// </summary> /// <param name="MatrixArray"></param> /// <param name="offset"></param> /// <param name="style"></param> /// <param name="Debug"></param> /// <returns></returns> public static Matrix Straight(Matrix MatrixArray, out Dictionary <int, int> offset, GEModification style = GEModification.Standard, bool Debug = false) { Matrix MatrixCopy = new Matrix(MatrixArray) { HasFreeCoefficient = true }; //Прямой ход offset = new Dictionary <int, int>(); for (int i = 0; i < MatrixArray.LengthY; i++) { offset.Add(i, i); } for (int i = 0; i < MatrixCopy.LengthY; i++) { if (Debug) { Console.WriteLine(MatrixCopy); Console.WriteLine("---------------------------------------------------------\n"); } int MaxIndex; switch (style) { case GEModification.LeadingOnTheLine: //получили индекс максимального по модулю элемента в текущей строке MaxIndex = MatrixCopy.GetMaxAbsInRowIndex(i); if (i < MaxIndex) { MatrixCopy.SwapColumns(i, MaxIndex); SwapDict(offset, i, MaxIndex); } break; case GEModification.LeadingOnTheColumn: MaxIndex = MatrixCopy.GetMaxAbsInColumnIndex(i); if (i < MaxIndex) { MatrixCopy.SwapLines(i, MaxIndex); } break; case GEModification.LeadingOnWholeMatrix: int MaxIndexI, MaxIndexJ; int[] max = MatrixCopy.GetMaxAbsIndex(); MaxIndexI = max[0]; MaxIndexJ = max[1]; if (i <= MaxIndexI && i <= MaxIndexJ) { MatrixCopy.SwapLines(i, MaxIndexI); MatrixCopy.SwapColumns(i, MaxIndexJ); SwapDict(offset, i, MaxIndexJ); } break; default: break; } MatrixCopy.Values[i] = MatrixCopy[i].Select(val => val / MatrixCopy.Values[i][i]).ToArray(); //Сделали первый ненулевой элемент единицей if (Debug) { Console.WriteLine(MatrixCopy); Console.WriteLine("---------------------------------------------------------\n"); } for (int j = i + 1; j < MatrixCopy.LengthY; j++) { double Multiplier = -(MatrixCopy[j][i] / MatrixCopy.Values[i][i]); MatrixCopy[j] = MatrixCopy[j].Select((val, index) => val + MatrixCopy.Values[i][index] * Multiplier).ToArray(); } //У всех остальных строчек обнулили i-ый столбец } return(MatrixCopy); }
/// <summary> /// Осуществляет решение системы линейных уравнений заданных в виде матрицы методом Гаусса. /// </summary> /// <param name="Source"></param> /// <param name="style"></param> /// <param name="Debug"></param> /// <returns></returns> public static Vector Solve(Matrix Source, GEModification style = GEModification.Standard, bool Debug = false) { Matrix MatrixCopy = Straight(Source, out Dictionary <int, int> offset, style, Debug); return(Reverse(MatrixCopy, offset)); }