private void PhaseTwo(Equation equation, int c) { CurrentPhase = Phase.Two; equation.ColsCount -= c; double[] tempFunction = equation.Function; Array.Resize(ref tempFunction, equation.ColsCount); equation.Function = tempFunction; double[,] tempCoefficients = equation.Coefficients; equation.Coefficients = new double[equation.RowsCount, equation.ColsCount]; for (int i = 0; i < equation.RowsCount; i++) { for (int j = 0; j < equation.ColsCount; j++) { equation.Coefficients[i, j] = tempCoefficients[i, j]; } } RowReduction(equation.Function, equation); }
private double[] StandardizePrecision(Equation equation) { for (int i = 0; i < equation.RowsCount; i++) { double fraction = equation.Intercepts[i] - Math.Truncate(equation.Intercepts[i]); if (Math.Abs(fraction) < 0.25) { equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]); } else if (Math.Abs(fraction) > 0.75) { if (equation.Intercepts[i] > 0) { equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) + 1; } else { equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) - 1; } } else if (Math.Abs(fraction) != 0.0) { if (equation.Intercepts[i] > 0) { equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) + 0.5; } else { equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) - 0.5; } } } return(equation.Intercepts); }
private void RowReduction(double[] row, Equation equation) { while (true) { Pivot pivot = SelectPivot(row, equation); if (pivot.Row == -1 || pivot.Column == -1 || CurrentSolution == Solution.Infinity) { break; } ResultVariables[pivot.Column] = pivot.Row; double divisor = equation.Coefficients[pivot.Row, pivot.Column]; equation.Intercepts[pivot.Row] /= divisor; for (int i = 0; i < equation.ColsCount; i++) { equation.Coefficients[pivot.Row, i] /= divisor; } double multiple = 0; for (int i = 0; i < equation.RowsCount; i++) { if (pivot.Row != i && !EqualToZero(equation.Coefficients[i, pivot.Column])) { multiple = equation.Coefficients[i, pivot.Column]; equation.Intercepts[i] -= equation.Intercepts[pivot.Row] * multiple; for (int j = 0; j < equation.ColsCount; j++) { equation.Coefficients[i, j] -= equation.Coefficients[pivot.Row, j] * multiple; } } } int size = equation.Intercepts.Length; if (CurrentPhase == Phase.One) { equation.Intercepts[size - 2] -= equation.Intercepts[pivot.Row] * equation.Function[pivot.Column]; equation.Intercepts[size - 1] -= equation.Intercepts[pivot.Row] * row[pivot.Column]; double functionCol = equation.Function[pivot.Column]; double rowCol = row[pivot.Column]; for (int i = 0; i < equation.ColsCount; i++) { equation.Function[i] -= equation.Coefficients[pivot.Row, i] * functionCol; row[i] -= equation.Coefficients[pivot.Row, i] * rowCol; } SecondaryRow = row; } else { equation.Intercepts[size - 1] -= equation.Intercepts[pivot.Row] * equation.Function[pivot.Column]; multiple = equation.Function[pivot.Column]; for (int i = 0; i < equation.ColsCount; i++) { equation.Function[i] -= equation.Coefficients[pivot.Row, i] * multiple; } equation.Function = row; } } }
private void PhaseOne(Equation equation) { CurrentPhase = Phase.One; RowReduction(SecondaryRow, equation); CurrentSolution = (EqualToZero(equation.Intercepts.Last())) ? Solution.Bounded : Solution.NoSolution; }