示例#1
0
            /// <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);
            }
示例#2
0
            /// <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));
            }