public static double CalculateLagrangeRemainder(Expr function, string variableName, int n, FloatingPoint x, FloatingPoint x0) { var results = new List <double>(); var length = GetLength(Math.Min(x.RealValue, x0.RealValue), Math.Max(x.RealValue, x0.RealValue)); var increment = length / 10; double currentIncrement = Math.Min(x.RealValue, x0.RealValue); var factorial = (FloatingPoint)SpecialFunctions.Factorial(n + 1); while (currentIncrement < Math.Max(x.RealValue, x0.RealValue)) { var variable = new Dictionary <string, FloatingPoint> { { variableName, currentIncrement } }; var derivativeResult = function.CalculateFunctionAtDerivative(variable, Expr.Variable(variableName), n + 1); var result = derivativeResult.RealValue / factorial.RealValue * Math.Pow(Math.Abs(x.RealValue - x0.RealValue), n + 1); results.Add(Math.Abs(result)); currentIncrement += increment; } var variableMax = new Dictionary <string, FloatingPoint> { { variableName, Math.Max(x.RealValue, x0.RealValue) } }; var derivativeResultMax = function.CalculateFunctionAtDerivative(variableMax, Expr.Variable(variableName), n + 1); var resultMax = derivativeResultMax.RealValue / factorial.RealValue * Math.Pow(Math.Abs(x.RealValue - x0.RealValue), n + 1); results.Add(Math.Abs(resultMax)); return(results.Max(x => x)); }