/// <summary> /// Вывод ответа /// </summary> private List <SimpleFractions> PrintAnswer(List <List <SimpleFractions> > table, List <int> basis, List <SimpleFractions> F) { List <SimpleFractions> answer = new List <SimpleFractions>(); string str = ""; for (int j = 1; j < table[0].Count; j++) { str += "x" + j + " = "; var id = basis.FindIndex(a => a == j - 1); if (id >= 0) { str += table[id][0].toString() + "\n"; answer.Add(table[id][0]); } else { str += "0\n"; answer.Add(new SimpleFractions(0, 1)); } } SimpleFractions fAnswer = new SimpleFractions(0, 1); for (int i = 0; i < answer.Count; i++) { fAnswer = sFM.Sum(fAnswer, sFM.Multiplication(answer[i], F[i])); } fAnswer = sFM.Sum(fAnswer, F[F.Count - 1]); answer.Add(fAnswer); str += "Z = " + fAnswer.toString(); if (Notify != null) { Notify(str); } return(answer); }
public bool RectangleMetod(MatrixFractions matrix) { List <int> banIndexStrList = new List <int>(); if (matrix.M < matrix.N) { if (Notify != null) { Notify($"Строк больше столбцов! Невозможно решить! (Код 1.0)\n"); } return(false); } for (int nowStr = 0, nowCol = 0; nowStr < matrix.N || nowCol < matrix.N; nowStr++, nowCol++) { if (_mFM.Norm(matrix)) { if (Notify != null) { Notify("Сокращение:\n" + matrix.toString() + "\n"); } } //блок проверки var check = CheckExceptions(matrix); if (check == null) { if (Notify != null) { Notify($"Ошибка! \n"); } return(false); } if (check.SingleOrDefault() == -1) { if (Notify != null) { Notify($"Противоречие! \n"); } return(false); } if (check.Count > 0) { foreach (var ch in check) { banIndexStrList.Add(ch); } } if (Notify != null) { Notify($"Пока что все идет по плану... наверное! \n"); } //проверка банлиста int strNullCount = CheckBanlist(check, nowStr, matrix.N); if (strNullCount > 0) { nowStr += strNullCount - 1; if (nowStr >= matrix.N) { if (Notify != null) { Notify("Зануленная строка!\n" + matrix.toString() + "\n"); } } } if (nowStr >= matrix.N) { return(true); } //проверка на 0-вой элемент if (matrix.Matrix[nowStr, nowCol].Numerator == 0) { int Str = nowStr; Str++; if (Str >= matrix.N) { if (Notify != null) { Notify($"Ведущий элемент 0, а строки закончились. Упс... \n"); } return(true); } while (matrix.Matrix[Str, nowCol].Numerator == 0) { Str++; if (Str >= matrix.N) { if (Notify != null) { Notify($"Ведущий элемент 0, а строки закончились. Упс... \n"); } return(true); } } ObmenStrok(matrix, Str, nowStr); if (Notify != null) { Notify($"Обмен: ({nowStr} и {Str})\n"); Notify(matrix.toString() + "\n"); } } //приводим к 1 if (matrix.Matrix[nowStr, nowCol].Numerator != matrix.Matrix[nowStr, nowCol].Denominator) { SimpleFractions kof = matrix.Matrix[nowStr, nowCol]; for (int j1 = 0; j1 < matrix.M; j1++) { matrix.Matrix[nowStr, j1] = _sFM.Division(matrix.Matrix[nowStr, j1], kof); } if (Notify != null) { Notify($"Приведение: ({nowStr + 1}) : {kof.toString()} \n"); Notify(matrix.toString() + "\n"); } } //прямоугольники for (int j1 = nowStr + 1; j1 < matrix.M; j1++) { for (int i1 = 0; i1 < matrix.N; i1++) { if (i1 != nowCol) { matrix.Matrix[i1, j1] = _sFM.Difference(matrix.Matrix[i1, j1], _sFM.Multiplication(matrix.Matrix[nowStr, j1], matrix.Matrix[i1, nowCol])); } } } for (int i = 0; i < matrix.N; i++) { if (i != nowStr) { matrix.Matrix[i, nowCol].Denominator = 1; matrix.Matrix[i, nowCol].Numerator = 0; } } if (Notify != null) { Notify("После прямоугольников: \n" + matrix.toString() + "\n"); } } return(true); }